我正在为类库创建单元测试。有数百个测试,但他们都在测试相同的单一方法。唯一的区别是输入和输出。我想将这些测试的定义移动到某种文本文件,以便我可以更方便地管理它们。
我可以创建一个适配器,以便继续使用VS测试运行器吗?我找到了一些[DataSource]
属性的引用,但我更喜欢将测试放在单独的文本文件中,而不是某种可查询的数据库。
答案 0 :(得分:3)
如果您使用的是MSTest V2,则可以使用基于属性的数据输入,例如@Floris'示例使用xUnit。有关公告,请参阅https://blogs.msdn.microsoft.com/devops/2016/06/17/taking-the-mstest-framework-forward-with-mstest-v2/,它应如下所示:
[DataTestMethod]
[DataRow("filename1")]
[DataRow("filename2")]
public void MyTestMethod(string inputfile)
答案 1 :(得分:1)
DataSource
属性也可以引用XML文件。
示例:
// SortTest elements are read from the XML named SortTestDataSource.xml
[TestMethod]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", "|DataDirectory|\\SortTestDataSource.xml", "SortTest", DataAccessMethod.Sequential)]
public void SortTest()
{
var reflist = Enumerable.Range(0, 100);
// And you can read the XML attributes of each row as follows
int count = Int32.Parse((string)TestContext.DataRow["Count"]);
SortingAlgorithm algorithm = (SortingAlgorithm)Enum.Parse(typeof(SortingAlgorithm), (string)TestContext.DataRow["Algorithm"]);
Order order = (Order)Enum.Parse(typeof(Order), (string)TestContext.DataRow["Order"]);
int seed = Int32.Parse((string)TestContext.DataRow["Seed"]);
var array = SortHelper.CreateArray<int>(count, order, seed);
Sorter<int> sorter = new Sorter<int>();
sorter.Sort(array, algorithm);
Assert.IsTrue(reflist.SequenceEqual(array));
}
XML文件:
<?xml version="1.0" encoding="utf-8" ?>
<Elements>
<SortTest Count="100" Algorithm="SelectionSort" Order="Random" Seed="0"/>
<SortTest Count="100" Algorithm="QuickSortPivotFirst" Order="Random" Seed="0"/>
<SortTest Count="100" Algorithm="QuickSortPivotMiddle" Order="Random" Seed="0"/>
<SortTest Count="100" Algorithm="MergeSortTopDown" Order="Random" Seed="0"/>
<SortTest Count="100" Algorithm="MergeSortBottomUp" Order="Random" Seed="0"/>
</Elements>
答案 2 :(得分:1)
我知道问题是关于你是否可以创建一个适配器,但是如果没有它可能会有另一种方法。假设测试本身仍然在您的测试项目中,但只有数据需要来自文件,那么您可以使用理论(xUnit)和您要测试的文件名。
[Theory]
[InlineData("filename1")]
[InlineData("filename2")]
[InlineData("filename3")]
public void MyFirstTheory(string filename)
{
// read the file and use it for testing
}
其他方法包括为参数创建IEnumerable,从而提供更大的灵活性(然后您可以从内联数据中删除文件名并将其传递给适当的对象)。例如,请参阅http://hamidmosalla.com/2017/02/25/xunit-theory-working-with-inlinedata-memberdata-classdata/