测试

rustc 内置了构建和运行 crate 测试的功能。有关编写和运行测试的更多信息,请参阅 Rust 编程语言书籍的测试章节

测试以带有 #[test] 属性的自由函数的形式编写。例如

#[test]
fn it_works() {
    assert_eq!(2 + 2, 4);
}

如果测试返回时没有错误,则它们“通过”。如果它们 panic,或者返回一个诸如 Result 之类的实现了 Termination trait 并带有非零值的类型,则它们“失败”。

通过向 rustc 传递 --test 选项,编译器将以特殊模式构建 crate,以构建一个可执行文件来运行 crate 中的测试。 --test 标志将进行以下更改

  • 该 crate 将被构建为 bin crate 类型,强制它成为一个可执行文件。
  • 将可执行文件与 libtest 链接,后者是标准库的一部分的测试框架,用于处理测试的运行。
  • 合成一个 main 函数,该函数将处理命令行参数并运行测试。这个新的 main 函数将替换任何现有的 main 函数作为可执行文件的入口点,尽管现有的 main 仍然会被编译。
  • 启用 test cfg 选项,这允许您的代码使用条件编译来检测它是否正在作为测试构建。
  • 启用带有 testbench 属性的函数的构建,这些函数将由测试框架运行。

创建可执行文件后,您可以运行它来执行测试并接收有关哪些测试通过和失败的报告。如果您使用 Cargo 来管理您的项目,它具有一个内置的 cargo test 命令,该命令会自动处理所有这些。输出的示例如下所示

running 4 tests
test it_works ... ok
test check_valid_args ... ok
test invalid_characters ... ok
test walks_the_dog ... ok

test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

注意:测试必须使用 unwind panic 策略 构建。这是因为所有测试都在同一个进程中运行,并且它们旨在捕获 panic,这在使用 abort 策略时是不可能的。有关通过在单独的进程中生成测试来实验性支持 abort 策略的信息,请参阅不稳定的 -Z panic-abort-tests 选项。

测试属性

测试使用自由函数上的属性来指示。以下属性用于测试,有关更多详细信息,请参阅链接的文档

  • #[test] — 指示一个函数是要运行的测试。
  • #[bench] — 指示一个函数是要运行的基准测试。基准测试目前不稳定,仅在 nightly 通道中可用,有关更多详细信息,请参阅 不稳定的文档
  • #[should_panic] — 指示测试函数只有在函数 panic 时才会通过。
  • #[ignore] — 指示测试函数将被编译,但默认情况下不会运行。请参阅 --ignored--include-ignored 选项来运行这些测试。

CLI 参数

libtest 框架有几个命令行参数来控制其行为。

注意:在使用 cargo test 运行时,libtest CLI 参数必须在 -- 参数之后传递,以区分 Cargo 的标志和框架的标志。例如:cargo test -- --nocapture

过滤器

位置参数(那些没有 - 前缀的参数)被视为过滤器,这些过滤器将仅运行名称与其中一个字符串匹配的测试。过滤器将匹配在测试函数的完整路径中找到的任何子字符串。例如,如果测试函数 it_works 位于模块 utils::paths::tests 中,则任何过滤器 workspathutils::utils::paths::tests::it_works 都将匹配该测试。

有关控制运行哪些测试的更多选项,请参阅选择选项

操作选项

以下选项执行除运行测试之外的其他操作。

--list

打印所有测试和基准测试的列表。不运行任何测试。过滤器可用于仅列出匹配的测试。

-h, --help

显示用法信息和命令行选项。

选择选项

以下选项更改测试的选择方式。

--test

这是默认模式,其中所有测试都将运行,并且所有基准测试也将只运行一次迭代(以确保基准测试工作,而无需花费时间实际执行基准测试)。这可以与 --bench 标志结合使用,以运行测试并执行完整的基准测试。

--bench

这在一种模式下运行,其中测试被忽略,并且仅运行基准测试。这可以与 --test 结合使用,以同时运行基准测试和测试。

--exact

这强制 过滤器 完全匹配测试的完整路径。例如,如果测试 it_works 在模块 utils::paths::tests 中,则只有字符串 utils::paths::tests::it_works 将匹配该测试。

--skip FILTER

跳过任何名称包含给定 FILTER 字符串的测试。此标志可以传递多次。

--ignored

仅运行使用 ignore 属性标记的测试。

--include-ignored

同时运行忽略和未忽略的测试。

