Visual Studio中的文件驱动单元测试?

时间:2017-10-15 20:00:48

标签: c# unit-testing visual-studio-2017

我正在为类库创建单元测试。有数百个测试,但他们都在测试相同的单一方法。唯一的区别是输入和输出。我想将这些测试的定义移动到某种文本文件,以便我可以更方便地管理它们。

我可以创建一个适配器,以便继续使用VS测试运行器吗?我找到了一些[DataSource]属性的引用,但我更喜欢将测试放在单独的文本文件中,而不是某种可查询的数据库。

3 个答案:

答案 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/