Web Services 如何并行运行单元测试(MSTest)?

8tntrjer  于 2022-11-15  发布在  其他
关注(0)|答案(6)|浏览(149)

我正在寻找并行运行测试套件的方法。
我知道.testrunconfig设置。这允许您多路复用CPU的数量。
我想并行运行1000个测试。这是有意义的,因为我正在测试一个Web服务,所以测试中90%的时间都花在等待服务响应上。
有什么想法吗?这些测试是为VS编写的,但是我愿意在VS之外运行它们。

稍后编辑:Visual Studio测试团队已经在VS 2015 Update 1中添加了这一点。请参见下面Mark Sowul的回答。

wvmv3b1j

wvmv3b1j1#

本页上的大多数答案都忘记提到MSTest将测试并行化在单独的程序集中。您必须将单元测试拆分为多个.dll文件才能将其并行化。
但是!最近的版本- MSTest V2 -现在可以并行化“汇编内”(耶!)您只需要在您的测试项目中安装几个nuget包- TestFramework和TestAdapter -就像这里描述的https://blogs.msdn.microsoft.com/devops/2018/01/30/mstest-v2-in-assembly-parallel-test-execution/
然后只需将其添加到测试项目中

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

编辑:您还可以在测试方法上使用[DoNotParallelize]禁用特定测试的并行执行。

ix0qys7i

ix0qys7i2#

使用方法from the Visual Studio Team Test Blog最多可以得到5
请记住,使用此方法可能会出现并发问题,因为MSTest并没有完全隔离每个测试(例如,静态信息会延续,使原本只运行一次的代码变得有趣)。
(No我知道为什么限制为5,但是如果parallelTestCount设置为大于5,MSTest将不会并行运行它们。根据下面的注解,此规则在Visual Studio 2013中明显发生了变化)

bpzcxfmw

bpzcxfmw3#

Visual Studio 2015更新1添加了此功能。https://learn.microsoft.com/visualstudio/releasenotes/vs2015-update1-vs#misc
对于Update 2,在“测试资源管理器”窗格顶部的工具栏中有一个UI切换按钮(在“分组”和“搜索”框之间)。
对于Update 1,请在.runsettings中设置以下内容

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
  <RunConfiguration>
    <MaxCpuCount>0</MaxCpuCount>
   </RunConfiguration>
</RunSettings>

MaxCpuCount的值具有以下语义:
· 'n'(其中1〈= n〈=内核数量):将启动多达'n'个进程。
·任何其他值的“n”:启动的进程数将与计算机上的可用核心数一样多。
另请注意,对于MSTest V2,您可以在类别层级套用并行,也可以使用组件指示词:

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

或.runsettings:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
  <!-- MSTest adapter -->
  <MSTest>
    <Parallelize>
      <Workers>4</Workers>
      <Scope>ClassLevel</Scope>
    </Parallelize>
  </MSTest>
</RunSettings>

程序集、类或方法可以使用[DoNotParallelize]退出
请参阅https://github.com/Microsoft/testfx-docs/blob/master/RFCs/004-In-Assembly-Parallel-Execution.md

5lwkijsr

5lwkijsr4#

我发现C:\Program Files(x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe将使用.testsettings文件运行并行测试,该文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="TestSettings1" id="21859d0f-7bdc-4165-b9ad-05fc803c9ee9" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <Description>These are default test settings for a local test run.</Description>
  <Deployment enabled="false" />
  <Execution parallelTestCount="8">
    <TestTypeSpecific>
      <UnitTestRunConfig testTypeId="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b">
        <AssemblyResolution>
          <TestDirectory useLoadContext="true" />
        </AssemblyResolution>
      </UnitTestRunConfig>
    </TestTypeSpecific>
    <AgentRule name="Execution Agents">
    </AgentRule>
  </Execution>
</TestSettings>

可在此处找到参考http://msdn.microsoft.com/en-us/library/vstudio/jj155796.aspx

r1wp621o

r1wp621o5#

上面的回答肯定有助于澄清事情对我来说,但是,这一点从约翰Koerner的博客:https://johnkoerner.com/vs2015/parallel-test-execution-in-visual-studio-2015-update-1-might-not-be-what-you-expect/是我们遗漏的部分。
并行测试执行利用计算机上的可用内核,并通过在每个可用内核上启动测试执行引擎作为一个不同的进程,并将其作为一个容器(程序集、DLL或包含要执行的测试的相关工件)来实现,值得执行的测试。
--〉“单独的容器位是我缺少的部分。为了使我的测试并行运行,我需要将我的测试拆分成单独的测试程序集。这样做之后,我看到不同程序集中的测试并行运行。”
因此,我们使用方便的'run in parallel'标志在VSTS中并行运行测试,但这还不够,我们必须将测试拆分为单独的测试项目。

omhiaaxx

omhiaaxx6#

1.确保DataTable中的第一列是唯一的ID。
1.创建一个接受DataRow且不返回任何内容的AsyncExecutionTask委托。
1.使用接受DataRow和AsyncExecutionTask委派的AsyncExecutionContext方法建立静态类别(ParallelTesting)。
1.在静态类别中,加入静态BatchStarted属性。
1.在静态类别中,加入静态AsyncExecutionTests Dictionary属性。
1.在AsyncExecutionContext方法中添加以下内容:

public static void AsyncExecutionContext(DataRow currentRow, AsyncExecutionTask test) 
{
    if(!BatchStarted)
    {
        foreach(DataRow row in currentRow.Table)
        {
            Task testTask = new Task(()=> { test.Invoke(row); });
            AsyncExecutionTests.Add(row[0].ToString(), testTask);
            testTask.Start();
        }
        BatchStarted = true;
    }
    Task currentTestTask = AsyncExecutionTests[row[0].ToString()];
    currentTestTask.Wait();
    if(currentTestTask.Exception != null) throw currentTestTask.Exception;
}

1.现在使用类别,如下所示:

[TestMethod]
public void TestMethod1()
{
    ParallelTesting.AsyncExecutionContext(TestContext.DataRow, (row)=>
        {
            //Test Logic goes here.
        }
    );
}

**注意:**您必须对异常进行一些修改,以使它们正确冒泡(您可能在此处有一个聚合异常,您需要它的第一个异常)。显示的每个测试执行所用的时间量将不再准确。您还需要在完成最后一行后清除ParallelTesting类。
**工作原理:**测试逻辑被 Package 在lambda中,并传递给一个静态类,当它第一次被调用时(第一行被执行),该静态类将为每一行测试数据执行一次逻辑。对静态类的连续调用只需要等待预启动的测试Task完成。

通过这种方式,测试框架对TestMethod的每次调用都只是收集已经运行的相应测试的测试结果。

可能的改进:

  • 使异步执行上下文接受maxSynchronousTasks参数。
  • 研究框架如何跨非托管代码移动完整的堆栈跟踪,以查看是否可以将Task.Exception传递到visual studio测试框架,而不会重新引发和破坏堆栈跟踪。

相关问题