Tags
Assigning tags
Tests can be associated with an arbitrary number of tags. Each tag is global, and must be a valid Rust identifier.
Tags can be assigned to tests using the #[tag] attribute:
#![allow(unused)]
fn main() {
use test_r::{tag, test};
#[tag(tag1)]
#[tag(tag2)]
#[test]
fn tagged_test() {
assert!(true);
}
}
Tagging entire test suites
It is possible to tag an entire test suite. This can be done by using the #[tag] attribute on the module containing the tests,
or alternatively using the tag_suite! macro:
#![allow(unused)]
fn main() {
use test_r::{tag, tag_suite, test};
mod inner1;
tag_suite!(inner1, tag1);
#[tag(tag2)]
mod inner2 {
// ...
}
}
The tag_suite! macro is necessary because currently it is not possible to put attributes on non-inlined modules.
Running tagged tests
The purpose of tagging tests is to run a subset of the crate’s tests selected by tags. To select tests by tags, use the
:tag: prefix when passing the test name to cargo test:
cargo test :tag:tag1
This example will run every test tagged as tag1, but no others.
Selecting untagged tests
Sometimes it is useful to select all tests without a tag. This can be done by using the :tag: prefix with no tag name:
cargo test :tag:
Selecting tests by multiple tags
Multiple tags can be combined with the | (or) and & (and) operators. The & operator has higher precedence than |. So the following example:
cargo test ':tag:tag1|tag2&tag3'
is going to run tests tagged as either tag1 or both tag2 and tag3.
Skipping tests by tag
The :tag: syntax also works with the --skip option. This allows skipping all tests with a specific tag:
cargo test -- --skip ':tag:slow'
This runs all tests except those tagged as slow.