|CARGO-TEST(1)||General Commands Manual||CARGO-TEST(1)|
The test filtering argument TESTNAME and all the arguments following the two dashes (--) are passed to the test binaries and thus to libtest (rustc's built in unit-test and micro-benchmarking framework). If you're passing arguments to both Cargo and the binary, the ones after -- go to the binary, the ones before go to Cargo. For details about libtest's arguments see the output of cargo test -- --help.
As an example, this will filter for tests with foo in their name and run them on 3 threads in parallel:
cargo test foo -- --test-threads 3
Tests are built with the --test option to rustc which creates an executable with a main function that automatically runs all functions annotated with the #[test] attribute in multiple threads. #[bench] annotated functions will also be run with one iteration to verify that they are functional.
The libtest harness may be disabled by setting harness = false in the target manifest settings, in which case your code will need to provide its own main function to handle running tests.
Documentation tests are also run by default, which is handled by rustdoc. It extracts code samples from documentation comments and executes them. See the rustdoc book https://doc.rust-lang.org/rustdoc/ for more information on writing doc tests.
The default members of a workspace can be set explicitly with the workspace.default-members key in the root manifest. If this is not set, a virtual workspace will include all workspace members (equivalent to passing --workspace), and a non-virtual workspace will include only the root crate itself.
-p spec..., --package spec...
The default behavior can be changed by setting the test flag for the target in the manifest settings. Setting examples to test = true will build and run the example as a test. Setting targets to test = false will stop them from being tested by default. Target selection options that take a target by name ignore the test flag and will always test the given target.
Doc tests for libraries may be disabled by setting doctest = false for the library in the manifest.
Binary targets are automatically built if there is an integration test or benchmark. This allows an integration test to execute the binary to exercise and test its behavior. The CARGO_BIN_EXE_<name> environment variable https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-crates is set when the integration test is built so that it can use the env macro https://doc.rust-lang.org/std/macro.env.html to locate the executable.
Passing target selection flags will test only the specified targets.
Note that --bin, --example, --test and --bench flags also support common Unix glob patterns like *, ? and . However, to avoid your shell accidentally expanding glob patterns before Cargo handles them, you must use single quotes or double quotes around each glob pattern.
See the features documentation https://doc.rust-lang.org/cargo/reference/features.html#command-line-feature-options for more details.
This may also be specified with the build.target config value https://doc.rust-lang.org/cargo/reference/config.html.
Note that specifying this flag makes Cargo run in a different mode where the target artifacts are placed in a separate directory. See the build cache https://doc.rust-lang.org/cargo/guide/build-cache.html documentation for more details.
cargo test -- --nocapture
May also be specified with the term.color config value https://doc.rust-lang.org/cargo/reference/config.html.
These may be used in environments where you want to assert that the Cargo.lock file is up-to-date (such as a CI build) or want to avoid network access.
Beware that this may result in different dependency resolution than online mode. Cargo will restrict itself to crates that are downloaded locally, even if there might be a newer version as indicated in the local copy of the index. See the cargo-fetch(1) command to download dependencies before going offline.
May also be specified with the net.offline config value https://doc.rust-lang.org/cargo/reference/config.html.
cargo test -j 2 -- --test-threads=2
-j N, --jobs N
Profile selection depends on the target and crate being built. By default the dev or test profiles are used. If the --release flag is given, then the release or bench profiles are used.
|Target||Default Profile||--release Profile|
|lib, bin, example||dev||release|
|test, bench, or any target in "test" or "bench" mode||test||bench|
Dependencies use the dev/release profiles.
Unit tests are separate executable artifacts which use the test/bench profiles. Example targets are built the same as with cargo build (using the dev/release profiles) unless you are building them with the test harness (by setting test = true in the manifest or using the --example flag) in which case they use the test/bench profiles. Library targets are built with the dev/release profiles when linked to an integration test, binary, or doctest.
cargo test name_filter
cargo test --test int_test_name -- modname::test_name