2013-03-18 56 views
1

我写了一个测试用例Microsoft.VisualStudio.TestTools.UnitTesting,迭代了大量存储在磁盘文本文件中的测试用例。只要其中一个测试用例导致“单元测试”失败,我使用的Assert方法(AreEqualFail)将返回一个ErrorMessage,其中包含失败案例的详细信息。然而,这很好,即使有一个失败的案例,我也希望我的代码继续执行所有的测试用例,所以我可以看到所有失败案例的详细信息。大数据集的单测试方法

我从我的研究中了解到,根据Unit testing large data sets?中的定义,这不一定是单元测试,所以我也接受关于如何解决此问题的备选建议,而不仅仅是与Microsoft.VisualStudio.TestTools.UnitTesting或单元测试框架有关的问题。

回答

3

有一个概念叫做Data Driven Test。我在NUnit中使用了它,但也有一种doing it in Visual Studio Unit testing的方法。

这会为每个数据行创建一个测试,而不是整个数据集的单个测试。这将运行整个数据集的测试,并在失败时继续下一个数据项。最终结果将突出显示失败并成功处理每个测试用例。

+1

哇,这正是我所期待的。我刚刚使用CSV文件作为数据源。我现在可以看到我的测试的73个细节在一次命中运行。辉煌!唯一令人失望的是:我刚刚发现NCrunch不支持MSTest数据驱动测试... – Aligma 2013-03-18 02:02:39

+0

是的 - 在[NCrunch论坛](http://forum.ncrunch.net)中似乎有一个关于NCrunch-Mstest数据驱动测试的话题/yaf_postst180_ETA-of-MSTest-data-driven-tests.aspx)。倒霉。我猜你已经有了运行测试的脚本,在这种情况下,你也应该了解它们。 – 2013-03-18 03:45:52

2

我过去做过的事情是创建一个模板来从数据源创建我的测试。通常是测试的CSV文件。要(重新)生成所有你需要做的就是打开TT文件并保存它以重新生成 - 或者使用VS工具。

这样做的好处是每个条件只有一个测试,它也会给你轻松重复的测试,即使它们是为你生成的。您还可以非常轻松地调试失败的测试,因为在一天结束时代码是C#。

例如创造与此内容* .TT,有一个CSV一些数据文件:

<#@ template debug="false" hostspecific="true" language="C#" #> 
<#@ assembly name="System.Core" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ output extension=".generated.cs" #> 
<# 
    var testCases = 
     File.ReadAllLines(Path.Combine(Host.TemplateFile, @"Cases.csv")) 
     .Skip(1) //Headers 
     .Select(line => line.Split(',')) 
     .Select(
      values => 
       new 
       { 
        TestName = values[0], 
        Expected = values[1], 
        Actual = values[2], 
        //More Stuff from values[n] 
       }); 
#> 
using System; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

namespace DaveShaw 
{ 
    [TestClass] 
    public class GeneratedTests 
    { 
<# 
    foreach (var testCase in testCases) 
    { 
#> 
     [TestMethod] 
     public void Generated_<#= testCase.Name #>() 
     { 
      //Put your Arrange & Act code here 
      Assert.AreEqual(
       expected: <#= testCase.Expected #> 
       actual: <#= testCase.Expected #>); 
     } 
<# 
    } 
#> 
    } 
} 

当你保存你将有一个* .generated.cs(其中*是一样的* .tt)以及你所有的测试。