在 CQ 中测试不稳定性

为了在 CQ 中测试是否存在不稳定性,基础架构可以多次运行测试,如果有一次测试失败,则整个 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 在真实更改中的使用示例:

运行次数

默认情况下,基础架构会使用历史测试时长数据来计算运行次数。运行次数的选择是为了生成单个乘法测试分片,其时长与其他分片的预期时长相似,最多可运行 2, 000 次测试。运行速度较慢的测试会运行的次数较少,而运行速度较快的测试会运行的次数较多。

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

Multiply: foo_tests: 100

限制

验证

如果 Multiply 子句中存在拼写错误,或者 Multiply 选择器与任何构建器上的任何测试都不匹配,则系统会静默失败,无法对任何测试进行乘法。

因此,请务必手动验证 Multiply 是否生效。对于 Multiply 生效的每个构建器,Gerrit 都会在您的更改中添加以下形式的评论:

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

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

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

如果关联的 build 已完成,您应该会在 passesflakesfailures 步骤下方看到 multiplied:<shard name>-<test name> 等步骤。如果 build 尚未完成,您可以点击名为 <builder name>-subbuildbuild 步骤下的链接,系统会将您定向至子 build build 页面,您应该会在该页面上看到类似的 multiplied 步骤。由于该评论未指定具体测试的倍数,因此您可以查看 build 页面进行确认(如果您对多项测试进行了倍增)。

例如:

乘法分片屏幕截图

最多只能有 5 个匹配的测试

单个乘数不得与超过 5 项测试匹配,以防止更改作者意外地对大量测试进行乘法运算,从而使测试基础架构过载。

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

在 CQ 试运行通过后更改 Multiply

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

这是因为 CQ 服务会将提交消息更新视为“琐碎”,并且不会使补丁集中之前的 CQ 尝试失效。

如需解决此问题,您可以执行以下任一操作:

  • 使用选择 TryJob 菜单手动重试部分 TryJob,并等待它们通过后再提交。
  • 或者,通过进行无效的代码更改(例如,向某些代码添加注释)并上传新的补丁集来使旧的 TryJob 结果失效,从而重试所有 TryJob。然后,在存在 Multiply 页脚的情况下重试 CQ。

超时

乘法测试的默认运行次数基于测试的历史时长。如果您更改延长了多次测试的持续时间,默认运行次数可能会过高,导致运行测试的任务超时,并且不会报告任何结果。

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

Multiply: foo_tests: 30

没有测试用例乘数

Multiply 仅支持顶级套件(Fuchsia 测试软件包和主机测试可执行文件)的乘法。乘法测试套件中的所有测试用例都会被乘。

无法在测试套件中对单个测试用例进行多次运行。