Azure devops:并行运行单元测试

问题描述

我们有20多个程序集,需要通过将它们分为两个组运行在2个不同的VMS上,以运行单元测试。两个VM彼此独立并并行运行。但是,VM内的测试按顺序运行,并且需要很长时间才能完成(我们有很多UT)。 像这样:

- job: UnitTests1
timeoutInMinutes: 50
pool:
  vmImage: $(hostedPool)
steps:
  - template: ./templates/run-unittests.yml
    parameters:
      artifactName: $(buildArtifact)
      testAssemblies: ['assembly1','assembly2','assembly3','assembly4','assembly5','assembly6','assembly7','assembly8','assembly9','assembly10']
      runName: UnitTest1

- job: UnitTests2
timeoutInMinutes: 35
pool:
  vmImage: $(hostedPool)
steps:
  - template: ./templates/run-unittests.yml
    parameters:
      artifactName: $(buildArtifact)
      testAssemblies: ['assembly11','assembly12','assembly13','assembly14','assembly15','assembly16','assembly17','assembly18','assembly19','assembly20']
      runName: unitTest2

run-unittests.yml

- ${{ each testAssembly in parameters.testAssemblies }}:
- task: VSTest@2
displayName: 'UT: ${{ testAssembly }}'
inputs:
  vsTestVersion: toolsInstaller
  testAssemblyVer2: |
    $(Pipeline.Workspace)\${{ parameters.artifactName }}\**\MyProject.${{ testAssembly }}.Tests.dll
  runSettingsFile: build/default.runsettings
  runInParallel: false                                       
  runOnlyImpactedTests: false                                 # Test Impact Analysis was evaluated and returns incorrect results
  codeCoverageEnabled: true                                   # collect code coverage
  platform: '$(buildplatform)'
  configuration: '$(buildConfiguration)'

default.runsettings进行测试

<!-- Configurations that affect the Test Framework -->
<runconfiguration>
<MaxcpuCount>1</MaxcpuCount>
<TargetPlatform>x64</TargetPlatform>
<ParallelizeAssemblies>false</ParallelizeAssemblies>
<ParallelizeTestCollections>false</ParallelizeTestCollections>

如何启动多个线程/进程以在1个VM中并行运行这些UT。 runInParallel似乎无能为力。

解决方法

runInParallel参数表示在多核计算机上并行运行测试。如果设置,测试将利用计算机的可用内核并行运行。如果在您的运行设置文件中指定了MaxCpuCount,它将覆盖MaxCpuCount。单击here,以了解有关如何并行运行测试的更多信息。因此,您需要检查您的VM是否为多核,并检查是否在runsettings文件中指定了MaxCpuCount。

您还可以参考以下文档,以使用Visual Studio测试(VSTest)任务跨多个代理并行运行测试:

https://docs.microsoft.com/en-us/azure/devops/pipelines/test/parallel-testing-vstest?view=azure-devops#massively-parallel-testing-by-combining-parallel-pipeline-jobs-with-parallel-test-execution