2013-08-29 18 views
5

在VS2012.3 .NET4.5和R#中使用MSTEST作爲測試運行器。MSTEST中的多個TestInitialize屬性

下面的代碼以1,2,3,4的順序工作。

但是我擔心它可能不會在這個順序多TestInitialize屬性不支持MSDN

問題總是執行:這是允許的,並做文檔只是意味着多TestInitialize屬性中不允許同一班?

我想保持這種結構,因爲有很多集成測試繼承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次測試),根據您所顯示的代碼進行預測:TestStartSetup之前調用。

使TestInitialize方法虛擬並覆蓋它(請參閱here)和ClassInitialize方法(MsTest ClassInitialize and Inheritance)的繼承存在問題。

+0

感謝Mike,Sunny和SlavaGu。現在變得更有意義了,我非常喜歡這種運行測試的方式。 –

2

我相信你誤讀了MSDN文章。他們聲明:

該屬性可以在方法上指定。此方法只能應用此 屬性的一個實例。

這意味着你不能有這樣的代碼:

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

這並不意味着你不能有多個初始化器,即使在同一個班級。

我不確定MSTest,but in NUnit its well defined在你描述的情況下,初始化器將按照從基類開始的正確順序運行。如果你在同一個班級中沒有初始化程序,那麼順序不能保證。

我會認爲MSTest也是如此(但我沒有參考點)。

2

請注意執行順序取決於測試運行者。 Visual Studio測試運行程序和R#測試運行程序的行爲可能會有所不同。現在我相信他們有相同的行爲,但是它仍然取決於R#的行爲。

我記得R#舊版本中有一個bug,並且從子類的TestInitialize方法在基類中先執行TestInitialize方法。當然,它很快就被固定:)