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 #[tags] 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); #[tags(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.