在VS2012.3 .NET4.5和R#中使用MSTEST作为测试运行者。
以下代码的工作顺序为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 :(得分:6)
我认为文档指的是在同一方法上多次使用TestInitializeAttribute
。这由AttributeUsage(AllowMultiple=false)
控制。 FWIW,我有一个中等大小的测试套件(约200个测试),这个测试套件基于你所展示的代码而预测:TestStart
在Setup
之前被调用。
将TestInitialize
方法设为虚拟并覆盖它(请参阅here)和继承ClassInitialize
方法(MsTest ClassInitialize and Inheritance)时会出现问题。
答案 1 :(得分:2)
我相信你误读了MSDN文章。他们说:
可以在方法上指定此属性。只有一个例子 属性可以应用于方法。
这意味着你不能拥有这样的代码:
[TestInitialize]
[TestInitialize]
public void MyIntilialzer(){}
这并不意味着您不能拥有多个初始化程序,即使在同一个类中也是如此。
我不确定MSTest,but in NUnit its well defined在你描述的情况下,初始化器将以正确的顺序从基类开始运行。如果您在同一个类中的初始化程序很少,则无法保证顺序。
我认为MSTest也是如此(但我没有参考点)。
答案 2 :(得分:2)
请注意,执行顺序取决于测试运行器。 Visual Studio测试运行器和R#测试运行器可能表现不同。现在我相信他们有相同的行为,但仍然由R#决定它的表现。
我记得R#旧版本中有一个有bug,而子类中的TestInitialize方法先于基类中的TestInitialize方法执行。当然,它很快得到修复:)