我知道我可以使用文件中的数据来驱动单元测试,例如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() {}
如果它在内存中,我的偏好是不使用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
}
<# } #>
}
}
一个简单的解决方案是…
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 ...) }
通过这种方式,您可以同时使用从文件中加载的数据和从内存中加载的数据的测试方法。
我不认为你可以用[DataSource]
属性做到这一点,但你可以手动做或多或少相同的事情。
以[AssemblyInitialize]
或[ClassInitialize]
装饰的方法加载数据。然后重写测试以遍历数据。不幸的是,这种方法将以单个测试结束,而不是每次测试运行单独的结果。
我回答了一个类似的问题,我以前使用的解决方案是从我的内存数据生成一个简单的CSV文件
您可以通过NuGet使用MSTestHacks从IEnumerable中提供数据,参见此答案
我认为Gallio Ambience应该可以解决这个问题。