Test runners
Rust comes with support for unit tests built-in. You can annotate a function
with #[test]
anywhere and it will be treated as a unit test.
#![allow(unused)] fn main() { #[test] fn example_test() { assert_eq!(42, 40 + 2); } }
Often times, tests will be put into a separate module called tests
, so that
you can import things you need in the tests and not get warnings because those
are not used in normal compilation.
You can also write integration tests by putting them into a tests/
folder in
the crate root. Finally, code you put into crate documentation is also built,
these are called doctests.
Cargo has a subcommnd called cargo test
, which will build and run all of the
tests in a crate. When you use a workspace, then using cargo test --all
will
run all tests from all crates in the workspace.
This subcommand works well, and you should use it. However, there are a few limitations with it that are especially noticeable when you are working in a large Rust workspace with a lot of crates (and thus, a lot of tests and integration tests): it runs a bit slow.
Cargo Nextest
Cargo Nextest is a tool that you can use as a drop-in replacement for
cargo test
. It has some useful features for running tests in CI, but the main
advantage is that it is up to 3x faster according to their own
benchmarks.
In my testing, I’ve observed a 10% speedup, but it depends on how many tests you
have and what they are bottlenecked by. In my case, the tests were bottlenecked
by external services, so there is not too much cargo nextest
can do. But if
you have a lot of tests and/or a large Cargo workspace, be sure to give
cargo nextest
a try, you may see a marked improvement in testing time and the
output is also more terse, which I like.
Reading
How (and why) nextest uses Tokio (archived) by Siddharth Agarwal
Siddharth explains in this article how (and why) nextests uses Tokio. Generally, using Tokio often comes with the assumption that some software uses networking, however here it turns out that the async model maps very well to scheduling tests as well. It is a fascinating peek into how nextest works.
cargo-nextest book by cargo-nextest
The cargo-nextest is a reference guide for nextest, a next-generation test runner for Rust.