MSTEST中的多个TestInitialize属性

时间:2013-08-29 12:39:40

标签: c# .net unit-testing mstest

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

3 个答案:

答案 0 :(得分:6)

我认为文档指的是在同一方法上多次使用TestInitializeAttribute。这由AttributeUsage(AllowMultiple=false)控制。 FWIW,我有一个中等大小的测试套件(约200个测试),这个测试套件基于你所展示的代码而预测:TestStartSetup之前被调用。

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方法执行。当然,它很快得到修复:)