2010-10-28 82 views
14

我知道通過在測試解決方案中的.testresults文件中指定parallelTestCount屬性,可以在多核機器上並行處理常規的ms-test單元測試(當然有警告)。與此類似,如何在Visual Studio 2010中並行化數據驅動的單元測試?

<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和進來運行1000s的記錄通過相同的測試。

[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 enum只是它訪問數據的方式,另一個選項是Random,它仍然是串行的而不是並行的。

+0

你使用哪種語言? C#? – 2013-05-31 15:42:10

+0

C#,是的,當然! – Vin 2013-08-19 02:30:19

+0

你使用的是什麼版本的.Net?另外,你能否提供一些有關如何設置TestContext的細節? – 2017-01-03 20:21:48

回答

-1

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

0

爲了並行化本單元測試,您需要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); 
}); 
0

這似乎有點複雜,但聽我把話說完。 MSTest中存在一個限制,即您無法實際並行運行數據驅動的測試。 我過去爲解決這個問題所做的工作就是在visual studio中創建一個「自定義工具」。

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

OR

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

我們創建做了以下的自定義工具:

  1. 打出CSV到多個CSV文件,每個只有一行。
  2. 爲每個新生成的cvs生成一個單獨的測試。

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

這聽起來有點過頭了,但如果您在構建自定義工具方面做得很好,那實際上是一個非常流暢的過程。

相關問題