【问题标题】:Running nUnit tests in a multithreaded fashion以多线程方式运行 nUnit 测试
【发布时间】:2010-12-04 21:55:11
【问题描述】:

是否可以以多线程方式运行 nunit 测试?有没有跑步者可以提供这个?

在有人跳入“单元测试”概念之前,让我解释一下:这些不是单元测试我们也在使用 nunit 进行功能/集成测试,其中一些测试非常慢,有很多等待状态。因此,多线程可以极大地帮助他们。

我知道作为最后的手段,我可​​以在测试中使用自己的多线程,但这会带来不必要的开销。

【问题讨论】:

  • +1 用于解释场景:)
  • 作为一个经验丰富的 stackoverflower,我知道当你问这样的问题时会发生什么:D

标签: .net multithreading unit-testing nunit


【解决方案1】:

我正在开发MultithreadedTC Java library 的.NET 端口。我的端口叫Ticking Test,源代码发布在GitHub上。

TickingTest 最初并不打算做您正在尝试的事情,但它可能会起作用。它允许您编写一个测试类,其中包含几个标有 TestThread 属性的方法。每个线程可以等待某个滴答计数到达,或者断言它认为当前滴答计数应该是什么。当所有当前线程都被阻塞时,协调器线程会增加滴答计数并唤醒所有等待下一个滴答计数的线程。如果您有兴趣,请查看MultithreadedTC overview 以获取示例。 MultithreadedTC 是由编写FindBugs 的一些人编写的。

我在一个小项目上成功使用了我的端口。主要缺失的功能是我无法在测试期间跟踪新创建的线程。

【讨论】:

    【解决方案2】:

    我们设置了一个递归 MSBuild 脚本来同时运行单元测试 dll,如下所示:

      <Target Name="UnitTestDll">
        <Message Text="Testing $(NUnitFile)" />
        <ItemGroup>
          <ThisDll Include="$(NUnitFile)"/>
        </ItemGroup>
        <NUnit ToolPath="$(NUnitFolder)" Assemblies="@(ThisDll)" OutputXmlFile="$(TestResultsDir)\%(ThisDll.FileName)-test-results.xml" ExcludeCategory="Integration,IntegrationTest,IntegrationsTest,IntegrationTests,IntegrationsTests,Integration Test,Integration Tests,Integrations Tests,Approval Tests" ContinueOnError="true" />
      </Target>
    
      <Target Name="UnitTest" DependsOnTargets="Clean;CompileAndPackage">
          <Message Text="Run all tests in Solution $(SolutionFileName)" />
          <CreateItem Include="$(SolutionFolder)**\bin\$(configuration)\**\*.Tests.dll" Exclude="$(SolutionFolder)\NuGet**;$(SolutionFolder)**\obj\**\*.Tests.dll;$(SolutionFolder)**\pnunit.tests.dll">
            <Output TaskParameter="Include" ItemName="NUnitFiles" />
          </CreateItem>
        <ItemGroup>
          <TempProjects Include="$(MSBuildProjectFile)">
            <Properties>NUnitFile=%(NUnitFiles.Identity)</Properties>
          </TempProjects>
        </ItemGroup>
        <RemoveDir Directories="$(TestResultsDir)" Condition = "Exists('$(TestResultsDir)')"/>
        <MakeDir Directories="$(TestResultsDir)"/>
    
        <MSBuild Projects="@(TempProjects)" BuildInParallel="true" Targets="UnitTestDll" />
      </Target>
    

    你显然仍然需要你的编译目标(或者在我们的例子中是 CompileAndPackage)来实际构建测试 dll。

    这也会弄乱大多数报告工具的 NUnit 结果,但我们已经遇到了这个问题,我们编写了一个工具来帮助解决这个问题:https://github.com/15below/NUnitMerger

    【讨论】:

      【解决方案3】:

      我不敢相信没有列出 MSTest。 Visual Studio 多年来一直支持多个并发测试。

      【讨论】:

      • MSTest 单元测试工具?我想您可能指的是仅在 Visual Studio Ultimate 版中可用的性能负载测试工具。 NUnit 已经测试了一段时间的并发测试,但作者希望进行集成测试,并且需要的不仅仅是一个简单的测试运行器。
      【解决方案4】:

      当然,我们也必须有 TeamCity 支持 ;-)

      据称 NUnit3 将支持多线程。

      【讨论】:

        【解决方案5】:

        这是对 PNUint http://www.codicesoftware.com/opdownloads2/oppnunit.aspx 的引用。我们使用它作为环境的一部分来负载测试具有广泛 ajax 功能的 Web 应用程序

        【讨论】:

          【解决方案6】:

          试试Pnunit

          【讨论】:

            【解决方案7】:

            您可能想看看 Overshore 多线程测试框架,它有一个 ThreadManager 类,您可以随时稍微扩展以添加“失败”测试的概念。

            http://weblogs.asp.net/rosherove/archive/2007/06/22/multi-threaded-unit-tests-with-osherove-threadtester.aspx

            如果你只使用断言,你可以计算异常。

            祝你好运

            ps:为什么不在进程中运行几个 nant/nunit-runner?

            【讨论】:

            • 是的,我已经看到了,但是该代码与仅在您自己的线程池中运行线程没有任何不同(或者我错过了什么)。这不是什么聪明的东西,比如 [ThreadTest] - 现在那会很酷 :) 实际上运行多个 nUnit 实例并不是一个坏主意,只是有点混乱并且需要相当多的体力劳动。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多