【问题标题】:What is the order of execution in NUnit?NUnit中的执行顺序是什么?
【发布时间】:2018-05-04 03:29:53
【问题描述】:

我一直在对测试驱动开发进行一些研究,发现它非常酷。

我遇到的一件事是,当您编写测试时,设置和测试方法([Setup] 和 [Test])有一个执行顺序。

在测试时是否可以使用其他方法,如果有,它们的执行顺序是什么,例如 dispose 或其他什么?我看到了测试夹具设置,但对那个不太熟悉。

例子:

当我运行测试时,它首先执行 [Setup],然后运行 ​​[Test],当它进入下一个测试时,它再次运行 [Setup],然后进入 [Test]。

如果有帮助,我正在使用 NUnit。

这是我设置的截断示例:

using NUnit.Framework;

    namespace TestingProject
    {
        [TestFixture]
        public class CustomerService_Tests
        {
            public string MyAccount = string.Empty;

            [SetUp]
            public void Setup()
            {
                MyAccount = "This Account";
            }

            [Test]
            public void Validate_That_Account_Is_Not_Empty()
            {
                Assert.That(!string.IsNullOrEmpty(MyAccount));
            }

            [Test]
            public void Validate_That_Account_Is_Empty()
            {
                Assert.That(string.IsNullOrEmpty(MyAccount));
            }
        }
    }

所以,当我运行测试时,它会进行设置,然后是第一个测试,然后是设置,然后是第二个测试。

我的问题是在测试时我还可以使用哪些其他类型,例如 [Setup] 和 [Test],以及它们的执行顺序是什么。

【问题讨论】:

标签: unit-testing nunit


【解决方案1】:

使用 NUnit(不确定其他)你有以下执行顺序:

TestFixtureSetup

设置

测试

拆解

设置

测试

拆解

TestFixtureTearDown

每次你运行你的测试时,它总是按那个顺序执行。

如果您查看以下代码,您会看到与我所说的内容完全相同的副本。您甚至可以复制并粘贴此代码,它应该可以工作(使用 NUnit,不确定它是否可以与其他人一起工作)。

如果您在调试模式下运行它,并在每个方法上放置一个断点,您可以在调试时看到执行顺序。

using NUnit.Framework;

namespace Tester
{
    [TestFixture]
    public class Tester
    {
        public string RandomVariable = string.Empty;

        [TestFixtureSetUp]
        public void TestFixtureSetup()
        {
            //This gets executed first before anything else
            RandomVariable = "This was set in TestFixtureSetup";
        }

        [SetUp]
        public void Setup()
        {
            //This gets called before every test
            RandomVariable = "This was set in Setup";
        }

        [Test]
        public void MyTest1()
        {
            //This is your test...
            RandomVariable = "This was set in Test 1";
        }

        [Test]
        public void MyTest2()
        {
            //This is your test...
            RandomVariable = "This was set in Test 2";
        }

        [TearDown]
        public void TestTearDown()
        {
            //This gets executed after your test gets executed. 
            //Used to dispose of objects and such if needed
            RandomVariable = "This was set in TearDown";
        }

        [TestFixtureTearDown]
        public void TestFixtureTearDown()
        {
            //Executes Last after all tests have run.
            RandomVariable = "This was set in TestFixtureTearDown";

        }

    }
}

【讨论】:

  • 也可以做 Console.WriteLine 并且不必设置断点,但无论如何都要 +1
  • 好点!另外,如果你想在调试窗口中跟随它,你可以做一个 Debug.WriteLine()。
  • 我试过了,效果很好! @Davy8,我做了 Console.WriteLine() 并且我看到了更改发生并且可以看到执行顺序。这是很棒的东西。非常感谢您的帮助!
【解决方案2】:

对于您在其中进行测试的每个类,一个测试夹具,您可以指定 4 种特殊方法。方法的名称并不重要,但您需要使用以下四个属性之一标记方法以识别它们。

虽然惯例规定您调用方法与属性相同,但正如我所说,属性是重要的一点。

请注意,我在此处描述的属性是在 NUnit 中找到的属性,但在大多数单元测试框架中都使用了类似的属性(如果不相同)。

属性是:

  • TestFixtureSetUp
  • TestFixtureTearDown
  • 设置
  • 拆解

前两个与整个班级有关。带有TestFixtureSetUp 属性标记的方法在类中的第一个测试之前运行一次。

在执行完类中的所有测试后,使用TestFixtureTearDown 属性标记的方法将执行一次。

您可以使用这两个来准备通用数据结构,这些数据结构对于所有测试都是相同的,并且不会被任何测试修改(这很重要)。

最后两个 SetUpTearDown 用于标记将在每个单独测试之前和之后运行的两个方法。

标记为SetUp 的方法在每次测试之前调用,标记为TearDown 的方法在每次测试之后调用。您可以使用这些来准备通用数据结构,尽管它们对于每个测试都是相同的,但它们会被部分或全部测试更改,因此最好为每个测试准备一个新的副本。

将这些方法的执行布置为伪代码给了我们这样的顺序:

execute TestFixtureSetUp, if present
for each test do
    execute SetUp, if present
    execute actual test
    execute TearDown, if present
execute TestFixtureTearDown, if present

这些属性的使用完全是可选的。您无需拥有SetUp 即可拥有TearDown,反之亦然。它们只是您可能想要执行代码的点。

【讨论】:

    【解决方案3】:

    NUnit 3.0 对单元测试属性进行了一些更改,如 here 所示:

    TestFixtureSetUpAttribute 和 TestFixtureTearDownAttribute 继续 支持作为 OneTimeSetUpAttribute 的同义词和 测试装置中的 OneTimeTearDownAttribute,但已被弃用。

    由于 SetUpAttribute 和 TearDownAttribute 用于两种不同的 方式,不可能简单地弃用它们在 SetUpFixture。在这种情况下,它们已被禁止,这是 重大变化。

    所以,执行顺序如下:

    • 一次性设置
    • 设置
    • 测试
    • 拆解
    • 设置
    • 测试
    • 拆解
    • OneTimeTearDown

    【讨论】:

      【解决方案4】:

      查看NUnit documentation

      “属性”下右侧的菜单描述了 [Setup]、[Test] 和您在开发测试时可以使用的其他属性。

      【讨论】:

        【解决方案5】:

        请注意,最佳做法是保持单元测试用例相互独立。因此它们可以被理解、修改和独立运行。

        有些人认为设置和拆卸也是一种不好的做法。 请参阅以下链接了解原因:

        【讨论】:

          【解决方案6】:

          在 NUnit 2.5.1 中,执行顺序再次发生了变化。我同意 unittest 绝不能相互干扰。

          【讨论】:

            猜你喜欢
            • 2018-01-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-20
            • 1970-01-01
            • 1970-01-01
            • 2020-02-14
            相关资源
            最近更新 更多