2013-08-29 86 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方法。当然,它很快就被固定:)