2017-10-15 14 views
1

私はクラスライブラリの単体テストを作成しています。何百ものテストがありますが、それらはすべて同じ単一のメソッドをテストしています。唯一の違いは入力と出力です。これらのテストの定義をいくつかの種類のテキストファイルに移して、より便利にそれらを管理できるようにしたいと思います。Visual Studioのファイル駆動ユニットテスト?

VSテストランナーを引き続き使用できるようにアダプタを作成できますか?私は[DataSource]属性への参照をいくつか見つけましたが、私は別のテキストファイルでテストするのが好きです。クエリ可能なデータベースではありません。

答えて

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> 
+0

Hmのようになります。これはオプションですが、理想的ではありません。テストデータにはバイナリデータとテキストデータが混在しているので、xmlをエスケープする必要はありません。私はシンプルで目的に合ったファイルフォーマットを念頭に置いています。このユースケースでは簡単に解析することができます。 (基本的に、テストデータはタブ文字で始まらないか、改行を含んでいるので、私はそれらを使ってケースとメタデータを区切ります。 – recursive

+0

属性にファイル名やリソース名を格納していますか? – taffer

+0

ねえ、いい考えです。 – recursive

1

私は質問はアダプターを作成することができるかどうかについてですけど、多分それなしに別の方法があります。テスト自体がまだテストプロジェクトにあるものの、データだけをファイルから取得する必要があると仮定すると、テストするファイル名にTheory(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/を参照してください。

+0

OPはVSテストランナーでMSTestsを使用していますが、他にも数多くの選択肢がありますが、これは彼の制約です。 – taffer

関連する問題