为什么在[Test]之后而不是之前调用Nunit3 OneTimeSetUp()

时间:2017-05-17 16:36:28

标签: nunit nunit-3.0 nunit-console

我在Nunit 2.6中编写了单元测试,但计划升级到Nunit 3.6.1,但是我注意到Nunit 3.6.1有一个奇怪的问题(或者我可能没理解它)。问题出在OneTimeSetUp()。

在Nunit 2.6.3中,我有SetUpFixtureAttribute [SetUpFixture],并且在SetUpAttribute [SetUp]中,它按预期工作,流程是

SetUpFixture.Setup

TestFixture.Setup

TestFixture.Test

TestFixture.TearDown

TestFixture.Setup

TestFixture.Test

TestFixture.TearDown

SetUpFixture.TearDown

当我升级到Nunit 3时,我用OneTimeSetUp替换了SetUpFixture中的SetUp(),并在运行我的代码之后获得了以下流程

TestFixture.Setup

TestFixture.Test

TestFixture.TearDown

SetUpFixture.OneTimeSetUp

SetUpFixture.OneTimeTearDown

以下是我在我的机器上尝试的示例代码以及命令行输出

   [SetUpFixture]
    public class TestBase
    {
        [OneTimeSetUp]
        //[SetUp]
        public static void MyTestSetup()
        {
            Console.WriteLine(" ---------- Calling OneTimeSetUp ----------");

        }
    }


[TestFixture]
    class TestClass : TestBase
    {
        [Test]
        public void test()
        {
            Console.WriteLine("\n ....I'm inside TestClass.test() ....");
        }

    }

控制台输出

=> TestSample.TestClass.test

 ....I'm inside TestClass.test() ....
=> TestSample.TestClass
 ---------- Calling OneTimeSetUp ----------
=> TestSpecflow.TestBase
 ---------- Calling OneTimeSetUp ----------

有人可以建议我在这里缺少什么吗? 我正在通过nunit-console

运行测试

2 个答案:

答案 0 :(得分:3)

问题是输出是误导性的,而不是代码执行的顺序。由于NUnit 3支持并行执行,因此它会捕获输出并在完成测试执行级别时将其显示在控制台上。

在您的情况下,夹具设置包装测试,因此它在测试后完成执行并随后输出捕获的文本。

如果您调试测试,或将Console.WriteLine调用切换到立即输出的TestContext.Progress.WriteLine,您将看到代码按您期望的顺序执行。

如果它不符合您的预期,请查看名称空间。请记住,[SetupFixture]用于在命名空间级别进行设置。如果您的测试位于不同的命名空间中,则可能会以不同的顺序调用它们。如果您想要对所有测试进行设置,请将该类放在顶级命名空间中,或者如果您有多个命名空间,则不要使用任何名称空间。

这是一些测试代码,

namespace NUnitFixtureSetup
{
    [SetUpFixture]
    public class SetupClass
    {
        [OneTimeSetUp]
        public void MyTestSetup()
        {
            TestContext.Progress.WriteLine("One time setup");
        }
    }

    [TestFixture]
    public class TestClass
    {
        [Test]
        public void TestMethod()
        {
            TestContext.Progress.WriteLine("Test Method");
        }
    }
}

以下是使用nunit3-console.exe

运行的输出
=> NUnitFixtureSetup.SetupClass
One time setup
=> NUnitFixtureSetup.TestClass.TestMethod
Test Method

答案 1 :(得分:3)

Rob的回答是你遇到问题的根本原因,但是还有一个问题,但是在你的代码中有一个问题,尽管不在Rob中。

在您的代码中,您使用TestBase两次:作为SetUpFixture和TestFixture的基类。

这意味着OneTimeSetUp方法将被使用两次......一次在命名空间中的所有灯具之前,并且在从它继承的任何测试夹具之前一次。以这种方式使用SetUpFixture会破坏它的目的,即在命名空间中 all 之前只运行一次代码。

使用单独的类作为基类(如果需要)和作为设置夹具(如果需要其中一个)。