我们的测试基础设施本月进展:2024 年 12 月
亲爱的读者,新年快乐!这是 2024 年最后一期我们的测试基础设施本月进展。
这是关于 rust-lang/rust 仓库1的测试基础设施在 2024 年 12 月的变更的快速总结。
像往常一样,如果您在使用我们的测试基础设施时遇到错误或用户体验问题,请提交 issue。如果我们不知道它们,错误和细微问题就无法修复!
感谢所有为我们的测试基础设施做出贡献的人!
亮点
rustc-dev-guide
现在是一个 josh
子树!
之前,rustc-dev-guide 是 rust-lang/rust 内部的一个子模块,对 rustc-dev-guide 的更新必须针对 rustc-dev-guide 仓库单独进行 PR。
现在,感谢 @Kobzol 的努力(其中包括克服许多不可预见的障碍),rustc-dev-guide
现在是一个 josh
子树。这对贡献工作流程来说是一项重大改进,因为它意味着对 rustc-dev-guide 的文档更新可以与 rust-lang/rust 中的实现更改在同一个 PR 中进行。贡献摩擦的减少也鼓励了 rustc-dev-guide 的更新,因为您不再需要编写和维护两个单独的 PR。
compiletest 现在将显示规范化输出和实际输出之间不同行的差异
以前,当 ui 测试失败时,很难说出实际的预规范化输出是什么,因为您必须求助于 --nocapture
或类似的方法。
现在,compiletest 还将在失败时显示预规范化的不匹配输出行,以便更容易区分。示例输出
failures:
---- [ui] tests/ui/layout/enum.rs stdout ----
diff of stderr:
- error: align: AbiAndPrefAlign { abi: Align(2 bytes), pref: $PREF_ALIGN }
+ error: align: AbiAndPrefAlign { abi: Align(2 bytes), pref: $PREF_ALIN }
2 --> $DIR/enum.rs:9:1
3 |
4 LL | enum UninhabitedVariantAlign {
Note: some mismatched output was normalized before being compared
- error: align: AbiAndPrefAlign { abi: Align(2 bytes), pref: Align(8 bytes) }
- --> /home/jyn/src/rust2/tests/ui/layout/enum.rs:9:1
+ error: align: AbiAndPrefAlign { abi: Align(2 bytes), pref: $PREF_ALIN }
compiletest 现在允许在运行 debuginfo 测试时使用特定的调试器
长期以来,只有当您拥有所有被测试的调试器(即 lldb
、gdb
、cdb
)时,tests/debuginfo
测试套件才能成功运行。如果出现以下情况,这在本地非常烦人:
- 其中一个或多个调试器在本地不可用或无法工作2。
- 您只是想查看给定调试器的测试失败情况。
现在,您可以使用特定的调试器运行 tests/debuginfo
测试套件,以便仅针对指定的调试器运行测试。示例用法
$ ./x test tests/debuginfo -- --debugger gdb
ui
测试现在支持 //@ forbid-output
ui
测试现在可以使用 //@ forbid-output: REGEX
指令来检查必须不能出现在 stderr 中的模式。如果匹配到 REGEX
模式,则 ui
测试将失败。
请参阅 rustc-dev-guide 以获取更多详细信息。
./x test
现在接受 --no-capture
标志,该标志将转发到 compiletest(以及 libtest)
以前,如果您想通过 bootstrap,通过 compiletest,传递 --nocapture
标志给底层的 libtest 运行器,在 Linux 上您必须编写
$ ./x test tests/ui -- --nocapture
在原生 Windows msvc 上情况更糟,我记得必须写
PS> ./x test tests/ui -- -- --nocapture
这很难发现,而且是贡献者的一个痛点3。
现在,您只需编写
$ ./x test tests/ui --no-capture
bootstrap 会将此标志作为 --nocapture
转发到底层的 libtest。
值得注意的更改
本节旨在像“兼容性说明”一样,但针对的是人类测试编写者。
FileCheck
的测试套件不再预定义 MSVC
和 NONMSVC
FileCheck
前缀
基于 在当前设置中,compiletest 将为每个 compiletest //@ revision
注册一个 FileCheck
自定义前缀。但是,由于历史原因,compiletest 还根据主机预定义了 MSVC
和 NONMSVC
FileCheck
前缀。但这非常令人惊讶,原因有两个:
- 它是“远距离的幽灵行动”,因为用户从未声明这些自定义前缀,并且这些前缀是根据主机有条件地设置的。也很难调试。
- 如果用户还想添加自己的
//@ revision: MSVC NONMSVC
修订版,因为 compiletest 会为这些名称传递两次--check-prefix
,这将导致FileCheck
报告有关重复前缀的错误。
因此,在 compiletest:不要注册预定义的 MSVC
/NONMSVC
FileCheck
前缀 #134463 中,我们不再预定义这两个 FileCheck
前缀。
如果您想要之前的 MSVC
与 NONMSVC
行为,您需要显式写出
//@ revisions: MSVC NONMSVC
//@[MSVC] only-windows-msvc
//@[NONMSVC] ignore-windows-msvc
normalize-{stderr,stdout}-test
指令重命名为 normalize-{stderr,stdout}
主要是清理工作,-test
后缀没有提供任何额外的有用信息,只会使这两个 normalize-*
指令难以发现。
normalize-{stderr,stdout}-test
指令现在重命名为 normalize-{stderr,stdout}
。 normalize-{stderr,stdout}-{32,64}bit
指令不受影响。
FileCheck
后缀作为修订名称(对于基于 FileCheck
的测试套件)
compiletest 现在将拒绝使用内置的 对于基于 FileCheck
的测试套件(assembly
、codegen
、mir-opt
),compiletest 将为每个 compiletest //@ revision
注册一个自定义的 FileCheck
前缀。但是,FileCheck
也有一些内置后缀,例如:
// COM:
// CHECK:
// CHECK-NEXT:
// CHECK-SAME:
// CHECK-EMPTY:
// CHECK-NOT:
// CHECK-COUNT:
// CHECK-DAG:
// CHECK-LABEL:
当组合使用时,这在以前意味着 compiletest 允许像这样的 compiletest 修订版 + 内置 FileCheck
后缀结构:
// next:
// same-SAME:
// not-NOT:
// next-NEXT:
// not-SAME:
这非常令人困惑。
因此,compiletest 现在将拒绝在基于 FileCheck
的测试套件中使用 CHECK
、COM
、NEXT
、SAME
、EMPTY
、NOT
、COUNT
、DAG
、LABEL
作为修订名称。
PR 列表
改进
- rustc-dev-guide: 将
rustc-dev-guide
转换为josh
子树 #134907 - compiletest: 显示未匹配行的规范化输出和实际输出之间的差异 #133733
- compiletest: 解释 UI 测试默认情况下不编译 #133813
- compiletest: 允许在运行
debuginfo
测试时使用特定的调试器 #134629 - compiletest, run-make-support: 改进
compiletest
和run-make-support
的符号链接处理 - compiletest: 支持 UI 测试中的
forbid-output
#134738 - bootstrap: 添加
--no-capture
/--nocapture
作为 bootstrap 参数 #134809 - bootstrap: 允许
./x check compiletest
#134848 - compiletest: 拒绝将特殊的
FileCheck
后缀用作修订名称 #134925 - tidy: 在 CI 中对
tidy
运行 Python 格式化检查 #134964 - tidy: 在
tidy
中打印如何重新祝福 Python 格式化 #134968
修复
- compiletest: 修复
run-make
测试的--nocapture
#134111 - compiletest: 在祝福时删除空的“expected”文件 #134808
- run-make: 修复
assert_stderr_not_contains_regex
#1341134
清理
- compiletest: 不要注册预定义的
MSVC
/NONMSVC
FileCheck
前缀 - compiletest: 从
normalize-*
指令中删除-test
后缀 #134759 - compiletest: 仅将冒号后的值传递给
parse_normalize_rule
#134840 - compiletest: 稍微简化调试器指令前缀的处理 #134849
- bootstrap: 整合用于声明 compiletest 测试套件的宏 #134876
- tidy: 在
tidy
中将black
替换为ruff
#133821
文档更新
- 记录如何运行拆分的 Docker 管道 #134894
- 记录
src/ci/docker/run.sh
的--dev
标志 #134669 - rustc-dev-guide:
compiletest
: 记录--debugger
标志 #2170 - rustc-dev-guide: 记录 UI 测试的
forbid-output
#2171 - rustc-dev-guide: 从规范化指令中删除
-test
后缀 #2172 - rustc-dev-guide: 记录
x test --no-capture
#2174 - rustc-dev-guide: 描述如何将 rust-analyzer 与
rmake.rs
一起使用 #2191
-
这里的测试基础设施指的是测试框架 compiletest 和构建系统中支持的组件 bootstrap。 此测试基础设施主要由 rustc 和 rustdoc 使用。 其他工具如 cargo、miri 或 rustfmt 维护它们自己的测试基础设施。 ↩
-
例如,当旧版本的
lldb
一直抱怨ModuleNotFoundError: No module named '_lldb'
时,我一直需要调试调试器,比如lldb
。 ↩ -
我不知道你怎么样,但我总是记不住那个标志叫什么。我一直认为是
--no-capture
,但当前 libtest 只接受--nocapture
。谢天谢地,T-testing-devex FCP 已经批准添加更传统的版本--no-capture
,我对此表示期待。我也从来搞不清楚需要多少个--
破折号,我总是发现自己需要添加更多的--
,直到它开始工作为止。 ↩ -
Nyehehehe ↩