NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #2909 most downloaded on crates.io
A next-generation test runner for Rust.
Last release 16 days ago
21 Sep 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
2 versions withdrawn
withdrawn after publishing
5 years old
170 releases · first in 2022
One column per quarter.
You can now mark leaky tests as failed rather than passed. The default is still to treat them as passed. For more, see *Marking leaky tests as failure
You can now mark leaky tests as failed rather than passed. The default is still to treat them as passed. For more, see Marking leaky tests as failures.
Several display formatting improvements with a focus on visual clarity and reduced UI clutter:
--no-output-indent option, or by setting NEXTEST_NO_OUTPUT_INDENT=1 in the environment.(test aborted with signal 6: SIGABRT).Fixed an occasional hang on Linux with libtest JSON output. For more details, see #2316.
Nothing published for this version
Nothing published for this version
Official binaries are now available for aarch64-pc-windows-msvc (Windows on ARM). Installation instructions are available at _Pre-built binaries_ unde
Official binaries are now available for aarch64-pc-windows-msvc (Windows on ARM). Installation instructions are available at Pre-built binaries under Other platforms.
On Unix platforms, nextest will no longer attempt to set up input handling if it isn't in the foreground process group of the controlling terminal. This addresses a hang with commands like watchexec: these commands forward standard input to nextest (so is_terminal returns true), but do not give nextest full terminal control.
There are still some reports of watchexec hangs even with this change; we'll track them down and fix bugs as necessary.
Nothing published for this version
If cargo metadata fails, print the command that failed to execute. This works around possibly-broken Cargo installations producing no output.
cargo metadata fails, print the command that failed to execute. This works around possibly-broken Cargo installations producing no output.--nff and --ff are aliases for --no-fail-fast and --fail-fast, respectively.
--nff and --ff are aliases for --no-fail-fast and --fail-fast, respectively.In filtersets, binary_id patterns that don't match any binary IDs in the workspace are now rejected. This is a small behavior change that is being treated as a bugfix to align with package, deps and rdeps behavior.
binary_id patterns are not rejected if they match any test binaries that are in the workspace, regardless of whether they're built or not. In the future, we may add a warning for binary ID patterns only matching binaries that aren't built, but this is not an error.
Nextest now supports assigning test priorities via configuration.
Tests are now assigned global and group *slot numbers*. These numbers are non-negative integers starting from 0 that are unique for the lifetime of th
Tests are now assigned global and group slot numbers. These numbers are non-negative integers starting from 0 that are unique for the lifetime of the test, but are reused after the test ends.
Global and group slot numbers can be accessed via the NEXTEST_TEST_GLOBAL_SLOT and NEXTEST_TEST_GROUP_SLOT environment variables, respectively. For more, see Slot numbers.
Test environments now have the NEXTEST_TEST_GROUP variable set to the test group they're in, or "@global" if the test is not in any groups.
Update rust-openssl for CVE-2025-24898.
To configure fail-fast behavior, max-fail can now be specified in configuration. For example, to fail after 5 tests:
[profile.default]
fail-fast = { max-fail = 5 }
fail-fast = true is the same as { max-fail = 1 }, and fail-fast = false is { max-fail = "all" }.
Thanks to Jayllyz for your first contribution!
Within tests and scripts, the NEXTEST_PROFILE environment variable is now always set to the current configuration profile. Previously, this would only happen if the profile was configured via NEXTEST_PROFILE, as a side effect of the environment being passed through.
The --max-fail and --no-tests options no longer require using an equals sign. For example, --max-fail 5 and --max-fail=5 now both work.
This was previously done to avoid confusion between test name filters and arguments. But we believe the new --no-tests default to fail sufficiently mitigates this downside, and uniformity across options is valuable.
rustc -vV to obtain the host target triple, rather than using the target the cargo-nextest binary was built for. This fixes behavior for runtime cross-compatible binaries, such as -linux-musl binaries running on -linux-gnu.std::env::set_var and remove_var at the beginning of tests.If nextest's keyboard input handler is enabled, pressing Enter now produces a summary line (e.g. Running [ 00:00:05] 131/297: 32 running, 131 passed,
Running [ 00:00:05] 131/297: 32 running, 131 passed, 1 skipped). This enables common use cases where Enter is pressed to mark a point in time.SIGINFO) is now supported as a way to query live status. Querying live status is also supported on BSDs with Ctrl-T, on any Unix via SIGUSR1, as well as by pressing the t key in interactive sessions.--target (and in particular, a custom target), it now fails rather than printing a warning and assuming the host platform. This is being treated as a bugfix because the previous behavior was incorrect.target_family predicates like cfg(unix).On Windows, if a Ctrl-C is received and running tests don't terminate within the grace period (default 10 seconds), they're now forcibly terminated vi
This is a substantial release with several new features. It's gone through a period of beta testing, but if you run into issues please [file a bug]!
This is a substantial release with several new features. It's gone through a period of beta testing, but if you run into issues please file a bug!
Test state can now be queried interactively, via any of the following means:
t in an interactive terminal.Ctrl-T, on macOS and other BSD-based platforms where the SIGINFO signal
is available and recognized by the terminal driver. (SIGINFO will be supported on
illumos once an upstream Tokio issue is fixed.)SIGUSR1 signal.This command shows a list of all tests currently running, along with their status, how long they've been running, and currently-captured standard output and standard error.
Processing the t key requires alterations to the terminal, which may lead to
issues in rare circumstances. To disable input key handling, pass in
--no-input-handler.
--max-fail runner optionThe new --max-fail option allows you to specify the maximum number of test
failures before nextest stops running tests. This is an extension of the
existing --fail-fast and --no-fail-fast options, and is meant to allow users
to strike a balance between running all tests and stopping early.
--fail-fast is equivalent to --max-fail=1.--no-fail-fast is equivalent to --max-fail=all.Configuration for --max-fail will be added in a future release (#1944).
Thanks to AJamesyD for your first contribution!
You can now pass in extra arguments to the test binary at runtime, via the
run-extra-args configuration option. In combination with a custom test harness
like libtest-mimic, this can be used to run tests on the main thread of the
process.
For more information, see Passing in extra arguments.
Setup scripts are now represented in the JUnit output. For more information, see Setup scripts in JUnit output.
Each test now has a separate Tokio task associated with it. This leads to greater reliability (each test's task can now panic independently), and is faster in repos with many small tests.
For example, in one test done against
clap-rs/clap on Linux, the time reported by
cargo nextest run goes down from 0.36 seconds to 0.23 seconds.
Several minor improvements to the user interface:
Ctrl-C twice now prints out a "Killing" message.The MSRV for compiling nextest is now Rust 1.81. (The MSRV for running tests remains unchanged.)
Fixed a bug where pressing two Ctrl-Cs in succession would not SIGKILL any running tests.
junit.store-success-output now works correctly—previously, storage of output is disabled unconditionally.
In JUnit output, the testsuite elements are now listed in the order they are first seen (IndexMap), rather than in random order (HashMap).
When adding extra files to an archive, nextest now ignores empty and .
path components in the specification while joining the specified path. This
normalizes paths, meaning that archives won't accidentally get duplicated entries.
Update idna to address RUSTSEC-2024-0421. Since nextest only accesses
domains that do not use punycode, we disable that support entirely.
Nextest now supports being run in Cargo setups where the Cargo.toml that
defines the workspace is not hierarchically above the workspace members. This is
an uncommon setup, but it is supported by Cargo—and now by nextest as well.
Thanks to PegasusPlusUS for your first contribution!
If an I/O error occurs waiting for a test process to finish, standard output and standard error are now displayed correctly.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
When no tests are run, the default behavior now is to exit with code 4 (NO_TESTS_RUN). This is a behavior change, as documented in [#1646].
When no tests are run, the default behavior now is to exit with code 4
(NO_TESTS_RUN). This is a behavior change, as documented in #1646.
SHA-256 and BLAKE2 checksum files are now published for each release.
Nothing published for this version
Fixed a rare crash during test run cancellation ([#1876]).
Per-platform default filters are now supported via overrides. For example, to skip over tests with the substring unix_tests by default on Windows, add
Per-platform default filters are now supported via overrides. For example, to
skip over tests with the substring unix_tests by default on Windows, add
this to .config/nextest.toml:
[[profile.default.overrides]]
platform = "cfg(windows)"
default-filter = "not test(unix_tests)"
cargo nextest run --build-jobs now accepts negative numbers as arguments,
similar to other commands like cargo nextest run --test-threads and cargo build. Negative numbers mean "use all available cores except for this many".
Thanks to mattsse for your first contribution!
For crates with a build script, nextest now reads their output and sets environment variables from within them for tests. This matches cargo test's be
For crates with a build script, nextest now reads their output and sets environment variables from
within them for tests. This matches cargo test's behavior. However, note that this usage is
discouraged by Cargo.
Thanks to chrjabs for your first contribution!
On Unix platforms, nextest now also intercepts the SIGQUIT signal, in addition to the existing
SIGINT, SIGTERM, etc. More signals will be added to this list as makes sense.
tracing library. Nextest doesn't do much
structured logging or event/span logging yet, but tracing provides a great foundation to add that
in the future.Fixed semantics of --exact to match Rust's libtest: --exact now makes it so that all filters passed in after -- (including --skip filters) are matched
Fixed semantics of --exact to match Rust's libtest: --exact now makes it so that all filters passed in after -- (including --skip filters) are matched exactly.
Support for --skip and --exact as emulated test binary arguments. The semantics match those of libtest binaries.
Support for --skip and --exact as emulated test binary arguments. The semantics match those of libtest binaries.
For example, to run all tests other than those matching the substring slow_tests:
cargo nextest run -- --skip slow_tests
To run all tests matching either the substring my_test or the exact string exact_test:
cargo nextest run -- my_test --exact exact_test
Thanks to svix-jplatte for your first contribution!
Expanded version information: cargo nextest -V now shows commit and date information similar to rustc and cargo, and cargo nextest --version shows thi
cargo nextest -V now shows commit and date information similar to rustc and cargo, and cargo nextest --version shows this information in long form.cargo metadata parsing with renamed packages (#1746).Nothing published for this version
For failing tests, if nextest finds text matching patterns that indicate failure, such as "thread panicked at", it now highlights those lines (if colo
For failing tests, if nextest finds text matching patterns that indicate failure, such as "thread panicked at", it now highlights those lines (if color is enabled).
Rust's libtest doesn't provide structured output for this, so nextest uses heuristics. These
heuristics will be tweaked over time; to see what nextest would highlight, run cargo nextest debug extract highlight, and provide either --stdout and --stderr, or --combined if stdout and
stderr are combined.
default-set is now default-filter.
A couple of UI changes:
default-set is now default-filter.--bound=all is now --ignore-default-filter.Sorry about the breakage here -- this should be the last of the changes.
This is technically a breaking change, but default sets aren't in wide use yet so this should have minimal impact.
--bound=all option disables the default set on the command line.--run-ignored ignored-only has been shortened to --run-ignored only. (The old name still works
as an alias.)Previously, passing in any -E options would disable the default set. However in practice that
was found to be too confusing, and this behavior has been removed. Instead, use --bound.
This is technically a breaking change, but default sets aren't in wide use yet so this should have minimal impact.
Support for default sets of tests to run via the default-set configuration. See _Running a subset of tests by default_ for more information.
default-set configuration. See Running a
subset of tests by default
for more information.--no-tests option controls the behavior of nextest when no tests are run. The possible
values are pass, warn and fail. Per the behavior changed described in discussion
#1646, the current default is warn, and
it will change to fail in the future.Warnings are now printed in the following cases:
Warnings are now printed in the following cases:
--fail-fast.If no tests are run, nextest will start exiting with the advisory code 4 in versions released after 2024-11-18. See discussion #1646 for more.
Nothing published for this version
Previously, nextest would be unable to run proc-macro tests in some circumstances:
Previously, nextest would be unable to run proc-macro tests in some circumstances:
cargo-nextest binary is invoked directlyWith this release, proc-macros tests now work in all circumstances. This is done by nextest detecting Rust libdirs for the host and target platforms, and adding them to the library path automatically.
(There's also the less-common case of test binaries compiled with -C prefer-dynamic. These
situations now also work.)
See #267 and #1493 for more details.
Thanks to 06393993 for your first contribution!
As part of the above fix, libstd is now included in all archives. This makes archives around 4MB bigger, or around 8MB in cross-compilation scenarios. (It is possible to address this via config knobs -- if this is particularly bothersome to you, please post in #1515.)
Archives can now include extra paths in them. For example:
Archives can now include extra paths in them. For example:
[profile.default]
archive.include = [
{ path = "my-extra-path", relative-to = "target" }
]
For more information, see Adding extra files to an archive.
Thanks to @rukai for your first contribution!
You can now pass in --cargo-quiet twice to completely discard standard error for the Cargo
commands run by nextest. This is equivalent to 2> /dev/null.
cargo metadata execution now passes in --frozen, --locked, --offline and --quiet if the corresponding flags are passed into nextest.NEXTEST_HIDE_PROGRESS_BAR=1 did not work (only NEXTEST_HIDE_PROGRESS_BAR=true
did). Now both 1 and true work.This is a maintenance release with many internal improvements, and preparation for future features.
This is a maintenance release with many internal improvements, and preparation for future features.
Nextest binaries now ship with symbols, producing better stack traces. This is aligned with the behavior. See issue #1345 for more information.
Thanks to recent improvements, Miri is now significantly less taxing. As a result, nextest with Miri has been changed to use all threads by default. You can restore the old Miri behavior (run one test at a time) with -j1, or by setting in .config/nextest.toml:
[profile.default-miri]
test-threads = 1
Rules for heavy tests and test groups will continue to be followed with Miri.
Thanks to Ben Kimock for driving the Miri improvements and updating nextest!
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
More work on machine-readable output for test runs: for failing tests, output is now included under the stdout field. This was a large effort which re
stdout field. This was a large effort which required figuring out how to combine stdout and stderr into the same buffer. Thanks again Jake for your contribution!Nothing published for this version
Nextest now has experimental support for machine-readable output during cargo nextest run invocations ([#1086]), in a format similar to cargo test's l
Nextest now has experimental support for machine-readable output during cargo nextest run invocations (#1086), in a format similar to cargo test's libtest JSON output. For more information, see the documentation.
Thanks Jake Shadle for your contribution!
OUT_DIR supportImprovements to build script OUT_DIR
support:
Matching the behavior of cargo test, nextest now sets the OUT_DIR environment variable at
runtime if there's a corresponding build script.
While creating archives, nextest now archives OUT_DIRs if:
This is so that the OUT_DIR environment variable continues to be relevant for test runs out of
archives.
Currently, OUT_DIRs are only archived one level deep to avoid bloating archives too much. In the
future, we may add configuration to archive more or less of the output directory. If you have a
use case that would benefit from this, please file an
issue.
.crate files uploaded to crates.io now contain the LICENSE-APACHE and LICENSE-MIT license files. Thanks @musicinmybrain for your first contribution!Stabilized and documented the binary ID format.
package(foo*) will match all tests whose names start with foo.binary_id() predicate matches against the binary ID.Unit tests in proc-macro crates now have a binary ID that consists of just the crate name, similar to unit tests in normal crates.
The default string matcher for the following predicates has changed from equality to glob:
package(), deps(), and rdeps()binary()The new binary_id() predicate also uses the glob matcher by default.
Fixed regressions under some Cargo edge cases, e.g. guppy-rs/guppy#157.
Nothing published for this version
Deprecated test name filters passed in before --. For example, cargo nextest run my_test is deprecated; use cargo nextest run -- my_test instead. See…
cargo-ntr and pointing to cargo-nextest, you can now
shorten cargo nextest run to cargo ntr. In the future, this symlink will be automatically
created at install time.--. For example, cargo nextest run my_test is deprecated; use cargo nextest run -- my_test instead. See #1109 for motivation and more information.x86_64-unknown-linux-gnu builds are now performed using cargo zigbuild. The minimum glibc version remains unchanged at 2.27. Please file a bug report if you encounter any issues with this change.Nothing published for this version
The grace period in slow-timeout.grace-period now applies to terminations as well. Thanks @kallisti-dev for your first contribution!
slow-timeout.grace-period now applies to terminations as well. Thanks @kallisti-dev for your first contribution!Experimental support for setup scripts. Please try them out, and provide feedback in the tracking issue!
deps() and rdeps() predicates in per-test overrides were previously not working correctly. With this version they now work.Per-test overrides can now be filtered separately by host and target platforms.
--cargo-quiet and --cargo-verbose options to control Cargo's quiet and verbose output options. Thanks Oliver Tale-Yazdi for your first contribution!Nothing published for this version
Fixed case when .config/nextest.toml isn't present (#926).
.config/nextest.toml isn't present (#926).nextest-version is now parsed in a separate pass. This means that error reporting in case there's an incompatible config is now better.
nextest-version is now parsed in a separate pass. This means that error reporting in case
there's an incompatible config is now better.Support for Cargo's --timings option (#903).
--timings option (#903).nextest-version top-level configuration option. See Minimum nextest versions for more.line-tables-only is passed in (#910).Nextest now supports custom targets specified via --target, CARGO_BUILD_TARGET, or configuration. See the Rust Embedonomicon for how to create a custo
--target, CARGO_BUILD_TARGET, or configuration. See the Rust Embedonomicon for how to create a custom target.Filter expressions in TOML files can now be specified as multiline TOML strings. For example:
[[profile.default.overrides]]
filter = '''
test(my_test)
| package(my-package)
'''
# ...
show-config test-groups now shows a clean representation of filter expressions, to enable
printing out multiline expressions neatly.Updated dependencies to resolve a build issue on Android ([#862]).
The definition of threads-required has changed slightly. Previously, it was possible for global and group concurrency limits to be exceeded in some ci
threads-required has changed slightly. Previously, it was possible for global and group concurrency limits to be exceeded in some circumstances. Now, concurrency limits are never exceeded. This enables some new use cases, such as being able to declare that a test is mutually exclusive with all other tests globally.cargo nextest r added as a shortcut for cargo nextest run.
cargo nextest r added as a shortcut for cargo nextest run.New configuration settings added to JUnit reports: junit.store-success-output (defaults to false) and junit.store-failure-output (defaults to true) co
junit.store-success-output (defaults to false) and junit.store-failure-output (defaults to true) control whether output for passing and failing tests should be stored in the JUnit report.success-output and failure-output.junit.store-success-output and junit.store-failure-output.Your coding agent can read these notes before it upgrades. Set up the MCP server →