Yaml 策略忽略 MSTest 类并行化

Yaml strategy ignores MSTest Class Parallelization

提问人:Oxana Viktorovna 提问时间:10/20/2023 更新时间:10/20/2023 访问量:72

问:

我们有 MSTest 框架,可在类级别设置并行化。这意味着,类中的测试是按顺序运行的。来自不同类的测试可以并行运行。

[assembly: Parallelize(Workers = 0, Scope = ExecutionScope.ClassLevel)]

这些测试在启用策略的 ADO yaml 管道上运行。

  - job: UITestsRun
    strategy:
      parallel: 10
    steps:
    - checkout: none
    - download: ${{parameters.TestDllArtifactName}}
    - task: VSTest@2
      inputs:
        testAssemblyVer2: '**\Automation.Tests.dll'
        searchFolder: 'TestDllPath'
        resultsFolder: 'TestResults'
        testFiltercriteria: '${{parameters.AdditionalTestCriterias}}'
        runSettingsFile: 'testsettings.runsettings'
        publishRunAttachments: true
        batchingBasedOnAgentsOption: customBatchSize
        customBatchSizeValue: 10
        rerunFailedTests: true
        rerunFailedThreshold: 100
        rerunMaxAttempts: 1

我们注意到的是,来自同一类的测试可以在不同的作业(代理)上同时运行。

例如,作业1 正在运行 ClassA。Test1,而作业2 正在运行 ClassA。测试2.

这导致了很多失败,因为测试不是这样设计的。

我们希望测试在并行作业中运行,同时也考虑了类级并行化。 有谁知道有没有办法做到这一点?

azure-devops 自动测试 mstest azure-pipelines-yaml

评论

0赞 Jeremy Thompson 10/20/2023
单元测试应该是原子的,这是一个热门趋势,其中构建由多个实例/代理完成。如果您使用 和 ,您能否强制类中的所有测试都由一个代理处理,即使它们断言。True() 试图欺骗它?或者您可以尝试用 ?或者,以原子方式编写它们,使它们独立于一个和另一个。[SetUp][TearDown][DoNotParallelize]
0赞 Oxana Viktorovna 10/20/2023
@JeremyThompson,不幸的是,它是对复杂应用程序的功能性 UI 测试,很难(读起来不可能)实现原子化。我们需要并行运行测试,但要打开;y 在班级水平上。[DoNotParallelize] 将阻止它。这将导致执行时间的大幅增加。我不确定我是否得到了您对 Setup TearDown 的建议。我们确实有用于测试以设置一些通用数据/设置的那些。如何使用它来强制在同一代理上运行测试?
0赞 Jeremy Thompson 10/20/2023
没错,您正在执行 End 2 End (e2e) 测试。如果使用绑定控件将所有 Winform 控件“绑定”到业务逻辑层,则将 GUI 从逻辑中抽象出来 - 这样您只需要对业务逻辑进行测试!WRT E2E 测试和 FatClients 有一些工具可以获取“Selenium”行为: SikuliX 是免费的,只需观看 youtube 视频即可。使用代码,我可能会切换到 Nunit 并使用 和 包装 Test 类[assembly: Parallelizable(ParallelScope.Fixtures)][TestFixture]
0赞 Oxana Viktorovna 10/20/2023
不幸的是,NUnit 没有区别,即使所有属性都在位置上,管道作业仍然会忽略它

答:

1赞 Bright Ran-MSFT 10/20/2023 #1

默认情况下,VSTest@2任务应用“basedOnTestCases”(基于测试和代理的数量)作为批量测试切片方法。此方法仅根据参与测试运行的测试和代理的数量来划分测试。因此,这可能会将来自同一测试程序集的测试划分为不同的并行作业来运行。

对于您的情况,您可以尝试选择“basedOnAssembly”(基于测试程序集)方法。此方法将来自同一测试程序集的测试划分为要运行的相同并行作业。同一测试程序集中的测试按顺序运行。

enter image description here

有关详细信息,请参阅“设置并行测试 (VSTest) - 测试切片”。

评论

0赞 Jeremy Thompson 10/20/2023
OP:为了更精细地控制这一点,您可以将测试进一步拆分为不同的项目。
0赞 Oxana Viktorovna 10/20/2023
目前我们有 100+ 测试类。因此,如果要将每个类移动到新项目下,它将是 100+ 个项目。似乎不是一个可维护的解决方案:(
0赞 Bright Ran-MSFT 10/20/2023
@OxanaViktorovna,只需在管道中VSTest@2任务上尝试“basedOnAssembly”方法即可。
0赞 Oxana Viktorovna 10/23/2023
@BrightRan-MSFT,我已经使用 basedOnAssembly 执行了运行。这对我们不起作用。它在同一作业中运行所有测试。所以没有并行化代理 whise
0赞 Bright Ran-MSFT 10/23/2023
@OxanaViktorovna,看起来,您只有一个测试程序集。