为任何测试运行程序并行运行测试
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
运行测试来验证对代码的更改是保持质量的关键。 要使持续集成实践取得成功,你必须有一个与每个生成一起运行的良好测试套件。 但是,随着代码库的增长,回归测试套件也趋于增长,运行完整回归测试可能需要很长时间。 有时,测试本身可能会长时间运行 - 如果编写端到端测试,通常就是这种情况。 这降低了交付客户价值的速度,因为管道无法足够快地处理生成。
并行运行测试是提高 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] 的测试文件,直到运行了所有测试文件。 例如,如果你有 6 个测试文件和 2 个并行作业,则第一个作业 (slice0) 将运行编号为 0、2 和 4 的测试文件,第二个作业 (slice1) 将运行编号为 1、3 和 5 的测试文件。
如果改用 3 个并行作业,则第一个作业 (slice0) 将运行编号为 0 和 3 的测试文件,第二个作业 (slice1) 将运行编号为 1 和 4 的测试文件,第三个作业 (slice2) 将运行编号为 2 和 5 的测试文件。
代码示例
此 .NET Core 示例使用 dotnet test
的 --list-tests
和 --filter
参数将测试分片。
测试是使用 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 中获取建议,通过开发人员社区获取支持