<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.tenzir.com/changelog/tenzir-test</id>
    <title>Tenzir Test Changelog</title>
    <updated>2026-05-13T00:00:00.000Z</updated>
    <generator>Tenzir Changelog</generator>
    <author>
        <name>Tenzir</name>
        <uri>https://tenzir.com</uri>
    </author>
    <link rel="alternate" href="https://docs.tenzir.com/changelog/tenzir-test"/>
    <link rel="self" href="https://docs.tenzir.com/changelog/tenzir-test.xml"/>
    <subtitle>Release notes and changelog for Tenzir Test</subtitle>
    <icon>https://docs.tenzir.com/favicon.svg</icon>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.10.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-10-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-10-1"/>
        <updated>2026-05-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Project fixtures can now declare their Python package dependencies inline with PEP 723 metadata. tenzir-test installs those dependencies before loading fixtures, so regular test runs and fixture mode work for projects with self-contained fixture modules.]]></summary>
        <content type="html"><![CDATA[<p>Project fixtures can now declare their Python package dependencies inline with PEP 723 metadata. tenzir-test installs those dependencies before loading fixtures, so regular test runs and fixture mode work for projects with self-contained fixture modules.</p>

<h2>Bug Fixes</h2>

<h3>Project fixture inline dependencies</h3>
<p><small>May 13, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/47">#47</a></small></p>
<p>Project fixtures can now declare Python package dependencies inline with PEP
723 metadata:</p>
<pre><code class="language-python"># /// script
# dependencies = ["boto3"]
# ///
</code></pre>
<p><code>tenzir-test</code> installs these dependencies with <code>uv</code> before importing fixture
modules, so fixtures used during regular test runs and <code>tenzir-test --fixture</code>
can manage their own Python package requirements.</p>
]]></content>
        <published>2026-05-13T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.10.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-10-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-10-0"/>
        <updated>2026-05-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[tenzir-test now lets users select scenarios by requested fixture name, making it easier to run only tests that depend on resources such as nodes or Docker Compose. This release also requires Python 3.13 or newer.]]></summary>
        <content type="html"><![CDATA[<p>tenzir-test now lets users select scenarios by requested fixture name, making it easier to run only tests that depend on resources such as nodes or Docker Compose. This release also requires Python 3.13 or newer.</p>

<h2>Features</h2>

<h3>Fixture name test selection</h3>
<p><small>May 12, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Select tests by requested fixture name with the new <code>--fixture-name</code> option:</p>
<pre><code class="language-sh">tenzir-test --fixture-name node
tenzir-test tests/alerts --match kafka --fixture-name docker-compose
</code></pre>
<p><code>--fixture-name</code> can be repeated and combines with <code>--fixture-tag</code> using OR
semantics before intersecting with positional test paths and <code>--match</code>.
Fixture selectors are long-only; the previous <code>-F</code> alias for <code>--fixture-tag</code>
has been removed before the CLI shape settles.</p>

<h2>Changes</h2>

<h3>Python 3.13 minimum requirement</h3>
<p><small>May 12, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/44">#44</a></small></p>
<p><code>tenzir-test</code> now requires Python 3.13 or newer.</p>
<p>Users on Python 3.12 need to upgrade their interpreter before installing or running the CLI:</p>
<pre><code class="language-sh">uvx --python 3.13 tenzir-test --help
</code></pre>
]]></content>
        <published>2026-05-12T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.9.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-9-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-9-0"/>
        <updated>2026-05-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release lets users select tests by fixture tag with the new --fixture-tag option. It makes it easier to run focused subsets such as container-backed or Docker Compose tests without naming every test path.]]></summary>
        <content type="html"><![CDATA[<p>This release lets users select tests by fixture tag with the new --fixture-tag option. It makes it easier to run focused subsets such as container-backed or Docker Compose tests without naming every test path.</p>

<h2>Features</h2>

<h3>Fixture tag test selection</h3>
<p><small>May 11, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/42">#42</a></small></p>
<p>Select tests by fixture tag with the new <code>--fixture-tag</code> option:</p>
<pre><code class="language-sh">tenzir-test --fixture-tag container
tenzir-test --fixture-tag docker-compose
</code></pre>
<p>Fixture tags are cumulative and can be repeated. The selector intersects with positional test paths and <code>--match</code> patterns, so you can narrow a directory to container-backed tests or run only tests that request the built-in Docker Compose fixture.</p>
<p>Fixtures that use the shared container runtime helpers inherit the <code>container</code> tag automatically. Custom fixtures can pass explicit tags at registration time when they use their own abstraction.</p>
]]></content>
        <published>2026-05-11T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.8.4]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-8-4</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-8-4"/>
        <updated>2026-05-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The test harness now detects the installed Tenzir version across current and upcoming Tenzir releases. This keeps startup and version checks working during the transition to the next Tenzir release series.]]></summary>
        <content type="html"><![CDATA[<p>The test harness now detects the installed Tenzir version across current and upcoming Tenzir releases. This keeps startup and version checks working during the transition to the next Tenzir release series.</p>

<h2>Bug Fixes</h2>

<h3>Version checks with current TQL pipelines</h3>
<p><small>May 9, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/41">#41</a></small></p>
<p>The test harness can detect the installed Tenzir version across current and upcoming Tenzir releases. This keeps startup/version checks working during the transition to the next Tenzir release series.</p>
]]></content>
        <published>2026-05-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.8.3]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-8-3</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-8-3"/>
        <updated>2026-05-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release makes hook debug diagnostics consistent with the rest of the harness debug trace, so users get uniform output when diagnosing hook behavior.]]></summary>
        <content type="html"><![CDATA[<p>This release makes hook debug diagnostics consistent with the rest of the harness debug trace, so users get uniform output when diagnosing hook behavior.</p>

<h2>Bug Fixes</h2>

<h3>Consistent hook debug diagnostics</h3>
<p><small>May 5, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/40">#40</a></small></p>
<p>Hook diagnostics emitted with <code>--debug</code> now use the same formatting as the rest of the harness debug trace. Previously, hook invocation messages used ad-hoc <code>debug:</code> lines, which made debug output inconsistent.</p>
]]></content>
        <published>2026-05-05T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.8.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-8-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-8-2"/>
        <updated>2026-04-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes suite-level requirement checks so they apply consistently across every test runner. Mixed TQL, shell, Python, and custom test suites now evaluate required Tenzir operators independently of runner order.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes suite-level requirement checks so they apply consistently across every test runner. Mixed TQL, shell, Python, and custom test suites now evaluate required Tenzir operators independently of runner order.</p>

<h2>Bug Fixes</h2>

<h3>Runner-independent suite requirements</h3>
<p><small>Apr 29, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/39">#39</a></small></p>
<p>Suite-level <code>requires.operators</code> checks now apply consistently to every test runner. Mixed suites that combine TQL, shell, Python, or custom tests no longer depend on the first runner type to decide whether required Tenzir operators are available.</p>
]]></content>
        <published>2026-04-29T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.8.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-8-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-8-1"/>
        <updated>2026-04-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves suite fixture failure handling so setup and teardown errors are reported as regular test failures. The harness now continues running independent queued tests instead of aborting with a Python traceback.]]></summary>
        <content type="html"><![CDATA[<p>This release improves suite fixture failure handling so setup and teardown errors are reported as regular test failures. The harness now continues running independent queued tests instead of aborting with a Python traceback.</p>

<h2>Bug Fixes</h2>

<h3>Suite fixture failure reporting</h3>
<p><small>Apr 29, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/38">#38</a></small></p>
<p>Suite-scoped fixture setup and teardown failures now appear as regular test failures instead of aborting the entire run with a Python traceback.</p>
<p>This lets the harness continue with independent queued tests after a fixture assertion or cleanup error.</p>
]]></content>
        <published>2026-04-29T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.8.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-8-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-8-0"/>
        <updated>2026-04-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds project lifecycle hooks that let projects prepare their environment before tests run. Use hooks to select local Tenzir binaries, configure project-scoped environment variables, and collect diagnostics without custom wrapper scripts.]]></summary>
        <content type="html"><![CDATA[<p>This release adds project lifecycle hooks that let projects prepare their environment before tests run. Use hooks to select local Tenzir binaries, configure project-scoped environment variables, and collect diagnostics without custom wrapper scripts.</p>

<h2>Features</h2>

<h3>Project lifecycle hooks</h3>
<p><small>Apr 27, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/36">#36</a></small></p>
<p>Projects can now register Python hooks that run at stable <code>tenzir-test</code> lifecycle points, including before settings discovery:</p>
<pre><code class="language-python">from tenzir_test import hooks

@hooks.startup
def use_local_build(ctx):
    ctx.path.insert(0, str(ctx.root / "build" / "bin"))
    ctx.env["TENZIR_BINARY"] = str(ctx.root / "build" / "bin" / "tenzir")
    ctx.env["TENZIR_NODE_BINARY"] = str(ctx.root / "build" / "bin" / "tenzir-node")
</code></pre>
<p>This makes it possible to select local Tenzir binaries, prepare project-scoped environment variables, and collect diagnostics for failed tests without wrapping the test command in custom shell scripts. Use <code>--no-hooks</code> or <code>TENZIR_TEST_DISABLE_HOOKS=1</code> to bypass hooks when debugging.</p>
]]></content>
        <published>2026-04-28T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.7]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-7</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-7"/>
        <updated>2026-04-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tests can now skip only the cases that require an unavailable optional fixture instead of skipping an entire suite. This keeps unrelated tests running and makes parameterized fixture setups more reliable.]]></summary>
        <content type="html"><![CDATA[<p>Tests can now skip only the cases that require an unavailable optional fixture instead of skipping an entire suite. This keeps unrelated tests running and makes parameterized fixture setups more reliable.</p>

<h2>Bug Fixes</h2>

<h3>Per-test fixture-unavailable skips</h3>
<p><small>Apr 22, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/35">#35</a></small></p>
<p>The test harness now honors <code>skip: {on: fixture-unavailable}</code> for fixtures that are selected by individual tests:</p>
<pre><code class="language-yaml">skip:
  on: fixture-unavailable
fixtures:
  - optional-service
</code></pre>
<p>This lets parameterized per-test fixtures skip only the tests that need the unavailable service. Suite fixtures still require the opt-in in directory-level <code>test.yaml</code>, so one test's frontmatter cannot control the whole suite.</p>
]]></content>
        <published>2026-04-22T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.6]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-6</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-6"/>
        <updated>2026-04-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes misleading aggregate test summary percentages in the CLI. Runs with a small number of failures now report non-perfect pass and fail rates, so mixed outcomes no longer appear as `100%` passed and `0%` failed.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes misleading aggregate test summary percentages in the CLI. Runs with a small number of failures now report non-perfect pass and fail rates, so mixed outcomes no longer appear as <code>100%</code> passed and <code>0%</code> failed.</p>

