7

VS2012.3 .NET4.5 で MSTEST を使用し、テスト ランナーに R# を使用します。

以下のコードは、1、2、3、4 の順序で機能します。

TestInitializeただし、複数の属性がサポートされていないため、常にこの順序で実行されるとは限らないことが懸念されますMSDN

質問: これは許可されていますか? ドキュメントTestInitializeは、同じクラスで複数の属性が許可されていないことを意味していますか?

TransactedTestBase を継承する多くの統合テストがあるため、この構造を維持したいと思いますが、セットアップにはさまざまな SQL スクリプトが必要です。

ここで同じ動作が見つかりました

[TestClass]
public class DelegationTest : TransactedTestBase
{
    [TestInitialize]
    public void Setup()
    {
        Console.WriteLine("2 Setup");
        //var script = "INSERT INTO blah...";
        //var sqlConnect = new SqlConnection(dbConnection.ConnectionString);
        //sqlConnect.Open();
        //var server = new Server(sqlConnect);
        //var database = server.Databases[sqlConnect.Database];
        //database.ExecuteNonQuery(script);
    }

    [TestMethod]
    public void TestMethod1()
    {
        Console.WriteLine("3 Test Method");
    }
}

[TestClass]
public class TransactedTestBase
{
    //protected userEntities userEntities;
    //private TransactionScope scope;
    //public static SqlDatabase dbConnection;

    //private const bool ShouldWriteToDB = true;
    //private const bool ShouldWriteToDB = false;

    [TestInitialize()]
    public virtual void TestStart()
    {
        Console.WriteLine("1 TestStart");
        //if (ShouldWriteToDB)
        //{
        //    dbConnection = EnterpriseLibraryContainer.Current.GetInstance<SqlDatabase>("DBConnect");
        //    return;
        //}

        //scope = new TransactionScope(TransactionScopeOption.RequiresNew);
        //user = new userEntities();
        //dbConnection = EnterpriseLibraryContainer.Current.GetInstance<SqlDatabase>("DBConnect");
    }

    [TestCleanup()]
    public virtual void TestEnd()
    {
        Console.WriteLine("4 TestEnd");
        //if (ShouldWriteToDB) return;

        //scope.Dispose();
    }
}
4

3 に答える 3

7

ドキュメントはTestInitializeAttribute、同じ方法で複数回使用することについて言及していると思います。これは によって制御されますAttributeUsage(AllowMultiple=false)。FWIW、期待どおりに動作していることを示したコードに基づく中規模のテストスイート(〜200テスト)があります:TestStartis called before Setup.

TestInitializeメソッドの仮想化とオーバーライド (こちらを参照) およびClassInitializeメソッドの継承 ( MsTest ClassInitialize および Inheritance )には問題があります。

于 2013-08-29T13:54:49.860 に答える
2

MSDN の記事を読み間違えたようです。彼らは次のように述べています。

この属性はメソッドで指定できます。この属性のインスタンスは 1 つだけメソッドに適用できます。

つまり、次のようなコードは使用できません。

[TestInitialize]
[TestInitialize]
public void MyIntilialzer(){}

同じクラスであっても、複数の初期化子を持つことができないという意味ではありません。

MSTestについてはわかりませんが、NUnitでは、あなたが説明した状況では、初期化子が基本クラスから正しい順序で実行されることが明確に定義されています。また、同じクラスに初期化子がほとんどない場合、順序は保証されません。

これはMSTestにも当てはまると思います(ただし、基準点はありません)。

于 2013-08-29T13:47:17.683 に答える