簡體   English   中英

如何並行運行單元測試(MSTest)?

[英]How to run unit tests (MSTest) in parallel?

我正在尋找並行運行測試套件的方法。

我知道.testrunconfig設置。 這允許您多路復用CPU 的數量。

我想並行運行 1000 個測試。 這是有道理的,因為我正在測試一個 Web 服務,所以在測試中花費的 90% 的時間都在等待服務響應。

關於如何解決這個問題的任何想法? 這些測試是為 VS 編寫的,但我願意在 VS 之外運行它們。

稍后編輯:Visual Studio 測試團隊已在 VS 2015 Update 1 中添加了此內容。請參閱下面的 Mark Sowul 回答。

此頁面上的大多數答案都忘記提及 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]禁用特定測試的並行執行。

使用Visual Studio 團隊測試博客中的方法最多可以獲得 5 個

請記住,使用它可能存在並發問題,因為 MSTest 並沒有完全隔離每個測試(例如,靜態結轉,使原本打算運行一次的代碼變得有趣)。

(不知道為什么限制是 5,但如果parallelTestCount設置為 5 以上,MSTest 將不會並行運行它們。根據下面的評論,此規則顯然隨 Visual Studio 2013 更改)

Visual Studio 2015 Update 1 添加了這個。 https://docs.microsoft.com/visualstudio/releasenotes/vs2015-update1-vs#misc

對於更新 2,測試資源管理器窗格頂部的工具欄中有一個 UI 切換按鈕(在“分組”和“搜索”框之間)。

對於更新 1,在 .runsettings 中設置以下內容

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

MaxCpuCount 的值具有以下語義:

• “n”(其中 1 <= n <= 內核數):最多將啟動“n”個進程。

• 任何其他值的“n”:啟動的進程數將與機器上的可用內核數一樣多。

我發現 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

以上答案確實幫助我澄清了事情,但是,這一點來自 John Koerner 的博客: https : //johnkoerner.com/vs2015/parallel-test-execution-in-visual-studio-2015-update-1-might-not -be-what-you-expect/是我們遺漏的一點。

“並行測試執行利用機器上的可用內核,並通過在每個可用內核上將測試執行引擎作為一個不同的進程啟動,並將其交給一個容器(程序集、DLL 或包含要執行的測試的相關工件)來實現,值得執行的測試。”

--> "單獨的容器位是我缺少的部分。為了讓我的測試並行運行,我需要將我的測試拆分成單獨的測試程序集。這樣做之后,我看到不同程序集中的測試並行運行。”

所以是的,我們通過使用他們方便的“並行運行”標志讓測試在 VSTS 中並行運行,但這還不夠,我們不得不將我們的測試分成單獨的測試項目。 當然按邏輯分組,而不是每個測試的項目,這很荒謬

  1. 確保數據表中的第一列是唯一的 ID。
  2. 創建一個接受 DataRow 並且不返回任何內容的 AsyncExecutionTask 委托。
  3. 使用接受 DataRow 和 AsyncExecutionTask 委托的 AsyncExecutionContext 方法創建靜態類 (ParallelTesting)。
  4. 在靜態類中添加一個靜態的 BatchStarted 屬性。
  5. 在靜態類中添加一個靜態 AsyncExecutionTests Dictionary 屬性。
  6. 在 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; }
  7. 現在像這樣使用這個類:

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

注意:您將不得不對異常進行一些修補以使它們正確冒泡(您可能在這里有一個聚合異常,您需要從中獲得第一個異常)。 顯示的每個測試執行所需的時間將不再准確。 您還需要在最后一行完成后清理 ParallelTesting 類。

如何工作的:測試邏輯被包裝在一個 lambda 中並傳遞給一個靜態類,該類將在第一次調用(第一行執行)時為每行測試數據執行一次邏輯。 對靜態類的連續調用只是等待預先啟動的測試任務完成。

通過這種方式,測試框架對 TestMethod 所做的每次調用只是收集已經運行的相應測試的測試結果。

可能的改進:

  • 使 AsyncExecutionContext 采用 maxSynchronousTasks 參數。
  • 查看框架如何跨非托管代碼移動完整的堆棧跟蹤,以查看是否可以將 Task.Exception 傳遞給 Visual Studio 測試框架,而無需重新拋出和破壞堆棧跟蹤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM