Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020
运行测试来验证代码更改是保持质量的关键。 若要使持续集成实践成功,必须具备一个良好的测试套件,该套件随每个生成一起运行。 但是,随着代码库的增长,回归测试套件往往也会增长,并且运行完整的回归测试可能需要很长时间。 有时,测试本身可能长时间运行 - 通常,如果编写端到端测试,则情况通常如此。 这降低了客户价值在管道无法足够快地处理生成时交付的速度。
并行运行测试是提高 CI/CD 管道效率的好方法。 这可以通过采用云提供的附加容量轻松完成。 本文讨论如何使用多个代理来处理作业来并行化测试。
先决条件
熟悉 代理 和 作业的概念。 每个代理一次只能运行一个作业。 若要并行运行多个作业,必须配置多个代理。 还需要足够的并行作业。
设置并行作业
在 YAML 中指定“并行”策略,并指示应调度多少个作业。
变量 System.JobPositionInPhase 并 System.TotalJobsInPhase 添加到每个作业。
jobs:
- job: ParallelTesting
strategy:
parallel: 2
小窍门
可以指定多达 99 个代理来纵向扩展大型测试套件的测试。
切片测试套件
若要并行运行测试,必须先对测试套件(或分区)进行切片,以便可以独立运行每个切片。 例如,可以使用两个代理并在每个代理上并行运行 500 个测试,而不是在单个代理上运行 1000 个大型测试套件。 或者,通过使用 8 个代理并在每个代理上并行运行 125 个测试,可以进一步减少运行测试所需的时间。
在作业中运行测试的步骤需要知道应运行哪个测试切片。 变量 System.JobPositionInPhase , System.TotalJobsInPhase 可用于此目的:
-
System.TotalJobsInPhase指示切片总数(可将其视为“totalSlices”) -
System.JobPositionInPhase标识特定切片(可以将它视为“sliceNum”)
如果将所有测试文件表示为单维数组,则每个作业都可以运行索引在 [sliceNum + totalSlices] 处编制索引的测试文件,直到运行所有测试文件。 例如,如果你有六个测试文件和两个并行作业,则第一个作业(slice0)将运行编号为 0、2 和 4 的测试文件,第二个作业(slice1)将运行编号为 1、3 和 5 的测试文件。
如果使用三个并行作业,则第一个作业(slice0)将运行编号为 0 和 3 的测试文件,第二个作业(slice1)将运行编号为 1 和 4 的测试文件,第三个作业(slice2)将运行编号为 2 和 5 的测试文件。
代码示例
此 .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 存储库根目录中的文件,可用于创建管道。 按照 “创建第一个管道” 中的所有说明创建管道并查看测试切片作。
将并行度组合在一起进行大规模并行测试
在管道中使用并行作业时,管道将使用多个计算机并行运行每个作业。 大多数测试运行程序都提供在单个计算机上并行运行测试的功能(通常通过创建并行运行的多个进程或线程)。 这两种类型的并行度可以组合在一起进行大规模并行测试,这使得管道中的测试非常高效。
帮助和支持
- 请参阅 我们的故障排除 页面
- 获取有关 Stack Overflow 的建议,并通过开发人员社区获取支持