xUnitテストプロジェクトでテストの入力データ、結果をファイルから読み込む - DataAttributeの利用
xUnitテストプロジェクトでテストの入力データ、結果をファイルから読み込むコードを紹介します。
概要
xUnitテストプロジェクトでテストの入力データ、結果をファイルから読み込みたい場合があります。
ファイルからテストデータを入力する場合には、
DataAttribute
クラスを利用します。
コード
以下のコードを記述します。
using System;
namespace xUnitTestDataAttribute
{
public class MyClass
{
public string proc(string input)
{
string result = input.Replace("あひる", "ぺんぎん");
result = result.Replace("ぺんぎんくん", "ぺそぎそ"); //バグ
return result;
}
}
}
using System;
using Xunit;
using Xunit.Sdk;
using System.Collections.Generic;
using System.Reflection;
using xUnitTestDataAttribute;
namespace xUnitTestDataAttributeTest
{
public class UnitTest1
{
[Theory]
[FileTestData("test1.txt", "result1.txt")]
[FileTestData("test2.txt", "result2.txt")]
[FileTestData("test3.txt", "result3.txt")]
public void Test1(string test, string result)
{
MyClass m = new MyClass();
Assert.Equal(m.proc(test), result);
}
}
public class FileTestDataAttribute : DataAttribute
{
private string _CaseFileName;
private string _ResultFileName;
public FileTestDataAttribute(string CaseFileName, string ResultFileName)
{
_CaseFileName = CaseFileName;
_ResultFileName = ResultFileName;
}
public override IEnumerable<object[]> GetData(MethodInfo testMethod)
{
string TestCase = System.IO.File.ReadAllText(_CaseFileName);
string ResultCase = System.IO.File.ReadAllText(_ResultFileName);
List<object[]> result = new List<object[]>();
result.Add(new object[] { TestCase, ResultCase });
return result;
}
}
}
解説
テストメソッドの属性を
Theroy
に設定し、DataAttributeの属性を追加します。今回は
FileTestData
の名称としています。
[Theory]
[FileTestData("test1.txt", "result1.txt")]
DataAttributeの実装クラスを定義します。クラスの名称は
(DataAttributeの名称)Attribute
となります。 今回は、
FileTestData
の名称にしていますので、
FileTestDataAttribute
となります。クラスは、DataAttributeクラスを継承します。
public class FileTestDataAttribute : DataAttribute
{
/* 中略 */
}
FileTestDataAttribute クラスには、コンストラクタと GetData() メソッドを実装します。
コンストラクタの引数の数はテストメソッドのDataAttribute属性の数と合わせます。今回は入力データと、結果データのファイル名の2つの文字列を
設定していますので、コンストラクタの引数もstirng型の引数2つを記述します。
コンストラクタに渡されたファイル名の文字列はメンバ変数の
_CaseFileName
_ResultFileName
に格納します。
GetDataメソッドはテストデータを返すメソッドの実装です。List<object[]> を返すメソッドで、最初の要素に
ファイルから読み出したテストケースの文字列を、2番目の要素にファイルから読み出した、テスト結果の期待値の文字列を返します。
ファイルの読み込みは、
System.IO.File.ReadAllText()
メソッドを利用します。
public class FileTestDataAttribute : DataAttribute
{
private string _CaseFileName;
private string _ResultFileName;
public FileTestDataAttribute(string CaseFileName, string ResultFileName)
{
_CaseFileName = CaseFileName;
_ResultFileName = ResultFileName;
}
public override IEnumerable<object[]> GetData(MethodInfo testMethod)
{
string TestCase = System.IO.File.ReadAllText(_CaseFileName);
string ResultCase = System.IO.File.ReadAllText(_ResultFileName);
List<object[]> result = new List<object[]>();
result.Add(new object[] { TestCase, ResultCase });
return result;
}
}
FileTestDataAttribute クラスのGetDataメソッドの戻り値がテストメソッドの引数に与えられる動作になります。
与えられた引数でテストを実施します。
public void Test1(string test, string result)
{
MyClass m = new MyClass();
Assert.Equal(m.proc(test), result);
}
テストファイル
テストデータのファイルを用意します。
test1,txt, test2.txt, test3.txt, result1.txt, result2.txt, result3.txt ファイルを用意します。
ファイルの内容は以下の通りです。
あひるクッキー
あひるくんWars!
グレートあひるボールペン
ぺんぎんクッキー
ぺんぎんくんWars!
グレートぺんぎんボールペン
テスト実行結果
テストを実行します。ファイルからテストデータを読み込みファイルから読み込んだテスト結果の期待値と比較したテストが実装できました。
このページのキーワード
- xUnit テストデータ ファイル読み込み
- C# xUnit テストデータ ファイル読み込み
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用