| Crates.io | ui_test |
| lib.rs | ui_test |
| version | 0.30.2 |
| created_at | 2022-07-28 07:51:25.115086+00 |
| updated_at | 2025-07-01 11:24:00.235062+00 |
| description | A test framework for testing rustc diagnostics output |
| homepage | |
| repository | https://github.com/oli-obk/ui_test |
| max_upload_size | |
| id | 634300 |
| size | 326,151 |
A test runner that builds tests with rustc or cargo (or any other compiler with some configuration effort) and compares the output of the compiler with a file that you check into git. This allows you to test how your libraries show up to your users when the library is used wrongly and emits errors.
See examples directory for how to use this in your own crate.
To be able to use it with cargo test, you need to put
[[test]]
name = "your_test_file"
harness = false
into your Cargo.toml, otherwise cargo test will only look for #[test]s and
not run your fn main() that actually executes ui_test
cargo test --test your_test_name -- --help lists the commands you can specify for filtering, blessing and making your tests less verbose.
cargo test on its own runs all tests, using cargo test -- --check will not work on its own, but cargo test -- --quiet and cargo test -- some_test_name will work just fine, as the CLI matches..stdin file with the same filename as your test, it will be piped as standard input to your program.If your test tests for failure, you need to add a //~ annotation where the error is happening
to ensure that the test will always keep failing at the annotated line. These comments can take two forms:
//~ LEVEL: XXX matches by error level and message text
LEVEL can be one of the following (descending order): ERROR, HELP, WARN, NOTE or ICE//@require-annotations-for-levelXXX is of the form /XXX/ it is treated as a regex instead of a substring and will succeed if the regex matches.//~ CODE matches by diagnostic code.
CODE can take multiple forms such as: E####, lint_name, tool::lint_name.ERROR level.In order to change how a single test is tested, you can add various //@ comments to the test.
Any other comments will be ignored, and all //@ comments must be formatted precisely as
their command specifies, or the test will fail without even being run.
//@ignore-C avoids running the test when condition C is met.
C can be target: XXX YYY, which checks whether the target triple contains XXX or YYY.C can be host: XXX YYY, which checks whether the host triple contains XXX or YYY.C can also be bitwidth: followed by one or more space separated integer size like 64, 32 or 16.C can also be on-host, which will only run the test during cross compilation testing.//@only-C only runs the test when condition C is met. The conditions are the same as with ignore.
//@needs-asm-support only runs the test when the target supports asm!.
//@stderr-per-bitwidth produces one stderr file per bitwidth, as they may differ significantly sometimes
//@error-in-other-file: XXX can be used to check for errors that can't have //~ patterns due to being reported in other files.
//@revisions: XXX YYY runs the test once for each space separated name in the list
//~ comments can be restricted to specific revisions by adding the revision name after the ~ in square brackets: //~[XXX]//@ comments can be restricted to specific revisions by adding the revision name after the @ in square brackets: //@[XXX]
revisions command.For example:
//@revisions: edition2021 edition2024
//@[edition2021] edition:2021
//@[edition2024] edition:2024
//@[edition2024] check-pass
// Then in code:
let x = 12; //~[edition2021] dead_code
let x = 12;
//~[edition2021]^ dead_code
//@compile-flags: XXX appends XXX to the command line arguments passed to the rustc driver
//@rustc-env: XXX=YYY sets the env var XXX to YYY for the rustc driver execution.
//@normalize-stderr-test: "REGEX" -> "REPLACEMENT" replaces all matches of REGEX in the stderr with REPLACEMENT. The replacement may specify $1 and similar backreferences to paste captures.
//@require-annotations-for-level: LEVEL can be used to change the level of diagnostics that require a corresponding annotation.
HELP, WARN or NOTE, as these would automatically require annotations for all other diagnostics of the same or higher level.//@check-pass requires that a test has no error annotations, emits no errors, and exits successfully with exit/status code 0.
//@edition: EDITION overwrites the default edition (2021) to the given edition.
//@no-rustfix do not run rustfix on tests that have machine applicable suggestions.
//@aux-build: filename looks for a file in the auxiliary directory (within the directory of the test), compiles it as a library and links the current crate against it. This allows you import the crate with extern crate or just via use statements. This will automatically detect aux files that are proc macros and build them as proc macros.
//@run compiles the test and runs the resulting binary. The resulting binary must exit successfully. Stdout and stderr are taken from the resulting binary. Any warnings during compilation are ignored.
//@run: 1 or //@run: 101 (the latter is the standard Rust exit code for panics)..run.stderr and .run.stdout respectively..run.stdin file exists, it will be piped as standard input to your test's execution.ignore-target: xxx and only-target: xxx instead of compiletest's
ignore-xxx/only-xxx. The xxx must also be a substring of the target triple; special
collections such as macos/unix in compiletest is not supported.ui tests0 in order to make them get run firstaux-builds require specifying nested aux builds explicitly and will not allow you to reference sibling aux-builds' artifacts.