我在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
运行测试答案 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 之前只运行一次代码。
使用单独的类作为基类(如果需要)和作为设置夹具(如果需要其中一个)。