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

Bog*_*SFT 56 c# parallel-processing unit-testing web-services visual-studio

我正在寻找并行运行测试套件的方法.

我知道 .testrunconfig设置.这允许您多路复用 CPU的数量.

我想并行运行1000个测试.这是有道理的,因为我正在测试一个Web服务,所以在测试中花费的90%的时间都在等待服务响应.

关于如何解决这个问题的任何想法?测试是为VS编写的,但我愿意在VS之外运行它们.

稍后编辑:Visual Studio测试团队已在VS 2015 Update 1中添加了此内容.请参阅Mark Sowul的答案.

Ran*_*ric 29

通过使用Visual Studio Team Test Blog中的方法,您最多可以获得5个

请记住,使用它可能会出现并发问题,因为MSTest并没有完全隔离每个测试(静态结转,例如,对于运行一次的代码使事情变得有趣).

(不知道为什么限制为5,但如果parallelTestCount设置为大于5,MSTest将不会并行运行它们.根据下面的注释,此规则显然随Visual Studio 2013而变化)


Ale*_*lex 26

此页面上的大多数asnwers忘记提及MSTest 在单独的程序集中并行化测试.你必须将你的单元测试分成多个.dll来对其进行并行化.

但!最近的版本- MSTest的V2 -现在CAN并行"在组装"(耶!),你只需要安装一对夫妇的NuGet包的测试项目- TestFramework和TestAdapter -喜欢这里描述https://blogs.msdn.microsoft的.com/DEVOPS/2018/01/30/MSTEST-V2-在组装-并行测试执行/

然后只需将其添加到您的测试项目中

[assembly: Parallelize(Workers = 4, Scope = ExecutionScope.ClassLevel)]
Run Code Online (Sandbox Code Playgroud)

  • @Abr 通常程序集范围的属性放置在 `AssemblyInfo.cs` 中,但实际上您可以将其放置在任何文件中,由您决定。 (6认同)
  • 这个片段放在哪里? (4认同)

Mar*_*wul 21

Visual Studio 2015 Update 1添加了此功能. https://docs.microsoft.com/visualstudio/releasenotes/vs2015-update1-vs#misc

对于Update 2,在Test Explorer窗格顶部的工具栏中有一个UI切换按钮(在'grouping'和'search'框之间).

对于Update 1,在.runsettings中设置以下内容

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
  <RunConfiguration>
    <MaxCpuCount>0</MaxCpuCount>
   </RunConfiguration>
</RunSettings>
Run Code Online (Sandbox Code Playgroud)

MaxCpuCount的值具有以下语义:

•'n'(其中1 <= n <=核心数):将启动upto'n'进程.

•任何其他值的"n":启动的进程数量与计算机上的可用核心数量一样多.

  • 测试在容器级别进行并行化(在C#的情况下,就是程序集),因此它将并行地运行来自不同程序集的测试.在新模型中按顺序执行同一程序集中的测试. (4认同)
  • 我们有测试DLL有数百个测试,有些可以并行运行,有些则不能.有没有一种方法可以归因于安全和不安全的测试类/方法?我通常想要选择一个或多个这些巨大的DLL并让它翻录. (3认同)
  • 要记住的一件事是并行性是在类级别而不是测试级别.我没有看到内置的方法来做你想要的,但你可以自己做,例如在ClassInitialize` /`ClassCleanup`中使用命名的互斥锁.不幸的是,你可能会在一段时间内阻止并行性的那些测试(例如,所有四个"并行测试"都是使用互斥锁的测试),但这就像我认为你能得到的那样好. (3认同)

Igo*_*gor 8

我发现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>
Run Code Online (Sandbox Code Playgroud)

参考资料可以在这里找到http://msdn.microsoft.com/en-us/library/vstudio/jj155796.aspx


JPT*_*rne 5

上面的答案肯定有助于为我澄清一些事情,但是,这一点来自John Koerner的博客:https://johnkoerner.com/vs2015/parallel-test-execution-in-visual-studio-2015-update-1-might-not - 你期待什么/我们失踪的那一点.

"并行测试执行利用机器上的可用内核,并通过在每个可用内核上启动测试执行引擎作为一个独特的进程,并将其交给容器(程序集,DLL或包含要执行的测试的相关工件)来实现,值得进行的测试."

- >"单独的容器位是我缺少的部分.为了使我的测试并行运行,我需要将测试分成不同的测试程序集.在这之后,我看到不同程序集中的测试并行运行."

所以,是的,我们通过使用方便的"并行运行"标志在VSTS中并行运行测试,但这还不够,我们不得不将测试分成单独的测试项目.从逻辑上分组,而不是每个测试的项目,这将是荒谬的