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

use*_*r85 2 nunit nunit-console nunit-3.0

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

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

设置夹具.设置

测试夹具.设置

测试夹具.测试

测试夹具.TearDown

测试夹具.设置

测试夹具.测试

测试夹具.TearDown

设置夹具.TearDown

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

测试夹具.设置

测试夹具.测试

测试夹具.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() ....");
        }

    }
Run Code Online (Sandbox Code Playgroud)

控制台输出

=> TestSample.TestClass.test

 ....I'm inside TestClass.test() ....
=> TestSample.TestClass
 ---------- Calling OneTimeSetUp ----------
=> TestSpecflow.TestBase
 ---------- Calling OneTimeSetUp ----------
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*use 5

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

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

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

如果它的顺序不符合您的预期,请查看命名空间。请记住,a[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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是运行的输出nunit3-console.exe

=> NUnitFixtureSetup.SetupClass
One time setup
=> NUnitFixtureSetup.TestClass.TestMethod
Test Method
Run Code Online (Sandbox Code Playgroud)