71

この質問は、MSTest を使用した Visual Studio での単体テストに関するものです (MSTest の実行順序のため、これは重要です)。[TestInitialize] とマークされたメソッドとテスト クラス コンストラクターの両方が、各テスト メソッドの前に実行されます。

では、質問は、これらの各領域で何をする傾向があるかということです。どちらかで特定の活動を行うことを避けますか? あなたの理由は何ですか: スタイル、技術、迷信?

4

10 に答える 10

60

コンストラクターは、言語によって提供される単なる構造です。すべてのテスト フレームワークには、独自の制御されたライフサイクル「初期化」があるようです。おそらく、コンストラクターを使用してローカルを変更するだけで問題が発生するでしょう。

MSTest:すべてのテスト クラスのまったく新しいインスタンスを取得しますTestMethod。これは、コンストラクター、イニシャライザー、またはテスト メソッドでローカルを変更しても問題なく、他のテスト メソッドに影響を与えない唯一のケースかもしれません。

public class TestsForWhatever
{
    public TestsForWhatever()
    {
        // You get one of these per test method, yay!
    }

    [TestInitialize] 
    public void Initialize() 
    {
        // and one of these too! 
    }

    [TestMethod]
    public void AssertItDoesSomething() { }

    [TestMethod]
    public void AssertItDoesSomethingElse() { }
}

MSpec:すべてのアサーションに対して1 つだけ取得Establishします ( )。したがって、アサーションでローカルを変更しないでください。また、基本コンテキストでのローカルのミューテーションに依存しないでください (使用する場合)。BecauseIt

[Subject(typeof(Whatever))]
public class When_doing_whatever
{
    Establish context = () => 
    { 
        // one of these for all your Its
    };

    Because of = () => _subject.DoWhatever();

    It should_do_something;
    It should_do_something_else;
}
于 2011-08-16T14:15:59.137 に答える
22

TestInitialize で私が見つけたいくつかの利点を次に示します。

  • 一部の環境変数 (TestContext など) には、テスト クラスがインスタンス化されるまでアクセスできません。
  • ベースの TestInitialize メソッド抽象をマークすることにより、派生クラスでの実装を要求できます。
  • ベースの TestInitialize メソッドを簡単にオーバーライドして、ベースの impl を派生した impl の前、後、またはまったく呼び出すかどうかを決定できます。対照的に、基本テスト クラスからテスト クラスを派生させる場合、パラメーターなしのコンストラクターの場合、意図したかどうかにかかわらず、基本 ctor が呼び出されます。
  • その明示的な定義により意図が明確になり、TestCleanup メソッドを補完します。すべてのコンストラクターに対してデストラクタを作成できると主張するかもしれませんが、MS Test が期待どおりにデストラクタを処理することは保証されていません。
于 2011-12-31T17:07:36.003 に答える
16

テストクラスインスタンスまたは静的コンストラクターではなく、TestInitialize()またはClassInitialize()を使用する主な利点は、その明示的な性質です。テストの前にセットアップを行っていることを明確に伝えます。これを一貫して行うことで、長期的には保守性が向上するはずです。

于 2011-02-11T14:22:20.083 に答える
3

この質問は、(後で) VS テスト フレームワークと TestInitialize() 属性でコンストラクターを使用することの違いは何ですか?でも尋ねられます。

FWIW「クラスコンストラクター」とは、インスタンスコンストラクター静的コンストラクターではなく)を意味すると思います。

あなたが求めているのと同じ質問が、静的コンストラクターとClassInitializeについて同様に尋ねられる可能性があると思います...

于 2010-06-25T19:23:42.633 に答える
2

テストするオブジェクトは、[TestInitialize] メソッドでインスタンス化する必要はありません。オブジェクトのコンストラクターは、テスト メソッド [Test] でテストできます。

[TestInitialize] 内のオブジェクトは、永続ストレージをセットアップしたり、テスト対象のオブジェクトがテストで使用する値を準備したりすることができます。

于 2008-12-02T16:18:16.397 に答える