<?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-03-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.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>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.3.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-3-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-3-2"/>
        <updated>2026-02-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves the readability of configuration override log messages by using relative paths and human-friendly formatting.]]></summary>
        <content type="html"><![CDATA[<p>This release improves the readability of configuration override log messages by using relative paths and human-friendly formatting.</p>

<h2>Bug Fixes</h2>

<h3>Improved config override log readability</h3>
<p><small>Feb 13, 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/19">#19</a></small></p>
<p>Configuration override log messages now use relative paths and human-friendly formatting instead of absolute paths and raw Python repr output, making debug output easier to read.</p>
]]></content>
        <published>2026-02-13T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.3.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-3-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-3-1"/>
        <updated>2026-02-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds support for nested dataclass hierarchies in fixture options, enabling multi-level structured configurations in test frontmatter.]]></summary>
        <content type="html"><![CDATA[<p>This release adds support for nested dataclass hierarchies in fixture options, enabling multi-level structured configurations in test frontmatter.</p>

<h2>Features</h2>

<h3>Nested dataclass options for fixtures</h3>
<p><small>Feb 11, 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/18">#18</a></small></p>
<p>Fixture options now support nested dataclass hierarchies, allowing you to structure complex configurations with multiple levels of organization.</p>
<p>Previously, fixture options were limited to flat fields. Now you can declare nested dataclasses as field types, and tests can pass deeply structured options through frontmatter:</p>
<pre><code class="language-yaml">fixtures:
  - node:
      server:
        message:
          greeting: world
</code></pre>
<p>Type safety is preserved across all nesting levels. Optional nested fields (declared with <code>Optional[T]</code> or <code>T | None</code>) are supported, and omitted nested records use their default values. The example server fixture demonstrates this capability with a <code>message.greeting</code> field that flows through to environment variables.</p>
]]></content>
        <published>2026-02-11T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.3.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-3-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-3-0"/>
        <updated>2026-02-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds structured configuration options for fixtures, letting tests
pass typed parameters through YAML frontmatter using frozen dataclasses.]]></summary>
        <content type="html"><![CDATA[<p>This release adds structured configuration options for fixtures, letting tests
pass typed parameters through YAML frontmatter using frozen dataclasses.</p>

<h2>Features</h2>

<h3>Structured options for fixtures</h3>
<p><small>Feb 10, 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/17">#17</a></small></p>
<p>Fixtures can now receive typed configuration options passed from test YAML files.</p>
<p>Declare options on a fixture with <code>@fixture(options=MyDataclass)</code>, where <code>MyDataclass</code> is a frozen dataclass. Tests can then provide structured options in their frontmatter using either compact syntax (for simple cases) or expanded syntax (for clarity):</p>
<pre><code class="language-yaml">fixtures:
  - node:
      tls: true
      port: 8443
  - http:
      port: 9090
</code></pre>
<p>The <code>@fixture</code> decorator validates that option keys match the dataclass fields, and the fixture retrieves its typed instance using <code>current_options(name)</code>. When options aren't provided, fixtures receive a default-constructed instance of their options class.</p>
<p>The feature maintains backward compatibility with the existing <code>fixtures: [node, http]</code> syntax for fixtures without options.</p>
]]></content>
        <published>2026-02-10T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.2.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-2-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-2-2"/>
        <updated>2026-02-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes a serialization bug where Python fixture tests with `skip`
configurations in `test.yaml` failed with a JSON serialization error.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes a serialization bug where Python fixture tests with <code>skip</code>
configurations in <code>test.yaml</code> failed with a JSON serialization error.</p>

<h2>Bug Fixes</h2>

