web-dev-qa-db-ja.com

nunitテストをパラメーター化することは可能ですか

2つのオブジェクトを受け入れ、それらのオブジェクトの30以上のプロパティをアサートと比較する呼び出し可能な関数を記述したいと思います。問題は、これは約20の既存の単体テストとほとんどの将来のテストで実行する必要があり、毎回30以上のアサートを書き込むことは時間とスペースの両方を消費することです。

私は現在、オブジェクトを比較し、「合格」または失敗メッセージを含む文字列を返し、各ユニットテストでそれを検証するためにアサートを使用する非ユニットテスト関数を持っています。しかし、それはかなり厄介で、適切な単体テスト方法に反対しているように感じます。

アサーションを使用して条件をチェックするユニットテスト内から呼び出し可能な関数を作成する方法はありますか?

38

最後の部分に答えるために、もちろん別の関数内にアサートを含めることができます。アサートは、テストランナーがキャッチした例外を発生させることで機能し、失敗と解釈します。そのため、次のようなテストで問題なく機能します。

public void CheckAsserts(string value)
{
    Assert.IsNotNull(value);
}

[TestCase("yes!")]
public void MyTest(string value)
{
    CheckAsserts(value);
}
34
Massif

NUnit 2.5.5以降を使用している場合、これはTestCase属性を使用して可能です。

通常の単体テストは[Test]で装飾されますが、次のように置き換えることができます。

[TestCase("0", 1)]
[TestCase("1", 1)]
[TestCase("2", 1)]
public void UnitTestName(string input, int expected)
{
    //Arrange

    //Act

    //Assert
}

そのタイプのものはそれを行う方法になります-明らかに異なるパラメーターを取ります。

ヘルプを参照してください: http://nunit.org/?p=testCase&r=2.5

52
stack72

はい、単体テストは他のコードと同じです。

特に、チェックアウト NUnit.TestCaseAttribute

3
jason

TestCase属性を使用できます。

[TestCase("hostname1parameter")]
[TestCase("hostname2parameter")]
public void Example_TestHostName(string hostname)
{
    ...
}
1
hwcverwe

TestCase属性が必要になります:

[TestCase("string1",...)
public void test_UnitTest(string Parameter)
{
    ...
    Assert.AreEqual(Parameter, result)
}

これは文字列やintsなどのプリミティブデータ型でのみ機能することに注意してください。独自のクラスをインスタンス化してパラメーターとして使用することはできません。

0
Aidan

また、C#イントロスペクションを使用することでメリットが得られる場合もあります。これにより、コードで指定せずにフィールドの名前を取得できます。その後、名前でそれらを呼び出すことができます。

System.Attribute [] attrs = System.Attribute.GetCustomAttributes(t);

これにより、まだ作成していないクラスに適用される特定の種類のテストを作成できます。

0
KellyCoinGuy