TestInitializeがVisual Studioユニットテストのすべてのテストで起動されるのはなぜですか?


158

私は、単一の持っているのVisual Studio 2010ベータ2を使用してい[TestClass]ていた、[TestInitialize][TestCleanup]およびいくつかを[TestMethods]

テストメソッドが実行されるたびに、初期化メソッドとクリーンアップメソッドも実行されます。

[TestInitialize][TestCleanup]はローカルのテスト実行ごとに1回だけ実行する必要があるという印象を受けました。

あれは正しいですか?そうでない場合、これを行う適切な方法は何ですか?

回答:


314

TestInitializeそしてTestCleanup、各テストの前と後を追いかけたが、これは何のテストが結合されていないことを確認することです。

すべてのテストの前後にメソッドを実行する場合は、関連するメソッドをClassInitializeおよびClassCleanup属性で装飾します。

Visual Studioで自動生成されたテストファイルからの関連情報:

テストを作成するときに、次の追加属性を使用できます。

// Use ClassInitialize to run code before running the first test in the class
[ClassInitialize()]
public static void MyClassInitialize(TestContext testContext) { }

// Use ClassCleanup to run code after all tests in a class have run
[ClassCleanup()]
public static void MyClassCleanup() { }

// Use TestInitialize to run code before running each test 
[TestInitialize()]
public void MyTestInitialize() { }

// Use TestCleanup to run code after each test has run
[TestCleanup()]
public void MyTestCleanup() { }

9
ここで言及したように、あなたはAssemblyInitializeとAssemblyCleanup 2以上を持ってstackoverflow.com/a/21304674/864201
Rodolpho Brockさんが

12

これは、テストスイートのかなり標準的な動作です。各テストの前後のセットアップとティアダウンです。哲学は、テストが互いに依存すべきではないということです。別の動作が必要な場合は、各テスト間で持続する静的オブジェクトを使用する必要があります。


9

マイクロソフトのドキュメントからの完全な例:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using SampleClassLib;
using System;
using System.Windows.Forms;

namespace TestNamespace
{
    [TestClass()]
    public sealed class DivideClassTest
    {
        [AssemblyInitialize()]
        public static void AssemblyInit(TestContext context)
        {
            MessageBox.Show("AssemblyInit " + context.TestName);
        }

        [ClassInitialize()]
        public static void ClassInit(TestContext context)
        {
            MessageBox.Show("ClassInit " + context.TestName);
        }

        [TestInitialize()]
        public void Initialize()
        {
            MessageBox.Show("TestMethodInit");
        }

        [TestCleanup()]
        public void Cleanup()
        {
            MessageBox.Show("TestMethodCleanup");
        }

        [ClassCleanup()]
        public static void ClassCleanup()
        {
            MessageBox.Show("ClassCleanup");
        }

        [AssemblyCleanup()]
        public static void AssemblyCleanup()
        {
            MessageBox.Show("AssemblyCleanup");
        }

        [TestMethod()]
        [ExpectedException(typeof(System.DivideByZeroException))]
        public void DivideMethodTest()
        {
            DivideClass.DivideMethod(0);
        }
    }
}

-1

[TestInitialize()]属性でマークされたメソッドは、単体テストが実行される環境の側面を準備するために使用されます。これの目的は、単体テストを実行するための既知の状態を確立することです。[TestInitialize()]メソッドを使用して、テストで使用する特定のデータファイルをコピー、変更、または作成できます。

[TestCleanUp {}]属性でマークされたメソッドを作成して、テストの実行後に環境を既知の状態に戻します。これは、フォルダー内のファイルの削除、またはデータベースを既知の状態に戻すことを意味する場合があります。この例は、注文入力アプリケーションで使用されるメソッドをテストした後、在庫データベースを初期状態にリセットすることです。

詳細については、http//msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspxを参照して ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.