Каков порядок выполнения в NUnit? - PullRequest
13 голосов
/ 28 мая 2009

Я проводил некоторые исследования в области разработки, основанной на тестировании, и считаю ее довольно крутой.

Одна из вещей, с которыми я столкнулся, заключалась в том, что при написании тестов существует порядок выполнения ваших настроек и методов тестирования ([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], и каков порядок их выполнения.

Ответы [ 6 ]

21 голосов
/ 28 мая 2009

Используя 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";

        }

    }
}
4 голосов
/ 28 мая 2009

Для каждого класса, в котором у вас есть тесты, тестовое приспособление, вы можете указать 4 специальных метода. Имена методов не очень важны, но вам нужно пометить методы одним из следующих четырех атрибутов, чтобы идентифицировать их.

Соглашение требует, чтобы вы вызывали методы так же, как и атрибуты, но, как я уже сказал, атрибуты - это важный бит.

Обратите внимание, что атрибуты, которые я здесь описываю, - это атрибуты, найденные в NUnit , но аналогичные атрибуты (если не одинаковые) используются в большинстве структур модульных тестов.

Атрибуты:

  • 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 или наоборот. Это просто точки, в которых вы, возможно, захотите выполнить код.

2 голосов
/ 28 мая 2009

Ознакомьтесь с документацией NUnit .

Меню в правой части под «Атрибутами» описывает [Setup], [Test] и другие атрибуты, которые вы можете использовать при разработке ваших тестов.

1 голос
/ 16 марта 2017

В NUnit 3.0 внесены некоторые изменения в атрибуты модульных тестов, как указано здесь :

TestFixtureSetUpAttribute и TestFixtureTearDownAttribute продолжить поддерживаться как синонимы для OneTimeSetUpAttribute и OneTimeTearDownAttribute в тестовых приборах, но устарел.

Поскольку SetUpAttribute и TearDownAttribute используются в двух разных Кстати, невозможно просто отказаться от их использования в SetUpFixture . Они были запрещены в этом контексте, который является критическое изменение.

Итак, порядок выполнения следующий:

  • OneTimeSetUp
  • Настройка
  • Test
  • Teardown
  • Настройка
  • Тест
  • Teardown
  • OneTimeTearDown
0 голосов
/ 14 ноября 2009

В NUnit 2.5.1 порядок выполнения еще раз изменился. Я согласен, что unittest никогда не должен мешать друг другу.

0 голосов
/ 28 мая 2009

Имейте в виду, что наилучшей практикой является независимость тестовых случаев друг от друга. Таким образом, их можно понять, изменить и запустить независимо.

Некоторые считают настройку и демонтаж плохой практикой. Смотрите эти ссылки для рассуждений:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...