52 个版本 (24 个破坏性更新)
0.25.0 | 2024 年 7 月 24 日 |
---|---|
0.23.0 | 2024 年 5 月 2 日 |
0.22.2 | 2024 年 2 月 27 日 |
0.21.2 | 2023 年 9 月 27 日 |
0.1.0 | 2022 年 7 月 28 日 |
#27 在 测试
46,343 每月下载量
用于 3 crates
230KB
5.5K SLoC
compiletest-rs 的稳定版本
魔法行为
- 测试按照文件名顺序运行(首先运行文件,然后递归到文件夹中)。因此,如果您有任何慢速测试,请将它们用一个小整数开头,以便它们首先运行,尽可能利用并行性(而不是等待慢速测试完成)。
cargo test --test your_test_name -- --help
列出了您可以指定的用于过滤、祝福和使测试更简洁的命令。- 由于
cargo test
本身就运行所有测试,使用cargo test -- --check
本身将不起作用,但cargo test -- --quiet
和cargo test -- some_test_name
将正常工作,因为 CLI 匹配。
- 由于
- 如果有与您的测试文件名相同的
.stdin
文件,它将被作为标准输入传递到您的程序中。
支持的魔法注释注解
如果你的测试用于检测失败,你需要在错误发生的位置添加一个//~
注释以确保测试在注释的行上始终失败。这些注释可以有两种形式
//~ LEVEL: XXX
通过错误级别和消息文本进行匹配LEVEL
可以是以下之一(按降序排列):ERROR
、HELP
、WARN
或NOTE
- 如果明确指定了级别,则需要为该级别或更高级别的所有诊断添加注释。为了避免这种情况,请参阅
//@require-annotations-for-level
- 这将在标准化之前检查输出,因此您可以检查那些被标准化掉但需要小心不要意外地使模式在不同平台上不同的事物。
- 如果
XXX
的形式为/XXX/
,它将被视为正则表达式而不是子字符串,如果正则表达式匹配则成功。
//~ CODE
通过诊断代码进行匹配。CODE
可以采取多种形式,例如:E####
、lint_name
、tool::lint_name
。- 这将只匹配
ERROR
级别的诊断。
为了改变单个测试的测试方式,你可以在测试中添加各种//@
注释。任何其他注释都将被忽略,并且所有//@
注释都必须精确格式化为其命令指定的格式,否则测试将失败,甚至不会运行。
//@ignore-C
在条件C
满足时避免运行测试。C
可以是target-XXX
,它检查目标三元组是否包含XXX
。C
可以是host-XXX
,它检查主机三元组是否包含XXX
。C
也可以是64bit
、32bit
或16bit
之一。C
也可以是on-host
,它将在交叉编译测试期间仅运行测试。
//@only-C
仅在条件C
满足时运行测试。条件与ignore
相同。//@needs-asm-support
仅在目标支持asm!
时运行测试。//@stderr-per-bitwidth
根据位宽生成一个stderr文件,因为它们有时可能显著不同//@error-in-other-file: XXX
可用于检查由于在其他文件中报告而无法有//~
模式的所有错误。//@revisions: XXX YYY
对列表中每个由空格分隔的名称运行测试一次- 为每个修订版生成一个stderr文件
//~
注释可以通过在方括号内添加修订名称来限制到特定的修订版本://~[XXX]
//@
注释可以通过在方括号内添加修订名称来限制到特定的修订版本://@[XXX]
- 注意,您不能将修订版本添加到
revisions
命令中。
- 注意,您不能将修订版本添加到
//@compile-flags: XXX
将XXX
追加到传递给 rustc 驱动的命令行参数中。- 您可以使用此功能多次,所有标志都将累积。
//@rustc-env: XXX=YYY
为 rustc 驱动执行设置环境变量XXX
为YYY
。- 对于 Miri,这些环境变量在通过 rustc 编译期间以及程序模拟期间使用。
- 您可以使用此功能多次,累积所有环境变量。
//@normalize-stderr-test: "REGEX" -> "REPLACEMENT"
将 stderr 中的所有与REGEX
匹配的内容替换为REPLACEMENT
。替换可以指定$1
和类似的反向引用来粘贴捕获的内容。- 您可以使用多个此类命令,不需要创建一个可以处理多个替换的单一代码。
//@require-annotations-for-level: LEVEL
可用于更改需要相应注释的诊断级别。- 这仅在存在类似
HELP
、WARN
或NOTE
的注释时才有用,因为这些将自动要求所有相同或更高级别的其他诊断都需要注释。
- 这仅在存在类似
//@check-pass
要求测试没有错误注释,不发出错误,并以退出代码 0 成功退出。//@edition: EDITION
将默认版本(2021)覆盖为给定的版本。//@no-rustfix
不在具有机器可应用建议的测试上运行 rustfix。//@aux-build: filename
在测试目录中的auxiliary
目录(在测试目录内)中查找文件,将其编译为库,并将当前包链接到它。这允许您使用extern crate
或通过use
语句导入包。这将自动检测为 proc 宏的辅助文件并将它们作为 proc 宏构建。//@run
编译测试并运行生成的二进制文件。生成的二进制文件必须成功退出。stdout 和 stderr 来自生成的二进制文件。编译过程中的任何警告都将被忽略。- 您还可以通过例如
//@run: 1
或//@run: 101
(后者是标准 Rust 退出代码)来指定不同的预期退出代码/状态。 - 运行测试将运行输出收集到
.run.stderr
和.run.stdout
中。 - 如果存在
.run.stdin
文件,它将被作为标准输入管道传输到测试的执行中。
- 您还可以通过例如
与compiletest-rs的重要差异
ignore-target-xxx
和only-target-xxx
需要在xxx
子字符串之前添加target-
前缀以与目标三元组匹配,而compiletest允许不带target-
前缀的纯ignore-xxx
。子字符串xxx
也必须是目标三元组的子字符串,并且compiletest中的特殊集合(如macos/unix
)不受支持。- 仅支持
ui
测试 - 测试按名称顺序运行,因此您可以在慢速测试前加上
0
以使它们首先运行 aux-build
需要显式指定嵌套的辅助构建,并且不允许您引用兄弟aux-build
的工件。
依赖项
约10-20MB
约267K SLoC