xUnitテストプロジェクトでテストの入力データ、結果をファイルから読み込む - DataAttributeの利用

xUnitテストプロジェクトでテストの入力データ、結果をファイルから読み込むコードを紹介します。

概要

xUnitテストプロジェクトでテストの入力データ、結果をファイルから読み込みたい場合があります。 ファイルからテストデータを入力する場合には、DataAttributeクラスを利用します。

コード

以下のコードを記述します。
MyClass.cs (テストされるクラス)
using System;

namespace xUnitTestDataAttribute
{
  public class MyClass
  {
    public string proc(string input)
    {
      string result = input.Replace("あひる", "ぺんぎん");

      result = result.Replace("ぺんぎんくん", "ぺそぎそ"); //バグ

      return result;
    }
  }
}
UnitTestMain.cs (テストプロジェクト)
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 ファイルを用意します。 ファイルの内容は以下の通りです。


test1.txt
あひるクッキー
test2.txt
あひるくんWars!
test3.txt
グレートあひるボールペン
result1.txt
ぺんぎんクッキー
result2.txt
ぺんぎんくんWars!
result3.txt
グレートぺんぎんボールペン

テスト実行結果

テストを実行します。ファイルからテストデータを読み込みファイルから読み込んだテスト結果の期待値と比較したテストが実装できました。

このページのキーワード
  • xUnit テストデータ ファイル読み込み
  • C# xUnit テストデータ ファイル読み込み
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2021-09-05
iPentec all rights reserverd.