簡體   English   中英

如何在 Visual Studio 2010 中並行化數據驅動的單元測試?

[英]How to parallelize a Data-Driven unit test in Visual Studio 2010?

我知道通過在測試解決方案的.testresults文件中指定parallelTestCount屬性,可以在多核機器上並行化常規的 MS-Test 單元測試(當然有警告)。 像這樣,

<Execution parallelTestCount="1">
    <TestTypeSpecific />
    <AgentRule name="Execution Agents"></AgentRule>
</Execution>

更多信息: http : //blogs.msdn.com/b/vstsqualitytools/archive/2009/12/01/executing-unit-tests-in-parallel-on-a-multi-cpu-core-machine.aspx

但是,我有一個數據驅動的測試,就像這樣,這只是一個測試,但輸入來自 csv 並通過同一個測試運行 1000 條記錄

[DeploymentItem("InputDataRows.csv"), Timeout(37800000), DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\InputDataRow.csv", "InputDataRow#csv", DataAccessMethod.Sequential)]                
[TestMethod]
public void RunProcessing()
{
    int userId = Convert.ToInt32(TestContext.DataRow[0].ToString());
    int connId = Convert.ToInt32(TestContext.DataRow[1].ToString());
    string xml = TestHelper.GetDataFromDb(userId, connId);
    a = doStuffA(xml); 
    b = doStuffB(xml);
    Assert.IsTrue(a == b);
}

因為這是一個緩慢的過程,我正在考慮並行化這個單元測試。

屬性上的Sequential 枚舉只是它訪問數據的方式,另一個選項是 Random,它仍然是串行而不是並行。

為了並行化這個單元測試,你需要doStuffA()doStuffB()才能對數據的一個子集進行操作(例如一次一個塊甚至一行你的 csv)。 如果您可以重構您的方法以這種方式運行,您可以利用任務或並行 foreach 循環,以便此測試並行執行。 假設您的方法被重構以處理一行 csv,您可以執行以下操作:

int userId = Convert.ToInt32(TestContext.DataRow[0].ToString());
int connId = Convert.ToInt32(TestContext.DataRow[1].ToString());
string xml = TestHelper.GetDataFromDb(userId, connId);
var rows = xml.Split('\n');

Parallel.ForEach(rows, (row) =>
{
    var a = doStuffOnRowA(row);
    var b = doStuffOnRowB(row);
    Assert.AreEqual(a, b);
});

這可能看起來有點復雜,但請聽我說。 MSTest 中存在一個限制,即您實際上無法並行運行數據驅動的測試。 我過去為解決這個問題所做的是在 Visual Studio 中創建一個“自定義工具”。

https://msdn.microsoft.com/en-us/library/bb166508.aspx

https://msdn.microsoft.com/en-us/library/bb166817.aspx

我們創建的自定義工具執行以下操作:

  1. 將 csv 拆分為多個 csv 文件,每個文件只有一行。
  2. 為每個新生成的 csv 生成單獨的測試。

生成這些測試時,我們將特定的測試屬性放在它們上面,因此我們可以指定僅運行具有該屬性的測試。

這聽起來有點誇張,但是如果您很好地構建了自定義工具,這實際上是一個非常順利的過程。

如果 xml 中沒有數據被更改(或者方法沒有修改 xml 的相同部分),那么你可以做..

var numCompleted = 0;
var a = Task.Run(() => { doStuffOnRowA(xml); });
var b = Task.Run(() => { doStuffOnRowB(xml); });
Task.WaitAll(new Task[2] { a, b });

如果您復制和粘貼這種偽代碼,這可能不會運行。 不完全平行,但至少會在同一時間運行!

不支持數據驅動測試的並行執行。 請參閱此處: RFC 004 - 組裝內並行執行

據我所知:測試中的單個數據行不是並行運行的。 但是如果你有多個單元測試,它們會並行運行。

暫無
暫無

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

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