<h2>Bug Fixes</h2>

<h3>Accurate aggregate pass and fail percentages</h3>
<p><small>Apr 16, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The final aggregate summary now reports non-perfect pass and fail percentages whenever at least one executed test fails. Previously, rounding could show <code>100%</code> passed and <code>0%</code> failed for runs with a small number of failures, even though the overall result was not a full success.</p>
<p>For example, a run like <code>586 passed / 1 failed / 152 skipped</code> now renders the executed-test percentages as <code>99%</code> passed and <code>1%</code> failed. This makes mixed outcomes easier to spot at a glance in the CLI output.</p>
]]></content>
        <published>2026-04-16T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.5]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-5</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-5"/>
        <updated>2026-03-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release establishes the correct v1.7.5 version tag. A double-bump bug in the release automation caused the v1.7.4 git tag to point to a commit where pyproject.toml already read 1.7.5, so 1.7.4 was never published to PyPI and the git tag was misaligned with the actual package version. The automation has been fixed by removing a redundant post-create version bump that became a double-bump once tenzir-ship v1.3.0 added automatic version-file updates.]]></summary>
        <content type="html"><![CDATA[<p>This release establishes the correct v1.7.5 version tag. A double-bump bug in the release automation caused the v1.7.4 git tag to point to a commit where pyproject.toml already read 1.7.5, so 1.7.4 was never published to PyPI and the git tag was misaligned with the actual package version. The automation has been fixed by removing a redundant post-create version bump that became a double-bump once tenzir-ship v1.3.0 added automatic version-file updates.</p>
]]></content>
        <published>2026-03-13T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.4]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-4</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-4"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes how skipped tests interact with baseline files. Existing baselines now stay untouched when you skip tests, which prevents unrelated baseline churn and avoids false failures when you toggle skip conditions.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes how skipped tests interact with baseline files. Existing baselines now stay untouched when you skip tests, which prevents unrelated baseline churn and avoids false failures when you toggle skip conditions.</p>

<h2>Bug Fixes</h2>

