1. ホーム
  2. c#

[解決済み] NUnitに似たxUnit.netのテストパラメータライゼーション

2022-08-12 17:55:28

質問

xUnit.netフレームワークで、NUnitの以下のような機能に類似した手段はありますか?

[Test, TestCaseSource("CurrencySamples")]
public void Format_Currency(decimal value, string expected){}

static object[][] CurrencySamples = new object[][]
{
    new object[]{ 0m, "0,00"},
    new object[]{ 0.0004m, "0,00"},
    new object[]{ 5m, "5,00"},
    new object[]{ 5.1m, "5,10"},
    new object[]{ 5.12m, "5,12"},
    new object[]{ 5.1234m, "5,12"},
    new object[]{ 5.1250m, "5,13"}, // round
    new object[]{ 5.1299m, "5,13"}, // round
}

これでNUnitのGUIに8つのテストが生成されます。

[TestCase((string)null, Result = "1")]
[TestCase("", Result = "1")]
[TestCase(" ", Result = "1")]
[TestCase("1", Result = "2")]
[TestCase(" 1 ", Result = "2")]
public string IncrementDocNumber(string lastNum) { return "some"; }

これは 5 つの別々のテストを生成し、その結果を自動的に比較します ( Assert.Equal() ).

[Test]
public void StateTest(
    [Values(1, 10)]
    int input,
    [Values(State.Initial, State.Rejected, State.Stopped)]
    DocumentType docType
){}

これで6つの組合せテストが生成されます。貴重なものです。

数年前、私はxUnitを試してみて、それが大好きでしたが、これらの機能が欠けていました。これなしでは生きていけないのです。何か変わったのでしょうか?

どのように解決するのですか?

xUnit を実行する方法を提供します。 パラメータ化されたテスト というものを使って データ理論 . このコンセプトはNUnitにあるものと同等ですが、箱から出して得られる機能はそれほど完全ではありません。

以下はその例です。

[Theory]
[InlineData("Foo")]
[InlineData(9)]
[InlineData(true)]
public void Should_be_assigned_different_values(object value)
{
    Assert.NotNull(value);
}

この例では、xUnit は Should_format_the_currency_value_correctly に対して一度だけテストを実行します。 InlineDataAttribute に対して一度だけテストを行い、その都度指定された値を引数として渡します。

データセオリーは 拡張性ポイント であり、パラメータ化されたテストを実行するための新しい方法を作成するために使用することができます。これを実現する方法は 新しい属性を作成することです。 を作成し、テストメソッドの引数や返り値を調べ、オプションでそれを操作することです。

xUnit のデータ理論がどのように拡張できるのか、その実用的な例として AutoFixture 's 自動データ InlineAutoData の理論に基づいています。