2017-03-10 104 views
2

データソースとしてCSVファイルを使用してデータ駆動型XUnitテストを実行する方法はありますか?私はCavity.Data.XUnitを試しましたが、最新バージョンのXUnitとの互換性はなくなりました。今のところ、私はExcelファイルを使用してこれを達成できましたが、代わりにCSVに変更する必要があります。CSVファイルのデータを使用してXUnitテストを実行する方法

ご協力いただきまして誠にありがとうございます。

例:

[Theory] 
[ExcelData(@"Settings\TestFileParam.xls", "Select url, username, password, from TestData")] 
//^Replace with a CSV file instead 
public void Tester_Method(string url, string username, string password) 
{ 
    //Code reading the data from CSV 
    Assert.True(something); 
} 
+0

私は好奇心旺盛です。テストしようとしているものとファイルからこれらのデータは何ですか? – kat1330

+0

- 'あなたはテストしようとしています.':ウェブサイトのUIテストを実行しています。私はフレームワークとして使用している別のソリューションでSeleniumを使用しています。 - 2003-07フォーマットのデータをExcelファイルから取得したものです。 – luisxcam

答えて

0

のxUnitはしかしユースケースの種類のための拡張ポイントがあるのか​​、この正確な機能を内蔵していません。多くのxUnitを置き換えてカスタマイズすることができます。新しいテストケースのデータソースは、より一般的なものの1つです。

Xunit.Sdk.DataAttributeは、ExcelDataAttributeが使用する拡張ポイントです。

典型的な実装はExcelDataAttributeの実装がここで発見されたこの

public class CsvDataAttribute : DataAttribute 
{ 
    readonly string fileName; 

    public CsvDataAttribute(string fileName) 
    { 
     this.fileName = fileName; 
    } 

    public override IEnumerable<object[]> GetData(MethodInfo testMethod) 
    { 
     //Parse CSV and return an object[] for each test case 
    } 
} 

ようになります。 https://github.com/xunit/samples.xunit/blob/master/ExcelDataExample/ExcelDataAttribute.cs

2

カスタムxUnit.Sdk.DataAttributeを作成する必要があります。これは、この形式でデータを読み込む例です。

MyCsv.csv

sep=, 
csvRowOne,csvRowTwo,csvRowThree 
15,"Just A Test","Apples are Red" 

次に、あなたがこのようにそれを呼び出します。

[Theory] 
    [CsvData(@"C:\MyCsv.csv")] 
    public void TestWithCSVData(int csvRowOne, string csvRowTwo, string csvRowThree) 

それはただの文字列とint型を解析しますが、あなたはより多くを行うためにConvertParameterメソッドを拡張することができます。

CsvDataAttribute.cs

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] 
public class CsvDataAttribute : DataAttribute 
{ 
    private readonly string _fileName; 
    public CsvDataAttribute(string fileName) 
    { 
     _fileName = fileName; 
    } 

    public override IEnumerable<object[]> GetData(MethodInfo testMethod) 
    { 
     var pars = testMethod.GetParameters(); 
     var parameterTypes = pars.Select(par => par.ParameterType).ToArray(); 
     using (var csvFile = new StreamReader(_fileName)) 
     { 
      csvFile.ReadLine();// Delimiter Row: "sep=,". Comment out if not used 
      csvFile.ReadLine(); // Headings Row. Comment out if not used 
      string line; 
      while ((line = csvFile.ReadLine()) != null) 
      { 
       var row = line.Split(','); 
       yield return ConvertParameters((object[])row, parameterTypes); 
      } 
     } 
    } 

    private static object[] ConvertParameters(IReadOnlyList<object> values, IReadOnlyList<Type> parameterTypes) 
    { 
     var result = new object[parameterTypes.Count]; 
     for (var idx = 0; idx < parameterTypes.Count; idx++) 
     { 
      result[idx] = ConvertParameter(values[idx], parameterTypes[idx]); 
     } 

     return result; 
    } 

    private static object ConvertParameter(object parameter, Type parameterType) 
    { 
     return parameterType == typeof(int) ? Convert.ToInt32(parameter) : parameter; 
    } 
} 
関連する問題