5.3 测试

原文链接: https://rust-random.github.io/book/contrib-test.html

Rand 有许多单元测试,尽管这些测试并不全面或完美(欢迎改进)。我们倾向于为所有新功能编写测试。

第一行测试只需从相应目录运行 cargo test。由于 Rand 支持 no_std(仅 core)、core+alloc 和 std 环境,测试所有三种环境很重要(取决于所讨论代码适用的特性):

1
2
3
4
5
6
# 使用 std 测试:
cargo test
# 仅使用 core 测试:
cargo test --tests --no-default-features
# 使用 core + alloc 测试(需要 nightly):
cargo +nightly test --tests --no-default-features --features=alloc

使用其他特性标志进行测试也可能值得:

1
cargo test --all-features

请注意,这仅测试当前包(即从仓库顶层运行时测试主 Rand 库)。要测试其他库,请 cd 到其目录。

我们不建议使用 Cargo 的 --package 选项,因为它与 --feature 选项有令人惊讶的交互,且当构建树中存在同一包的多个版本时会失败。CI 改用 --manifest-path 来选择包;开发时,使用 cd 更简单。

编写测试

测试可以是 test 子模块中的单元测试、文档示例、示例应用(examples 目录)、集成测试(tests 目录)或基准测试(benches 目录)。

请注意,只有单元测试和集成测试预期在 no_std(仅 core)和 core+alloc 配置下通过。这是刻意的选择;示例代码只需针对常见情况(std)。

随机数生成器

测试代码通常需要某种 RNG 进行测试,但不需要任何特定的 RNG。在这种情况下,我们倾向于使用 ::test::rng,它简单、初始化快速且具有确定性:

1
let mut rng = ::test::rng(528); // 随便选一个数字

各种测试涉及可能为真但并非确定的属性。我们倾向于使此类测试具有确定性,以避免虚假失败。

最后修改 August 23, 2026: 更新 (499855b16)