MSTEST中有多个TestInitialize属性
本文关键字:TestInitialize 属性 MSTEST | 更新日期: 2023-09-27 18:29:34
在VS2012.3.NET4.5和R#中使用MSTEST作为测试运行程序。
下面的代码按1、2、3、4的顺序工作。
但是,我担心它可能并不总是按此顺序执行,因为MSDN 不支持多个TestInitialize
属性
问题:这是允许的吗?文档是否只是意味着同一类中不允许有多个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();
}
}
我相信文档指的是在同一方法上多次使用TestInitializeAttribute
。这是由AttributeUsage(AllowMultiple=false)
控制的。FWIW,我有一个中等大小的测试套件(大约200个测试),它基于您所展示的代码,正如您所期望的那样工作:TestStart
在Setup
之前被调用。
使TestInitialize
方法成为虚拟方法并覆盖它(请参阅此处)以及ClassInitialize
方法的继承(MsTest ClassInitialize和继承)存在问题。
请注意,执行顺序取决于测试运行程序。Visual Studio测试运行程序和R#测试运行程序的行为可能不同。现在我相信他们也有同样的行为,但它会如何表现仍然取决于R#。
我记得有一个R#旧版本有一个错误,子类中的TestInitialize方法比基类中的TestInitialize方法执行得更早。当然,它很快就被修复了:)
我相信你误解了MSDN的文章。他们说:
可以在方法上指定此属性。只有一个这样的实例属性可以应用于方法。
这意味着你不能有这样的代码:
[TestInitialize]
[TestInitialize]
public void MyIntilialzer(){}
这并不意味着不能有多个初始值设定项,即使在同一个类中也是如此。
我不确定MSTest,但在NUnit中,它定义得很好,在您描述的情况下,初始化程序将按正确的顺序运行,从基类开始。如果在同一个类中有几个初始值设定项,则不能保证顺序。
我认为MSTest也是如此(但我没有参考点)。