为任何测试运行程序并行运行测试

Azure Pipelines |Azure DevOps Server 2020 |Azure DevOps Server 2019

运行测试来验证对代码的更改是保持质量的关键所在。 若要成功进行持续集成,您必须拥有一个适用于每个生成的好的测试套件。 但是,随着代码库的增长,回归测试套件也会随之增长,并且运行完全回归测试可能需要较长时间。 有时,测试本身可能会长时间运行-如果编写端到端测试,则通常会出现这种情况。 这可以降低客户价值的提高速度,因为管道无法更快地处理生成。

并行运行测试是提高 CI/CD 管道效率的极佳方式。 这可以通过使用云提供的额外容量轻松完成。 本文介绍如何使用多个代理来处理作业,从而并行化测试。

先决条件

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

设置并行作业

在 YAML 中指定 "parallel" 策略,并指示应分派的作业数。 将变量 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的测试文件,第二个 job (slice1) 将运行编号为1、3和5的测试文件。

2个扇区中的测试

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

3个扇区中的测试

代码示例

此 .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 ,可用于创建管道。 按照 创建第一个管道 中的所有说明创建管道,并查看操作中的测试切片。

合并大规模并行测试的并行度

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

帮助和支持