2013-03-18 98 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)以及你所有的測試。