NUnit中的执行顺序是什么?

时间:2009-05-28 15:04:17

标签: unit-testing nunit

我一直在做一些关于测试驱动开发的研究,发现它非常酷。

我遇到的一件事是,当你编写测试时,有一个执行你的设置和测试方法的顺序([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]以及这些类型的执行顺序是什么。

6 个答案:

答案 0 :(得分:21)

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

TestFixtureSetup

设置

测试

TearDown中

设置

测试

TearDown中

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";

        }

    }
}

答案 1 :(得分:4)

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

约定规定您调用方法与属性相同,但正如我所说,属性是重要的。

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

属性是:

  • TestFixtureSetUp
  • TestFixtureTearDown
  • 设置
  • TearDown中

前两个与整个班级有关。标记有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,反之亦然。它们只是您可能希望执行代码的点。

答案 2 :(得分:2)

查看NUnit documentation

“属性”下右侧的菜单描述了[设置],[测试]以及开发测试时可以使用的其他属性。

答案 3 :(得分:1)

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

  

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

     

由于SetUpAttribute和TearDownAttribute用于两个不同的   方式,不可能简单地弃用他们的用法   的 SetUpFixture 即可。在这种情况下,他们被禁止,这是一个   打破变革。

因此,执行顺序如下:

  • OneTimeSetUp
  • 设置
  • 测试
  • TearDown中
  • 设置
  • 测试
  • TearDown中
  • OneTimeTearDown

答案 4 :(得分:0)

请注意,最佳做法是使单元测试用例彼此独立。因此,他们可以被理解,修改和独立运行。

有些人会考虑设置和拆除不良做法。 请参阅以下链接了解原因:

答案 5 :(得分:0)

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