我一直在做一些关于测试驱动开发的研究,发现它非常酷。
我遇到的一件事是,当你编写测试时,有一个执行你的设置和测试方法的顺序([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]以及这些类型的执行顺序是什么。
答案 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
属性的方法一次。
您可以使用这两个来准备所有测试相同的公共数据结构,并且不会被任何测试修改(这很重要)。
最后两个SetUp
和TearDown
用于标记在每次单独测试之前和之后运行的两种方法。
在每次测试之前调用标记为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)
“属性”下右侧的菜单描述了[设置],[测试]以及开发测试时可以使用的其他属性。
答案 3 :(得分:1)
NUnit 3.0对单元测试属性进行了一些更改,如here所示:
TestFixtureSetUpAttribute和TestFixtureTearDownAttribute 继续 支持OneTimeSetUpAttribute和的同义词 测试装置中的OneTimeTearDownAttribute,但已弃用。
由于SetUpAttribute和TearDownAttribute用于两个不同的 方式,不可能简单地弃用他们的用法 的 SetUpFixture 即可。在这种情况下,他们被禁止,这是一个 打破变革。
因此,执行顺序如下:
答案 4 :(得分:0)
请注意,最佳做法是使单元测试用例彼此独立。因此,他们可以被理解,修改和独立运行。
有些人会考虑设置和拆除不良做法。 请参阅以下链接了解原因:
答案 5 :(得分:0)
在NUnit 2.5.1中,执行顺序再次发生变化。我同意unittest绝不能互相干扰。