7

在 VS2012.3 .NET4.5 和 R# 中使用 MSTEST 作为测试运行器。

下面的代码按 1、2、3、4 的顺序工作。

但是我担心它可能并不总是按此顺序执行,因为TestInitialize不支持多个属性MSDN

问题:这是否允许,文档是否只是意味着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();
    }
}
4

3 回答 3

7

我相信文档指的是TestInitializeAttribute在同一方法上多次使用。这是由AttributeUsage(AllowMultiple=false). FWIW,我有一个中等规模的测试套件(约 200 个测试),基于您所展示的代码,如您所期望的那样工作:TestStartis called before Setup

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

于 2013-08-29T13:54:49.860 回答
2

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

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

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

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

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

我不确定 MSTest,但在 NUnit 中,它很好地定义了在您描述的情况下,初始化程序将从基类开始以正确的顺序运行。如果您在同一个类中的初始化程序很少,则无法保证顺序。

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

于 2013-08-29T13:47:17.683 回答
2

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

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

于 2013-08-29T19:26:58.860 回答