我知道常规的 MS-Test 单元测试可以通过在 .testresults
文件中指定 parallelTestCount
属性在多核机器上并行化(当然有警告)测试解决方案。像这样,
<Execution parallelTestCount="1">
<TestTypeSpecific />
<AgentRule name="Execution Agents"></AgentRule>
</Execution>
MSDN 上的更多信息:Executing Unit Tests in parallel on a multi-CPU/core machine
但是,我有一个数据驱动的测试,像这样,这只是一个测试,但输入来自 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 enum属性上的只是它访问数据的方式,另一个选项是Random,它仍然是串行的而不是并行的。
最佳答案
为了并行化此单元测试,您需要 doStuffA()
和 doStuffB()
才能对数据的子集进行操作(例如 block 甚至一次 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);
});
关于c# - 如何在 Visual Studio 2010 中并行化数据驱动的单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4046362/