繁体   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