2013-08-29 10 views
5

テストランナーにはVS2012.3 .NET4.5とR#でMSTESTを使用します。MSTESTの複数のTestInitialize属性

以下のコードは、1,2,3,4の順番で動作します。これは許可され、ドキュメントだけで、複数のTestInitialize属性がで許可されていないことを意味しています:私は、複数のTestInitialize属性がMSDN

質問サポートされていないとして、それは常にこの順序で実行されないことが心配ですが

同じクラスですか?

私は、TransactedTestBaseを継承した多数の統合テストがあり、セットアップに別のSQLスクリプトを必要とするため、この構造を維持したいと考えています。

同じ動作をhere

[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(); 
    } 
} 
+0

あなたは驚きを避け、直接基底クラスのメソッドを呼び出すことができます[TestInitialize] 公共オーバーライド無効TestStart(){ base.TestStart(); Console.WriteLine( "2 Setup"); } – SlavaGu

答えて

5

私は、同じ方法でTestInitializeAttributeを何度も使用していると言います。これはAttributeUsage(AllowMultiple=false)によって制御されます。 FWIW、私はあなたが期待しているように働いているコードを前提とした中規模のテストスイート(〜200テスト)を持っています:Setupの前にTestStartが呼び出されています。

TestInitialize方法は、仮想作り、それを上書きして問題(hereを参照)、ClassInitialize方法(MsTest ClassInitialize and Inheritance)の継承があります。

+0

マイク、サニー、スラバガグありがとうございます。今より感覚的になり、私は実際にテストを実行するこの方法が好きです。 –

2

いた私は、MSDNの記事を読み違えると信じています。状態:

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

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

それはあなたも同じクラスで、複数の初期化子を持つことができないという意味ではありません:あなたはこのようなコードを持っていないことを意味し

MSTestについては、but in NUnit its well definedについてはわかりませんが、あなたが説明した状況では、イニシャライザは基本クラスから順番に実行されます。同じクラスに初期化子がほとんどない場合、その順序は保証されません。

私はこれもMSTestでも当てはまると考えていますが、参照点はありません。

2

実行順序はテストランナーによって異なることに注意してください。 Visual StudioのテストランナーとR#のテストランナーは、異なる動作をする可能性があります。今私は彼らが同じ振る舞いを持っていると信じていますが、振る舞いはまだR#までです。

R#旧バージョンのバグがあり、TestInitializeメソッドのサブクラスが以前にTestInitializeメソッドが実行されていたことを覚えています。もちろん、それはすぐに修正されました:)