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

MSTEST中有多个TestInitialize属性

我相信文档指的是在同一方法上多次使用TestInitializeAttribute。这是由AttributeUsage(AllowMultiple=false)控制的。FWIW,我有一个中等大小的测试套件(大约200个测试),它基于您所展示的代码,正如您所期望的那样工作:TestStartSetup之前被调用。

使TestInitialize方法成为虚拟方法并覆盖它(请参阅此处)以及ClassInitialize方法的继承(MsTest ClassInitialize和继承)存在问题。

请注意,执行顺序取决于测试运行程序。Visual Studio测试运行程序和R#测试运行程序的行为可能不同。现在我相信他们也有同样的行为,但它会如何表现仍然取决于R#。

我记得有一个R#旧版本有一个错误,子类中的TestInitialize方法比基类中的TestInitialize方法执行得更早。当然,它很快就被修复了:)

我相信你误解了MSDN的文章。他们说:

可以在方法上指定此属性。只有一个这样的实例属性可以应用于方法。

这意味着你不能有这样的代码:

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

这并不意味着不能有多个初始值设定项,即使在同一个类中也是如此。

我不确定MSTest,但在NUnit中,它定义得很好,在您描述的情况下,初始化程序将按正确的顺序运行,从基类开始。如果在同一个类中有几个初始值设定项,则不能保证顺序。

我认为MSTest也是如此(但我没有参考点)。