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() {}
4

6 回答 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
    }
    <# } #>
}
}
于 2011-11-10T00:46:39.277 回答
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 ...) }

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

于 2011-11-10T00:12:31.743 回答
1

我不认为你可以用[DataSource]属性来做到这一点,但你可以手动做或多或少相同的事情。

以装饰有[AssemblyInitialize]or的方法加载数据[ClassInitialize]。然后重写你的测试来循环数据。不幸的是,这样你最终会得到一个单独的测试,而不是每次测试运行的单独结果。

于 2011-11-10T00:14:07.563 回答
1

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

于 2012-03-28T09:59:21.317 回答
1

您可以通过 NuGet 使用MSTestHacks从 IEnumerable 提供数据,请参阅此答案

于 2016-01-29T13:12:06.327 回答
0

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

于 2011-11-10T01:04:40.220 回答