2011-01-27 20 views
19

2つのオブジェクトを受け入れ、それらのオブジェクトの30以上のプロパティをアサートと比較する呼び出し可能な関数を記述したいと思います。問題は、約20個の既存の単体テストと今後のテストのために行う必要があり、毎回30個以上のアサーションを書き出すことは時間と空間の両方を消費することです。nunitテストをパラメータ化することは可能ですか

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

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

答えて

17

を、あなたはもちろん、別の関数内でアサートすることができます。テストランナーキャッチ例外を上げることによって、作業をアサートし、失敗として解釈し、そこそこ正常に動作しますようにテストを持っている:

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

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

まさに私がやろうとしていたことですが、2つのパラメータがあります。私は私の問題だと思うテストケースとしての機能を持っていました。ありがとう – NewNetProgrammer

4

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

特に、NUnit.TestCaseAttributeをチェックしてください。

+0

私はそれに目を通しましたが、動的パラメータを設定する方法がわかりませんでした。私は、20人以上の手動入力オブジェクトをデータベースから自動的に入力されたオブジェクトと比較したいと考えました。 assert(テストケースではない)を持つvoid関数を作成し、それを私の単体テストから呼び出すことは完全に機能しました。ありがとう – NewNetProgrammer

32

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

通常のユニットテストは、[テスト]で飾られることになるが、我々は次のようにすることを置き換えることができます。

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

    //Act 

    //Assert 
} 

のものの、そのタイプはそれを行うための方法となります - 明らかに異なるのparamsを取ります。助けのため、この時

ルック:文字列とint型などのプリミティブデータ型でのみ動作することを

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

注 - あなたをインスタンス化することはできません。http://nunit.org/?p=testCase&r=2.5

+0

問題は、私のテストケースは静的ではありません。私は手動で入力されたオブジェクトを持っていて、比較したいデータベースから読み込まれたオブジェクトを持っています。 – NewNetProgrammer

+0

'expected'はむしろパラメータ化されたテストの戻り値型でなければならず、テストケースにはパラメータの代わりに戻り値を与えるべきです。 –

0

あなたは、テストケースの属性が必要になりますそれをパラメータとして使用します。あなたはTestCase属性を使用することができます

+0

問題は、私が比較したい30以上の属性を持つ自分のクラスオブジェクトを使用していることです。 – NewNetProgrammer

1

:最後の部分に答えるために

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

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

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

これにより、まだ書いていないクラスにも適用される特定の種類のテストを書くことができます。

関連する問題