Какъв е редът на изпълнение в 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] и какъв е редът на изпълнение за тях.


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 редът на изпълнение е променен още веднъж. Съгласен съм, че unittest никога не трябва да си пречат един на друг.

person Vapour in the Alley    schedule 14.11.2009