是否有一种方法可以利用已经在内存中的数据来驱动单元测试?

9
我可以使用文件中的数据来驱动单元测试,例如在csv或xml文件中嵌入的数据。
例如:
[TestMethod]
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.CSV", 
    "Data.csv", 
    "Data#csv", 
    DataAccessMethod.Sequential)]
public void TestData() {}

我想知道是否有一种方法,可以使用已经在内存中的数据结构来驱动测试,而不是使用文件。类似于:
// this structure has the data to use in the unit test
var DataList = new List<string>();

[TestMethod]
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.IEnumerable",
    "DataList", 
    "DataList", 
    DataAccessMethod.Sequential)]
public void TestData() {}

如何在MSTest中进行RowTest? - Michael Freidgeim
6个回答

3

如果数据在内存中,我的建议是不要使用DataSource,而是使用T4模板自动生成您的单元测试。这样,您只需要编写一次测试,但在测试运行结果中,您将看到每个已测试输入的条目。将此.tt文件添加到您的测试项目中。

<#@ template debug="false" hostspecific="true" language="C#v3.5" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="System.Data.dll" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Linq" #>
<#@ output extension=".cs" #>
<#
        List<string> DataList = AccessInMemoryData();
#>
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestProject1
{
[TestClass]
public class UnitTest1
{
    <# foreach (string currentTestString in DataList) { #>
    [TestMethod]
    public void TestingString_<#= currentTestString #>
    {
    string currentTestString = "<#= currentTestString #>";
    // TODO: Put your standard test code here which will use the string you created above
    }
    <# } #>
}
}

1
一个简单的解决方案可以是这样的...
private void TestData(IEnumerable what ) { ... your test method ... }

[TestMethod]
public void TestDataInMemory() { List<T> mylist = ...; this.TestData(mylist); }

[TestMethod]
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.CSV", 
    "Data.csv", 
    "Data#csv", 
    DataAccessMethod.Sequential)]
public void TestData() { this.TestData(testContextInstance ...) }

通过这种方式,您可以使用测试方法来处理从文件加载的数据和从内存加载的数据。


感谢您的建议。不幸的是,对我来说,TestDataInMemory()测试将仅运行一次,无论有多少数据条目,而TestData()测试将针对每个条目运行一次。为了我的目的,我宁愿每个条目运行一个测试。 - Paulo Pinto

1

1

我认为你不能使用[DataSource]属性来实现这个,但是你可以手动完成类似的操作。

在一个被[AssemblyInitialize][ClassInitialize]修饰的方法中加载你的数据。然后重写你的测试用例以循环遍历这些数据。不幸的是,这样做会导致你只得到单一的测试结果,而不是每次测试运行都有独立的结果。


是的,数据已经在[ClassInitialize]函数中设置好了,我尝试了你建议的方法。它确实可以工作,但是对于所有数据的单个测试意味着Asserts会在第一个失败的测试上停止函数。这不是我想要的。感谢你的建议。 - Paulo Pinto

1

回答了一个类似的问题,而我之前使用的解决方案是从我的内存数据生成一个简单的CSV文件。


0

我认为 Gallio Ambience 应该能解决这个问题。目前我不确定该项目的状态如何。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接