<h3>Skipped tests preserve existing baseline files</h3>
<p><small>Mar 10, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Skipping a test no longer modifies its baseline file. Previously, running
with <code>--update</code> would overwrite the baseline of a skipped test with an empty
file, and running without <code>--update</code> would fail if the baseline was non-empty.
Skipped tests now leave existing baselines untouched, so toggling a skip
condition no longer causes unrelated baseline churn.</p>
]]></content>
        <published>2026-03-11T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.3]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-3</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-3"/>
        <updated>2026-02-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves parallel suite scheduling reliability and adds correctness guards via suite.min_jobs in test.yaml.]]></summary>
        <content type="html"><![CDATA[<p>This release improves parallel suite scheduling reliability and adds correctness guards via suite.min_jobs in test.yaml.</p>

<h2>Bug Fixes</h2>

<h3>Improve parallel suite scheduling and correctness checks</h3>
<p><small>Feb 26, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Parallel suites are now scheduled more reliably when running with <code>--jobs > 1</code>, so interdependent tests (for example publisher/subscriber pairs) start together sooner instead of being delayed behind large backlogs of unrelated tests.</p>
<p>This update also adds an explicit correctness guard for parallel suites: you can set <code>suite.min_jobs</code> in <code>test.yaml</code> to declare the minimum job count required for valid execution. The run now fails fast if <code>--jobs</code> is lower than <code>suite.min_jobs</code>, and it also fails hard when a parallel suite cannot reserve at least <code>min_jobs</code> workers at runtime (for example under slot contention), instead of proceeding under-provisioned.</p>
<p>In addition, the harness now warns when a parallel suite has more tests than available jobs, making it easier to spot cases where effective suite parallelism is capped by worker count.</p>
]]></content>
        <published>2026-02-27T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-2"/>
        <updated>2026-02-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes enum serialization errors when Python fixture tests use configuration values like mode: sequential in test.yaml.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes enum serialization errors when Python fixture tests use configuration values like mode: sequential in test.yaml.</p>

<h2>Bug Fixes</h2>