<h3>Dataclass serialization in Python fixture configurations</h3>
<p><small>Feb 9, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>Python fixture tests that use <code>skip</code> in their <code>test.yaml</code> no longer fail with
<code>Object of type SkipConfig is not JSON serializable</code>.</p>
]]></content>
        <published>2026-02-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.2.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-2-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-2-1"/>
        <updated>2026-02-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This patch release improves the `-m`/`--match` flag with automatic substring matching and centralizes skip handling in the engine for more consistent test reporting.]]></summary>
        <content type="html"><![CDATA[<p>This patch release improves the <code>-m</code>/<code>--match</code> flag with automatic substring matching and centralizes skip handling in the engine for more consistent test reporting.</p>

<h2>Changes</h2>

<h3>Simpler substring matching for -m/--match flag</h3>
<p><small>Feb 6, 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/16">#16</a></small></p>
<p>The <code>-m</code>/<code>--match</code> flag now treats bare strings as substring matches automatically.</p>
<p>Previously, you had to use glob syntax like <code>tenzir-test -m '*mysql*'</code> to match tests by name. Now you can write <code>tenzir-test -m mysql</code> and it automatically matches any test path containing "mysql". This makes the common case of substring matching simpler and more intuitive.</p>
<p>Patterns that contain glob metacharacters (<code>*</code>, <code>?</code>, <code>[</code>) still use fnmatch syntax as before, so existing patterns with wildcards continue to work exactly as they did. This change is fully backwards-compatible.</p>

<h3>Centralize skip-handling logic in engine</h3>
<p><small>Feb 6, 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/15">#15</a></small></p>
<p>Skip handling now lives in the engine instead of individual runners. Skipped
tests are recorded consistently in summary stats regardless of which runner
executes them, so skip counts and paths in the test report are always accurate.</p>
<p>Previously, each runner duplicated the same skip-config parsing, which could
lead to inconsistent skip tracking. Custom runners no longer need to implement
skip logic because the engine evaluates the <code>skip</code> configuration before
dispatching to any runner.</p>
]]></content>
        <published>2026-02-06T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.2.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-2-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-2-0"/>
        <updated>2026-02-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds support for selecting tests by name using glob patterns via the new `-m`/`--match` CLI option.]]></summary>
        <content type="html"><![CDATA[<p>This release adds support for selecting tests by name using glob patterns via the new <code>-m</code>/<code>--match</code> CLI option.</p>

<h2>Features</h2>

<h3>Test selection by name pattern matching</h3>
<p><small>Feb 6, 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/13">#13</a></small></p>
<p>Select tests by relative path using the new <code>-m</code>/<code>--match</code> option with fnmatch glob patterns. You can repeat the option to match multiple patterns, and tests matching any pattern are selected. When you combine TEST paths with <code>-m</code> patterns, the framework runs only tests matching both (intersection). If a matched test belongs to a suite configured via <code>test.yaml</code>, all tests in that suite are included automatically. Empty or whitespace-only patterns are silently ignored.</p>
<p>Example: <code>tenzir-test -m '*context*' -m '*create*'</code> runs all tests whose paths contain "context" or "create" anywhere in the name.</p>
]]></content>
        <published>2026-02-06T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.1.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-1-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-1-1"/>
        <updated>2026-02-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves the CLI help text with usage examples and a link to the documentation.]]></summary>
        <content type="html"><![CDATA[<p>This release improves the CLI help text with usage examples and a link to the documentation.</p>

<h2>Changes</h2>

<h3>Improved CLI help with examples and documentation</h3>
<p><small>Feb 2, 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/12">#12</a></small></p>
<p>The help text for the <code>tenzir-test</code> command now provides more context and guidance.</p>
<p>The command description now explains the baseline comparison behavior and shows how to regenerate baselines with the <code>--update</code> flag.</p>
]]></content>
        <published>2026-02-06T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.1.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-1-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-1-0"/>
        <updated>2026-01-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds stdin file support for piping data directly to tests, and improves satellite project display in project listings.]]></summary>
        <content type="html"><![CDATA[<p>This release adds stdin file support for piping data directly to tests, and improves satellite project display in project listings.</p>

<h2>Features</h2>

<h3>Stdin file support for piping data to tests</h3>
<p><small>Jan 31, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The test harness now supports <code>.stdin</code> files for piping data directly to test processes.</p>
<p>Place a <code>.stdin</code> file next to any test to have its contents automatically piped to the subprocess stdin. The harness also sets the <code>TENZIR_STDIN</code> environment variable with the file path. This is particularly useful for TQL tests where you can start a pipeline with a parser directly:</p>
<pre><code class="language-tql">read_csv
where count > 10
</code></pre>
<p>Instead of using <code>.input</code> files with <code>from_file env("TENZIR_INPUT")</code>. Both approaches remain valid—choose whichever fits your test better.</p>
<p>Shell and Python tests can also read from stdin or access <code>TENZIR_STDIN</code> when needed. Custom runners can use <code>get_stdin_content(env)</code> to read the file contents and pass them via the <code>stdin_data</code> parameter to <code>run_subprocess()</code>.</p>

<h2>Changes</h2>

<h3>Satellite projects show relative paths in project listing</h3>
<p><small>Jan 27, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>When listing projects in the execution plan, satellite projects now display their path relative to the root project instead of just their directory name. This makes satellite projects with identical directory names distinguishable. Additionally, project markers have been refined: root projects use a filled marker (● for packages, ■ for regular projects), while satellite projects use an empty marker (○ for packages, □ for regular projects).</p>
]]></content>
        <published>2026-01-31T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.0.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-0-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-0-2"/>
        <updated>2026-01-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves the debugging experience by making the `--debug` flag automatically enable verbose output, so you see all test results when diagnosing failures.]]></summary>
        <content type="html"><![CDATA[<p>This release improves the debugging experience by making the <code>--debug</code> flag automatically enable verbose output, so you see all test results when diagnosing failures.</p>

<h2>Changes</h2>

<h3>Debug mode implies verbose output</h3>
<p><small>Jan 26, 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/9">#9</a></small></p>
<p>The <code>--debug</code> flag (or <code>TENZIR_TEST_DEBUG=1</code> environment variable) now automatically enables verbose output. When debugging test failures, you now see all test results (pass/skip/fail) instead of only failures, making it easier to diagnose issues. This provides more context without requiring users to pass both <code>--debug</code> and <code>--verbose</code> flags separately.</p>
]]></content>
        <published>2026-01-27T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.0.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-0-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-0-1"/>
        <updated>2026-01-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes an issue with diff tests failing when using multi-word Tenzir commands.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes an issue with diff tests failing when using multi-word Tenzir commands.</p>

<h2>Bug Fixes</h2>

<h3>Tuple unpacking in diff runner for multi-word commands</h3>
<p><small>Jan 23, 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/8">#8</a></small></p>
<p>Fixed an error that occurred when running diff tests with multi-word Tenzir commands like <code>uvx tenzir</code>.</p>
]]></content>
        <published>2026-01-23T00:00:00.000Z</published>
    </entry>
</feed>