在 CQ 中测试不稳定性

为了在 CQ 中测试不稳定性,基础架构可以多次运行测试,如果出现一次失败,则使整个 build 失败。当基础架构根据 build 图确定受测试提交影响的测试数量较少时,会自动执行此操作。

格式

更改作者可以通过在提交消息中添加 Multiply 页脚来告知基础架构多次运行特定测试:

Multiply: test_selector

test_selector 可以是测试名称、测试名称的子字符串,也可以是与测试名称匹配的 re2 正则表达式

Fuchsia 组件测试通过软件包网址进行引用:

Multiply: fuchsia-pkg://fuchsia.com/foo_tests#meta/foo_tests.cm

主机测试按路径引用:

Multiply: host_x64/obj/src/bar_tests.sh

系统还接受测试名称的子字符串:

Multiply: foo_tests
Multiply: bar_tests

可以将多个乘数合并为一行,并以逗号分隔:

Multiply: foo_tests, bar_tests

全大写 MULTIPLY 也可接受。

实际更改中 Multiply 的使用示例:

运行次数

默认情况下,基础架构会使用历史测试时长数据来计算运行次数。选择的运行次数会生成一个时长与其他分片预期时长相似的倍增测试分片,最多为 2000 次测试运行。较慢的测试运行次数较少,而较快的测试运行次数较多。

有时,我们希望替换默认运行次数(例如,因为默认值过高,导致超时)。在这种情况下,您可以明确指定运行次数。例如:

Multiply: foo_tests: 100

适用性

Multiply 页脚适用于所有针对 CL 运行的 build,包括由 CQ 自动触发的 build,以及使用 Gerrit 中的 Choose Tryjobs 下拉菜单手动触发的 build。

限制

验证

如果您的 Multiply 子句中存在拼写错误,或者您的 Multiply 选择器与任何 build 上的任何测试都不匹配,则系统会默默地无法将任何测试相乘。

因此,请务必手动验证 Multiply 是否生效。对于 Multiply 生效的每个 build,Gerrit 中您的更改都会添加以下形式的注释:

A builder created multiplier shards. Click the following link for more details:

该评论将包含指向运行了倍增测试的 build 的链接(示例)。

如果未显示此类注释,则可能是语法有误,或者测试未在任何常规 CQ build 中运行。在这种情况下,您必须将其添加到 build 图中,以便由某个 builder 运行,或者手动选择运行测试的 tryjob(如果测试在可选的 builder 中运行)。

如果关联的 build 已完成,您应该会在 passesflakesfailures 步骤下看到类似 multiplied:<shard name>-<test name> 的步骤。如果 build 尚未完成,您可以点击 build 步骤下名为 <builder name>-subbuild 的链接,系统会将您带到子 build build 页面,您应该会在该页面上看到类似的 multiplied 步骤。由于注释未指定哪些测试被倍增,您可以查看 build 页面进行确认(如果您倍增了多项测试)。

例如:

分片倍增屏幕截图

不超过 5 个匹配的测试

不允许单个调节系数匹配超过 5 个测试,以防止更改作者意外地将大量测试相乘,从而使测试基础架构不堪重负。

如果因 Multiply 语句匹配的测试过多而导致 tryjob 失败,只需在本地或 Gerrit 界面中修改提交消息,使测试选择器更具体即可。然后重试 CQ。

在 CQ 试运行通过后更改 Multiply

如果所有 tryjob 都已通过 CQ 试运行,并且您添加或修改了 Multiply 子句但未进行任何代码更改,那么在试运行后的 24 小时内,后续的 CQ+1 或 CQ+2 尝试将不会重新运行构建器,并且更新后的 Multiply 子句将不会生效。

这是因为 CQ 服务将提交消息更新视为“微不足道”,并且不会使补丁集的过去 CQ 尝试失效。

如需解决此问题,您可以采取以下任一方案:

  • 使用 Choose Tryjobs 菜单手动重试部分 tryjob,并等待它们通过后再提交。
  • 或者,通过进行非功能性代码更改(例如向某些代码添加注释)并上传新的补丁集来使旧的 tryjob 结果失效,从而重试所有 tryjob。然后,重试包含 Multiply 页脚的 CQ。

超时

倍增测试的默认运行次数取决于测试的历史时长。如果您的更改增加了倍增测试的持续时间,则默认运行次数可能过高,导致运行测试的任务超时且不报告任何结果。

在这种情况下,您应手动指定较低的运行次数来替换默认运行次数,例如:

Multiply: foo_tests: 30

没有测试用例乘数

Multiply 仅支持顶级套件(Fuchsia 测试软件包和主机测试可执行文件)的乘法。系统将对已相乘的测试套件中的所有测试用例进行相乘。

无法在测试套件中倍增单个测试用例。