【问题标题】:azure devops: running unit tests in parallelazure devops:并行运行单元测试
【发布时间】:2021-01-05 17:36:41
【问题描述】:

我们有超过 20 个程序集,我们需要通过将它们分成 2 个组来运行单元测试,这些组在 2 个不同的 VMS 上运行。两个虚拟机相互独立并并行运行。但是,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 似乎什么也没做。

【问题讨论】:

  • 你能显示./templates/run-unittests.yml吗?
  • 我添加了更多细节。标志 runInParallel 似乎没有做任何事情
  • 您的虚拟机有多个内核?您在 run.settings 文件中限制并行性?
  • @Matt,Azure Devops 提供给我们的代理。我们不拥有它们; Azure DevOps 使它们可供我们使用。 AFAIK 我们无法更新机器上的内核数量,因为我们不拥有它们,但我认为它们将是多核机器。

标签: azure-devops nunit azure-pipelines azure-pipelines-release-pipeline azure-pipelines-build-task


【解决方案1】:

runInParallel 参数表示在多核机器上并行运行测试。如果设置,测试将利用机器的可用内核并行运行。如果在运行设置文件中指定,这将覆盖 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

【讨论】:

  • 我没有看到MaxCpuCount 设置。我们的虚拟机有 2 个内核。我已经用default.runsettings 更新了上面的详细信息。不过,正如您所说,runInParallel 应该覆盖 MaxCpuCount
  • 您选择在虚拟机上运行的代理吗?如果直接在 VM 上运行测试,结果如何?
  • 董,不确定您所说的选择虚拟机上的代理是什么意思,我如何以及在哪里可以检查?据我所知,我们并没有专门选择代理。也不确定直接在虚拟机上运行文本是什么意思。我认为这就是我们正在做的事情。我觉得这可能是 testAssemblyVer2 的问题:| $(Pipeline.Workspace)\${{ parameters.artifactName }}**\MyProject.${{ testAssembly }}.Tests.dll。我们在 for 循环中逐个传递测试 dll,可能我们需要一次性传递所有这些 dll 吗?
  • 您使用哪个代理池?测试是否在 VM 机器上运行?您可以尝试一次性通过所有测试 dll 以查看结果。
  • 我们正在使用 azure dev-ops 提供的代理池。
猜你喜欢
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
相关资源
最近更新 更多