我们的测试基础设施本月进展:2024 年 12 月

2025 年 1 月 10 日 · Jieyou Xu 代表 Bootstrap 团队

我们的测试基础设施本月进展:2024 年 12 月

亲爱的读者,新年快乐!这是 2024 年最后一期我们的测试基础设施本月进展

这是关于 rust-lang/rust 仓库1的测试基础设施在 2024 年 12 月的变更的快速总结。

像往常一样,如果您在使用我们的测试基础设施时遇到错误或用户体验问题,请提交 issue。如果我们不知道它们,错误和细微问题就无法修复!

感谢所有为我们的测试基础设施做出贡献的人!

亮点

rustc-dev-guide 现在是一个 josh 子树!

之前,rustc-dev-guiderust-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 测试时使用特定的调试器

长期以来,只有当您拥有所有被测试的调试器(即 lldbgdbcdb)时,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 的测试套件不再预定义 MSVCNONMSVC FileCheck 前缀

当前设置中,compiletest 将为每个 compiletest //@ revision 注册一个 FileCheck 自定义前缀。但是,由于历史原因,compiletest 还根据主机预定义了 MSVCNONMSVC FileCheck 前缀。但这非常令人惊讶,原因有两个:

  1. 它是“远距离的幽灵行动”,因为用户从未声明这些自定义前缀,并且这些前缀是根据主机有条件地设置的。也很难调试。
  2. 如果用户还想添加自己的 //@ revision: MSVC NONMSVC 修订版,因为 compiletest 会为这些名称传递两次 --check-prefix,这将导致 FileCheck 报告有关重复前缀的错误。

因此,在 compiletest:不要注册预定义的 MSVC/NONMSVC FileCheck 前缀 #134463 中,我们不再预定义这两个 FileCheck 前缀。

如果您想要之前的 MSVCNONMSVC 行为,您需要显式写出

//@ 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 指令不受影响。

compiletest 现在将拒绝使用内置的 FileCheck 后缀作为修订名称(对于基于 FileCheck 的测试套件)

对于基于 FileCheck 的测试套件(assemblycodegenmir-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 的测试套件中使用 CHECKCOMNEXTSAMEEMPTYNOTCOUNTDAGLABEL 作为修订名称。

PR 列表

改进

修复

清理

文档更新

  1. 这里的测试基础设施指的是测试框架 compiletest 和构建系统中支持的组件 bootstrap。 此测试基础设施主要由 rustc 和 rustdoc 使用。 其他工具如 cargo、miri 或 rustfmt 维护它们自己的测试基础设施。

  2. 例如,当旧版本的 lldb 一直抱怨 ModuleNotFoundError: No module named '_lldb' 时,我一直需要调试调试器,比如 lldb

  3. 我不知道你怎么样,但我总是记不住那个标志叫什么。我一直认为是 --no-capture,但当前 libtest 只接受 --nocapture。谢天谢地,T-testing-devex FCP 已经批准添加更传统的版本 --no-capture,我对此表示期待。我也从来搞不清楚需要多少个 -- 破折号,我总是发现自己需要添加更多的 --,直到它开始工作为止。

  4. Nyehehehe