2012-03-14 24 views
11

MSTestのテストクラスでインスタンス変数を初期化することをお勧めします。私がテストクラスを持っていて、サポート対象を嘲笑してセットアップするためのオーバーヘッドがたくさんあるとしましょう。私は各テストで同じコードを繰り返すのではなく、これを1回だけしたいと思います。私の考えは、MyClassInitializeメソッドを使用して、すべてのテストがアクセスできるグローバルインスタンス変数をいくつか初期化することでした。こうすることで、グローバルインスタンス変数を一度初期化し、実行するたびに各テストで使用されます。MSTest、MyClassInitialize、およびインスタンス変数

残念ながら、MyClassInitializeメソッドは静的なので、グローバルインスタンス変数を初期化することはできません。グローバルなインスタンス変数を静的にすることを考えましたが、適切な解決策ではないようです。次に、テストクラス自体のコンストラクタに初期化コードを置くことについて考えましたが、私の中の何かが、MyClassInitializeが私が使用するはずのものであると言っています。別の考え方は、そのメソッドが静的ではないので、MyTestInitializeを使用することですが、それは各テストでオブジェクトを繰り返し作成することになります。それは適切ですか?

テストを実行する前にこれらの変数を一度しか初期化する必要がないテストで変数を使用する方法のベストプラクティスはありますか?以下は、私が話していることの人為的な例です。

[TestClass()] 
public class ProgramTest 
{ 
    // this object requires extensive setup so would like to just do it once 
    private SomeObjectThatIsUsedByAllTestsAndNeedsInitialization myObject; 
    private TestContext testContextInstance; 

    [ClassInitialize()] 
    public static void MyClassInitialize(TestContext testContext) 
    { 
     // initializing SomeObjectThatIsUsedByAllTestsAndNeedsInitialization clearly will 
     // not work here because this method is static. 
    } 

    [TestMethod()] 
    public void Test1() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 

    [TestMethod()] 
    public void Test2() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 

    [TestMethod()] 
    public void Test3() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 
} 

答えて

8

できるだけ[TestInitialize]と[TestCleanup]を使用してください。単体テストは高速で独立している必要があります。そのため、最もきれいな方法は、各テストの初期化とクリーンアップです。これにより、テストの結果が別のテストの影響を受けないことが保証されます。テストの初期化に時間がかかりますが、単体テストではなく、統合テストが行​​われたと思います。

例外は、データベースまたは別のリソースに移動する統合テストです。操作を一度実行してから、複数のアサーション(TestMethods)で結果を確認することができます。私は、クラスごとに1回だけ初期化されるコンテキストタイプを持つ特定のジェネリッククラスを使用していました。しかし、今私はこれが残酷だと思って、依存関係と結果をプライベート静的変数に入れてください。

1

他のいくつかのクラスでは、インスタンス変数の遅延初期化を使用できます。 MSTestが実行するテストメソッドごとにテストクラスの新しいインスタンスを作成することを忘れないでください。だから、そのクラスの中で、テストメソッド間で永続化したい変数は、静的にする方がよいでしょう。

3

静的にどのような問題がありますか?

あなたのObjectThatIsUsedByAllTestsが本当にあなたのすべてのテストで100%共有できるのであれば、静的にしてClassInitializeを使用してください。

もしそうでなければ、TestInitializeのためのテストごとにそれを初期化する必要があります。

+1

静的で私の問題を本当に定量化できません。それはちょうど "感じる"権利はありませんが、私は理由を説明することはできません。 – meyousikmann

+0

静的とは、クラスが所有していることを意味します。静的でないものはクラスのインスタンスによって所有されます。物事が静的でなければならないかどうかを判断しようとするときには、自分自身に「これはクラス全体が所有するのか、それとも単なるインスタンスであるのですか? – Tristan

関連する問題