2

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

我从研究中了解到,根据单元测试大型数据集的定义,这不一定是单元测试?所以我也对如何解决这个问题的替代建议持开放态度,而不仅仅是那些与Microsoft.VisualStudio.TestTools.UnitTesting单元测试框架相关的建议。

4

2 回答 2

3

有一个概念叫做数据驱动测试。我在 NUnit 中使用过它,但在 Visual Studio 单元测试中也有一种方法。

这会为每个数据行创建一个测试,而不是为整个数据集创建一个测试。这将为您的整个数据集运行测试,即使失败也会继续下一个数据项。最终结果将突出单独处理每个测试用例的失败和成功。

于 2013-03-18T01:15:50.017 回答
3

我过去做过的事情是创建一个模板来从数据源创建我的测试。通常是测试的 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 相同),其中包含所有测试。

于 2013-03-18T01:17:29.190 回答