<h3>Enum serialization in Python fixture config</h3>
<p><small>Feb 25, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/32">#32</a></small></p>
<p>Python fixture tests could fail with serialization errors when the test
configuration included enum values like <code>mode: sequential</code> in <code>test.yaml</code>.
These values are now properly converted to strings before being passed to
test scripts.</p>
]]></content>
        <published>2026-02-25T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-1"/>
        <updated>2026-02-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds parallel suite execution and fixes several bugs, including clean Ctrl+C handling, consistent default fixture options, and reliable shell runner defaults for .sh test files.]]></summary>
        <content type="html"><![CDATA[<p>This release adds parallel suite execution and fixes several bugs, including clean Ctrl+C handling, consistent default fixture options, and reliable shell runner defaults for .sh test files.</p>

<h2>Features</h2>

<h3>Parallel suite execution</h3>
<p><small>Feb 24, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/29">#29</a></small></p>
<p>Test suites can now execute their members in parallel by specifying <code>mode: parallel</code> in the suite configuration. By default, suites continue to run tests sequentially for stability and predictability.</p>
<p>To enable parallel execution, set <code>mode: parallel</code> in the <code>test.yaml</code> file alongside the <code>suite</code> configuration:</p>
<pre><code class="language-yaml">suite:
  name: my-suite
  mode: parallel
fixtures:
  - node
</code></pre>
<p>Parallel suite execution is useful when tests within a suite are independent and can safely run concurrently. All suite members share the same fixtures and execute within the same fixture lifecycle, while test execution itself happens on separate threads. The suite thread pool is bounded by <code>--jobs</code>, so suite-level concurrency stays within the configured worker budget and does not scale unbounded with suite size.</p>
<p>Suite-level constraints like timeouts, fixture requirements, and capability checks still apply uniformly across all members, whether running sequentially or in parallel.</p>

<h2>Bug Fixes</h2>

<h3>Avoid Python backtraces on Ctrl+C interrupts</h3>
<p><small>Feb 25, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/31">#31</a></small></p>
<p>Interrupting test runs with Ctrl+C now exits cleanly without leaking Python tracebacks from subprocess or fixture startup/teardown paths. Interrupt-shaped errors (including nested causes with signal-style return codes such as 130) are treated as graceful cancellation so the CLI reports interrupted tests instead of crashing.</p>

<h3>Shell test files default to shell runner</h3>
<p><small>Feb 24, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/30">#30</a></small></p>
<p>Shell test files (<code>.sh</code>) now always default to the "shell" runner, even when a directory-level <code>test.yaml</code> file specifies a different runner (for example, <code>runner: tenzir</code>). This makes shell scripts work reliably in mixed-runner directories without requiring explicit <code>runner:</code> frontmatter in each file. Explicit <code>runner:</code> declarations in test file frontmatter still take precedence and can override this behavior if needed.</p>

<h3>Fix default fixture options in manual fixture control</h3>
<p><small>Feb 24, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Manual fixture control now behaves consistently for fixtures that declare dataclass
options.</p>
<p>Previously, starting a fixture with <code>acquire_fixture(...)</code> could fail when no
explicit options were provided, even if the fixture defined defaults.</p>
<p>With this fix, <code>current_options(...)</code> returns default typed options in the
manual fixture-control path, so fixtures started manually and fixtures started
through normal test activation behave the same way.</p>
]]></content>
        <published>2026-02-25T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-0"/>
        <updated>2026-02-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds suite-level capability requirements, letting test suites declare required operators and skip gracefully when those capabilities are unavailable in the target build.]]></summary>
        <content type="html"><![CDATA[<p>This release adds suite-level capability requirements, letting test suites declare required operators and skip gracefully when those capabilities are unavailable in the target build.</p>

<h2>Features</h2>

<h3>Suite-level capability requirements and conditional skipping</h3>
<p><small>Feb 22, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/28">#28</a></small></p>
<p>Test suites can now declare operator dependencies with a <code>requires</code> configuration key in <code>test.yaml</code>. When a required operator is unavailable in the target Tenzir build, you can gracefully skip the suite by pairing <code>requires</code> with <code>skip: {on: capability-unavailable}</code>.</p>
<p>The <code>skip.on</code> key now accepts either a single condition as a string or a list of conditions, letting you skip on either <code>fixture-unavailable</code> or <code>capability-unavailable</code> (or both). When a capability is unavailable and the suite doesn't opt into skipping, the test run fails with a clear error message listing the missing operators.</p>
<p>Example configuration in <code>test.yaml</code>:</p>
<pre><code class="language-yaml">requires:
  operators: [from_gcs, to_s3]
skip:
  on: capability-unavailable
  reason: requires from_gcs and to_s3 operators
</code></pre>
<p>This ensures test suites targeting specific capabilities only run when those capabilities are present, improving test reliability in heterogeneous build environments.</p>
]]></content>
        <published>2026-02-22T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.6.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-6-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-6-0"/>
        <updated>2026-02-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds fixture assertion hooks that enable post-test validation of side effects while fixtures remain active. Assertion results are tracked separately in the run summary.]]></summary>
        <content type="html"><![CDATA[<p>This release adds fixture assertion hooks that enable post-test validation of side effects while fixtures remain active. Assertion results are tracked separately in the run summary.</p>

<h2>Features</h2>

<h3>Fixture assertion hooks for post-test validation</h3>
<p><small>Feb 18, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/27">#27</a></small></p>
<p>Fixtures can now define assertion hooks that run after test execution completes while fixtures remain active. Define assertions using the <code>assertions</code> parameter with a frozen dataclass type, then pass fixture-specific assertion payloads under <code>assertions.fixtures.&#x3C;name></code> in test frontmatter. The framework automatically invokes the <code>assert_test</code> hook with assertion data before tearing down fixtures, letting you validate side effects like HTTP requests or log output.</p>
<p>Example usage with an HTTP fixture:</p>
<pre><code class="language-yaml">fixtures: [http]
assertions:
  fixtures:
    http:
      count: 1
      method: POST
      path: /api/endpoint
      body: '{"key":"value"}'
</code></pre>
<p>The HTTP fixture receives the typed assertion payload and validates that the expected request was received. Payload structure is fixture-defined, so fixtures can choose flat fields or nested schemas as needed.</p>
<p>Assertion checks are tracked separately from test counts in the run summary as pass/fail check metrics, so fixture-level validations are visible without changing total test counts.</p>
]]></content>
        <published>2026-02-19T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.5.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-5-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-5-1"/>
        <updated>2026-02-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves error handling by showing clean messages for unavailable fixtures and avoids unnecessary fixture initialization for fully skipped test suites.]]></summary>
        <content type="html"><![CDATA[<p>This release improves error handling by showing clean messages for unavailable fixtures and avoids unnecessary fixture initialization for fully skipped test suites.</p>

<h2>Bug Fixes</h2>

<h3>Skip fixture initialization for suites with all static skips</h3>
<p><small>Feb 16, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/26">#26</a></small></p>
<p>The test harness no longer initializes fixtures for suites where all tests are statically skipped. Previously, fixtures were activated even when no tests would run, causing unnecessary startup overhead and potential errors.</p>

<h3>Clean error messages for unavailable fixtures</h3>
<p><small>Feb 16, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/25">#25</a></small></p>
<p>When a fixture becomes unavailable during test execution, the test harness now provides a clean error message instead of a Python traceback.</p>
]]></content>
        <published>2026-02-16T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.5.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-5-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-5-0"/>
        <updated>2026-02-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds fine-grained controls for running skipped tests, including a new --run-skipped-reason flag with substring and glob matching semantics.]]></summary>
        <content type="html"><![CDATA[<p>This release adds fine-grained controls for running skipped tests, including a new --run-skipped-reason flag with substring and glob matching semantics.</p>

<h2>Features</h2>

<h3>Add fine-grained run-skipped selectors</h3>
<p><small>Feb 15, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/23">#23</a>, <a href="https://github.com/tenzir/test/pull/24">#24</a></small></p>
<p><code>tenzir-test</code> now supports both coarse and fine-grained controls for running skipped tests.</p>
<p>Use <code>--run-skipped</code> as a sledgehammer, or <code>--run-skipped-reason</code> with the same matching semantics as <code>--match</code> (bare substring or glob):</p>
<pre><code class="language-sh">tenzir-test --run-skipped
tenzir-test --run-skipped-reason 'maintenance'
tenzir-test --run-skipped-reason '*docker*'
</code></pre>
<p>If both options are provided, <code>--run-skipped</code> takes precedence.</p>
]]></content>
        <published>2026-02-16T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.4.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-4-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-4-0"/>
        <updated>2026-02-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release introduces a standalone fixture mode for starting fixtures without running tests, adds a built-in docker-compose fixture with structured options, and provides shared container runtime helpers for writing custom fixtures.]]></summary>
        <content type="html"><![CDATA[<p>This release introduces a standalone fixture mode for starting fixtures without running tests, adds a built-in docker-compose fixture with structured options, and provides shared container runtime helpers for writing custom fixtures.</p>

<h2>Features</h2>

<h3>Shared container runtime helpers for fixtures</h3>
<p><small>Feb 15, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/22">#22</a></small></p>
<p>Writing container-based fixtures no longer requires duplicating boilerplate for
runtime detection, process management, and readiness polling.</p>
<p>The new <code>container_runtime</code> module provides reusable building blocks that handle
the common plumbing: detecting whether Docker or Podman is available, launching
containers in detached mode, polling for service readiness, and tearing down
cleanly. Custom fixtures can import these helpers and focus on their
service-specific logic instead.</p>
<p>The built-in <code>docker-compose</code> fixture and the example project now use these
shared helpers internally.</p>

<h3>Native docker-compose fixture with structured options</h3>
<p><small>Feb 14, 2026 · <a href="https://github.com/mavam">@mavam</a> · <a href="https://github.com/tenzir/test/pull/21">#21</a></small></p>
<p>Adds a built-in <code>docker-compose</code> fixture that starts and tears down Docker Compose services from structured fixture options.</p>
<p>The fixture validates Docker Compose availability, waits for service readiness (health-check first, running-state fallback), and exports deterministic service environment variables (including host-published ports).</p>

<h3>Standalone fixture mode with --fixture CLI option</h3>
<p><small>Feb 14, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/20">#20</a></small></p>
<p>You can now start fixtures in foreground mode without running any tests by using the <code>--fixture</code> option. This lets you provision services (like a database or message broker) and use them in your workflow.</p>
<p>Specify fixture names or YAML-style configuration:</p>
<pre><code class="language-sh">uvx tenzir-test --fixture mysql
uvx tenzir-test --fixture 'kafka: {port: 9092}' --debug
</code></pre>
<p>The harness prints fixture-provided environment variables like <code>HOST</code>, <code>PORT</code>, and <code>DATABASE</code>, then keeps services running until you press <code>Ctrl+C</code>. You can repeat <code>--fixture</code> to activate multiple fixtures. The option is mutually exclusive with positional TEST arguments.</p>
]]></content>
        <published>2026-02-15T00:00:00.000Z</published>
    </entry>
</feed>