针对任何测试运行程序并行运行测试

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

运行测试来验证代码更改是保持质量的关键。 若要使持续集成实践成功,必须具备一个良好的测试套件,该套件随每个生成一起运行。 但是,随着代码库的增长,回归测试套件往往也会增长,并且运行完整的回归测试可能需要很长时间。 有时,测试本身可能长时间运行 - 通常,如果编写端到端测试,则情况通常如此。 这降低了客户价值在管道无法足够快地处理生成时交付的速度。

并行运行测试是提高 CI/CD 管道效率的好方法。 这可以通过采用云提供的附加容量轻松完成。 本文讨论如何使用多个代理来处理作业来并行化测试。

先决条件

熟悉 代理作业的概念。 每个代理一次只能运行一个作业。 若要并行运行多个作业,必须配置多个代理。 还需要足够的并行作业

设置并行作业

在 YAML 中指定“并行”策略,并指示应调度多少个作业。 变量 System.JobPositionInPhaseSystem.TotalJobsInPhase 添加到每个作业。

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

小窍门

可以指定多达 99 个代理来纵向扩展大型测试套件的测试。

切片测试套件

若要并行运行测试,必须先对测试套件(或分区)进行切片,以便可以独立运行每个切片。 例如,可以使用两个代理并在每个代理上并行运行 500 个测试,而不是在单个代理上运行 1000 个大型测试套件。 或者,通过使用 8 个代理并在每个代理上并行运行 125 个测试,可以进一步减少运行测试所需的时间。

在作业中运行测试的步骤需要知道应运行哪个测试切片。 变量 System.JobPositionInPhaseSystem.TotalJobsInPhase 可用于此目的:

  • System.TotalJobsInPhase 指示切片总数(可将其视为“totalSlices”)
  • System.JobPositionInPhase 标识特定切片(可以将它视为“sliceNum”)

如果将所有测试文件表示为单维数组,则每个作业都可以运行索引在 [sliceNum + totalSlices] 处编制索引的测试文件,直到运行所有测试文件。 例如,如果你有六个测试文件和两个并行作业,则第一个作业(slice0)将运行编号为 0、2 和 4 的测试文件,第二个作业(slice1)将运行编号为 1、3 和 5 的测试文件。

2 个切片中的 6 个测试

如果使用三个并行作业,则第一个作业(slice0)将运行编号为 0 和 3 的测试文件,第二个作业(slice1)将运行编号为 1 和 4 的测试文件,第三个作业(slice2)将运行编号为 2 和 5 的测试文件。

3 个切片中的 6 个测试

代码示例

此 .NET Core 示例使用 --list-tests--filter 参数 dotnet test 对测试进行切片。 测试是使用 NUnit 运行的。 然后,测试 DotNetCoreCLI@2 任务创建的测试结果将发布到服务器。 将(导入到 Azure Repos 或 Azure DevOps Server)或分支(到 GitHub)此存储库:

https://github.com/idubnori/ParallelTestingSample-dotnet-core

此 Python 示例使用 PowerShell 脚本来切片测试。 测试是使用 pytest 运行的。 然后,pytest 创建的 JUnit 样式测试结果将发布到服务器。 将(导入到 Azure Repos 或 Azure DevOps Server)或分支(到 GitHub)此存储库:

https://github.com/PBoraMSFT/ParallelTestingSample-Python

此 JavaScript 示例使用 bash 脚本来切片测试。 测试是使用 mocha 运行程序运行的。 然后,Mocha 创建的 JUnit 样式测试结果将发布到服务器。 将(导入到 Azure Repos 或 Azure DevOps Server)或分支(到 GitHub)此存储库:

https://github.com/PBoraMSFT/ParallelTestingSample-Mocha

示例代码包含 azure-pipelines.yml 存储库根目录中的文件,可用于创建管道。 按照 “创建第一个管道” 中的所有说明创建管道并查看测试切片作。

将并行度组合在一起进行大规模并行测试

在管道中使用并行作业时,管道将使用多个计算机并行运行每个作业。 大多数测试运行程序都提供在单个计算机上并行运行测试的功能(通常通过创建并行运行的多个进程或线程)。 这两种类型的并行度可以组合在一起进行大规模并行测试,这使得管道中的测试非常高效。

帮助和支持