c# - 整合測試 - 網站單元測試




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

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

我知道通過在測試解決方案中的.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