Каков порядок выполнения в NUnit?

Я проводил некоторые исследования в области разработки через тестирование и нахожу это довольно крутым.

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


person Community    schedule 28.05.2009    source источник
comment
TIL TestCaseSource запускается до любого из них, см. stackoverflow.com/questions/40505717/.   -  person Chris Oldwood    schedule 11.02.2019


Ответы (6)


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

        }

    }
}
person CodeLikeBeaker    schedule 28.05.2009
comment
Также можно сделать Console.WriteLine и не устанавливать точки останова, но +1 в любом случае - person Davy8; 28.05.2009
comment
Хорошая точка зрения! Кроме того, вы можете выполнить Debug.WriteLine(), если хотите следовать за ним в окне отладки. - person CodeLikeBeaker; 28.05.2009
comment
Я попробовал это, и это сработало отлично! @ Davy8, я сделал Console.WriteLine(), увидел, как произошли изменения, и увидел порядок выполнения. Это отличный материал. Большое вам спасибо за вашу помощь! - person ; 28.05.2009

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

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

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

Атрибуты:

  • TestFixtureSetUp
  • TestFixtureTearDown
  • Настраивать
  • Срывать

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

person Lasse V. Karlsen    schedule 28.05.2009

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

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

person JerSchneid    schedule 28.05.2009

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

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

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

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

  • OneTimeSetUp
  • Настраивать
  • Контрольная работа
  • Срывать
  • Настраивать
  • Контрольная работа
  • Срывать
  • OneTimeTearDown
person Alexei - check Codidact    schedule 16.03.2017

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

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

person Vizu    schedule 28.05.2009

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

person Vapour in the Alley    schedule 14.11.2009