--exclude-should-panic

排除使用 should_panic 属性标记的测试。

⚠️ 🚧 此选项是不稳定的,需要 -Z unstable-options 标志。有关更多信息,请参阅 跟踪问题 #82348

执行选项

以下选项会影响测试的执行方式。

--test-threads NUM_THREADS

设置用于并行运行测试的线程数。默认情况下,使用硬件上可用的并发量,如 available_parallelism 所指示。

也可以使用 RUST_TEST_THREADS 环境变量指定。

--force-run-in-process

在使用 abort panic 策略时,强制测试在单个进程中运行。

⚠️ 🚧 这仅适用于不稳定的 -Z panic-abort-tests 选项,并且需要 -Z unstable-options 标志。有关更多信息,请参阅 跟踪问题 #67650

--ensure-time

⚠️ 🚧 此选项是不稳定的,需要 -Z unstable-options 标志。有关更多信息,请参阅 跟踪问题 #64888不稳定的文档

--shuffle

以随机顺序运行测试,而不是默认的字母顺序。

也可以通过将 RUST_TEST_SHUFFLE 环境变量设置为除 0 以外的任何值来指定。

可以向 --shuffle-seed 传递输出的随机数生成器种子,以便再次以相同的顺序运行测试。

请注意,--shuffle 不会影响测试是否并行运行。要按随机顺序顺序运行测试,请使用 --shuffle --test-threads 1

⚠️ 🚧 此选项是不稳定的,需要 -Z unstable-options 标志。有关更多信息,请参阅 跟踪问题 #89583

--shuffle-seed SEED

--shuffle 类似,但使用 SEED 作为随机数生成器的种子。因此,使用 --shuffle-seed SEED 调用测试框架两次会使测试以相同的顺序运行两次。

SEED 是任何 64 位无符号整数,例如,由 --shuffle 生成的整数。

也可以使用 RUST_TEST_SHUFFLE_SEED 环境变量指定。

⚠️ 🚧 此选项是不稳定的,需要 -Z unstable-options 标志。有关更多信息,请参阅 跟踪问题 #89583

输出选项

以下选项会影响输出行为。

-q, --quiet

每个测试显示一个字符,而不是每个测试显示一行。这是 --format=terse 的别名。

--nocapture

不捕获测试的 stdout 和 stderr,并允许测试打印到控制台。通常会捕获输出,并且仅在测试失败时显示。

也可以通过将 RUST_TEST_NOCAPTURE 环境变量设置为除 0 以外的任何值来指定。

--show-output

在所有测试运行后显示成功测试的 stdout 和 stderr。

将此与 --nocapture 进行对比,后者允许测试在 它们运行时 进行打印,如果同时运行多个测试,可能会导致交错的输出,--show-output 确保输出是连续的,但需要等待所有测试完成。

--color COLOR

控制何时使用彩色终端输出。有效选项

  • auto:如果 stdout 是 tty 并且未使用 --nocapture,则进行着色。这是默认值。
  • always:始终对输出进行着色。
  • never:从不对输出进行着色。

--format FORMAT

控制输出的格式。有效选项

  • pretty:这是默认格式,每个测试一行。
  • terse:每个测试仅显示一个字符。--quiet 是此选项的别名。
  • json:发出 JSON 对象,每行一个。⚠️ 🚧 此选项是不稳定的,需要 -Z unstable-options 标志。有关更多信息,请参阅 跟踪问题 #49359

--logfile PATH

将测试结果写入给定的文件。

--report-time

⚠️ 🚧 此选项是不稳定的,需要 -Z unstable-options 标志。有关更多信息,请参阅 跟踪问题 #64888不稳定的文档

不稳定的选项

一些 CLI 选项以“不稳定”状态添加,它们旨在进行实验和测试,以确定该选项是否正常工作,设计是否正确以及是否有用。该选项可能无法正常工作,可能会在任何时候中断或更改。为了表明您承认正在使用不稳定的选项,它们需要传递 -Z unstable-options 命令行标志。

基准测试

libtest 框架支持为使用 #[bench] 属性注释的函数运行基准测试。基准测试目前不稳定,仅在 nightly 通道上可用。有关更多信息,请参阅 不稳定的书籍

自定义测试框架

对在 nightly 通道上使用自定义测试框架的实验性支持可用。有关更多信息,请参阅 跟踪问题 #50297custom_test_frameworks 文档