【问题标题】:Multiple TestInitialize attributes in MSTESTMSTEST 中的多个 TestInitialize 属性
【发布时间】:2013-08-29 12:39:39
【问题描述】:

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

【问题讨论】:

  • 可以避免意外,直接调用基类方法: [TestInitialize] public override void TestStart() { base.TestStart(); Console.WriteLine("2 设置"); }

标签: c# .net unit-testing mstest


【解决方案1】:

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

TestInitialize 方法设为虚拟并覆盖它(参见here)和ClassInitialize 方法的继承(MsTest ClassInitialize and Inheritance)存在问题。

【讨论】:

  • 感谢 Mike、Sunny 和 SlavaGu。现在更有意义了,我真的很喜欢这种运行测试的方式。
【解决方案2】:

我相信您误读了 MSDN 文章。他们说:

可以在方法上指定此属性。仅此一例 属性可以应用于方法。

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

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

这并不意味着你不能有多个初始化器,即使在同一个类中也是如此。

我不确定 MSTest,but in NUnit its well defined 在您描述的情况下,初始化程序将从基类开始以正确的顺序运行。如果同一类中的初始化程序很少,则无法保证顺序。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多