インラインデータを使ったテスト

最近のテストフレームワークはテストデータを簡単に投入できる機能が充実しています。xUnit.NETでも、Xunit.Extensionsの属性を使用することでデータドリブンテストを実行できます。

using System.Collections.Generic;
using System.Diagnostics;
using SampleLib;

//Xunit.Extensionsが必要
using Xunit;
using Xunit.Extensions;

namespace SampleLibTest
{
public class DataDemo
{
    [Theory]
    [InlineData(0, 1, 1, "0足す1は1")]
    [InlineData(1, 2, 3, "1足す2は3")]
    [InlineData(3, 4, 7, "")]
    public void インラインデータを使用(int x, int y, int sum,string message)
    {
    //足し算の結果が正しいはず(3回実行される)
    Calc c = new Calc();
    Assert.Equal(sum, c.Add(x, y));
    Debug.WriteLine(message);
    }

}

}

Theory属性とInlineData属性を使用したテスト

テストデータを読み込んで実行するには、Fact属性ではなく派生クラスのTheory属性を使用します。投入データはInlineData属性で指定します。InlineDataに指定した値はテストメソッドの引数に順番に展開されます。そのため、このテストを実行すると「0+1=1」「1+2=3」「3+4=7」の順にテストを実行できます。

Excelのデータを使用したテスト

また、xUnit.NETではExcelのテストデータを読み込ませることもできます。ここでは「テストデータ.xls」にデータを入力し、その範囲に「TestData」という名前を付けています。

Excelファイルにテストデータを入力して名前を付ける

Excelのデータを読み込んでテストを実行するコードは次の通りです。

[Theory]
[ExcelData(@"テストデータ.xls", "SELECT x, y, sum, message FROM TestData")]
public void Excelのデータを使用(int x, int y, int sum, string message)
{
Calc c = new Calc();
Assert.Equal(sum, c.Add(x, y));
Debug.WriteLine(message);
}

Excelのデータを使用したテスト

Excelのデータを読み込むには、Theory属性とExcelData属性を使用します。ExcelData属性は、[ExcelData("ファイルパス","SELECT文")]の形式で記述します。データ範囲をテーブルと見なすイメージでSELECT文を記述します。

なお、64ビットOSでExcelを使う時、「'Microsoft.Jet.OleDb.4.0' プロバイダーはローカルのコンピューターに登録されていません」というエラーが出る可能性があります。その場合はテストプロジェクトをx86でビルドして、x86用テストランナー(xunit.gui.clr4.x86.exe)を使用する必要があります。

同様にSQL Serverからデータを読み出したい場合は、[SqlServerData("サーバー名","DB名","SELECT文")]という属性を指定できます。

プロパティのデータを使用したテスト

テストデータを柔軟に設定したい場合は、プロパティからデータを提供することもできます。

//テストデータを提供するプロパティ
public static IEnumerable<object[]> TestDataProp
{
get
{
    yield return new object[] { 0, 1, 1, "0足す1は1" };
    yield return new object[] { 1, 2, 3, "1足す2は3" };
    yield return new object[] { 3, 4, 7, "" };
}
}

[Theory]
[PropertyData("TestDataProp")]
public void プロパティデータを使用(int x, int y, int sum, string message)
{
Calc c = new Calc();
Assert.Equal(sum, c.Add(x, y));
Debug.WriteLine(message);
}

プロパティデータを使用するテスト

PropertyData属性ではプロパティ名を指定します。呼び出すプロパティの戻り値の型は、IEnumerableである必要があります。

用意されている属性一覧

参考までに、Xunit.NET で用意されている属性を下図に整理します。

Xunit.NETで用意されている属性クラスの階層

さまざまな属性が存在しますが、注目すべき属性としてBeforeAfterTestAttribute属性を挙げておきましょう。BeforeAfterTestを使用するとテストメソッドの開始前と実行後に処理を埋め込むことができます。その派生クラスの1つにAutoRollbackAttributeがあります。AutoRollbackを使うと、TransactionScopeを使用したテスト後の自動ロールバックが可能となります。次ページで紹介するFixtureと組み合わせて、永続層のテストに使用できるでしょう。