Каков порядок выполнения в NUnit?
Я занимаюсь некоторыми исследованиями в области разработки, основанной на тестах, и считаю ее довольно крутой.
Одна из вещей, с которыми мне приходилось сталкиваться, заключалась в том, что когда вы пишете свои тесты, есть порядок выполнения ваших настроек и методов тестирования ([Setup] и [Test]).
Есть ли другие, которые вы можете использовать во время тестирования, и если да, то каков порядок выполнения этих действий, например, распоряжаться или что-то еще? Я видел тестовую установку прибора, но не слишком хорошо знаком с этим.
Пример:
Когда я запускаю тест, он сначала выполняет [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], и каков порядок выполнения для них.
Ответы
Ответ 1
Используя 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";
}
}
}
Ответ 2
Для каждого класса, в котором у вас есть тесты, тестового прибора, вы можете указать 4 специальных метода. Имена методов не очень важны, но вам нужно пометить методы одним из следующих четырех атрибутов, чтобы идентифицировать их.
Конвенция диктует, что вы называете методы такими же, как и атрибуты, но, как я уже сказал, атрибуты являются важным битом.
Обратите внимание, что атрибуты, которые я здесь описываю, - это те, которые находятся в NUnit, но аналогичные атрибуты (если не совпадают) находятся в использовать в большинстве инфраструктур unit test.
Атрибуты:
- TestFixtureSetUp
- TestFixtureTearDown
- SetUp
- Teardown
Первые два относятся к классу в целом. Метод, помеченный атрибутом 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
или наоборот. Это всего лишь то, что вы, возможно, захотите выполнить код.
Ответ 3
Проверьте документацию NUnit:
http://www.nunit.org/index.php?p=attributes&r=2.2.10
В правом меню в разделе "Атрибуты" описано [Setup], [Test] и другие атрибуты, которые вы можете использовать при разработке тестов.
Ответ 4
Имейте в виду, что наилучшей практикой является сохранение случаев unit test независимо друг от друга. Таким образом, их можно понимать, модифицировать и запускать независимо.
Некоторые считают, что установка и устранение плохой практики.
См. Эти ссылки для рассуждений:
Ответ 5
В NUnit 2.5.1 порядок выполнения изменился еще раз. Я согласен с тем, что unittest никогда не должно мешать друг другу.
Ответ 6
NUnit 3.0 внесла некоторые изменения в атрибуты модульных тестов, как указано здесь:
TestFixtureSetUpAttribute и TestFixtureTearDownAttribute продолжают поддерживаются как синонимы для OneTimeSetUpAttribute и OneTimeTearDownAttribute в тестовых документах, но повторно устарел.
Так как SetUpAttribute и TearDownAttribute используются в двух разных способов, невозможно просто осудить их использование в SetUpFixture. Они были запрещены в этом контексте, что является нарушение изменения.
Итак, порядок выполнения следующий:
- OneTimeSetUp
- Настройка
- Тест
- Teardown
- Настройка
- Тест
- Teardown
- OneTimeTearDown