Замовлення на тест NUnit


110

За замовчуванням тести на нуніти виконують за алфавітом. Хтось знає про будь-який спосіб встановити порядок виконання? Чи існує для цього атрибут?


7
Чому б ти хотів це зробити? Це здається, що ти маєш залежність від порядку виконання, що погано. Вам потрібно переглянути, чому ви цього хочете. Одиничні тести повинні працювати ізольовано і бути повністю незалежними від інших. Це здається, що ви створюєте кандидатів на тестовий запах Erratic Tests .
RichardOD

Це схоже на дублікат, але ви можете побачити мою відповідь на це тут
Джонно Нолан

12
@RichardOD - повинен! = Повинен. І це насправді не є подією необхідною, адже насправді майже всі тести на інтеграцію виконуються в порядку - запитайте у команди QA, чи вони рандомізують порядок їх тестування.
tymtam

4
В даний час у мене є кілька тестів, чий порядок, мабуть, має значення, хоча він і не повинен. Особисто я хотів би спосіб рандомізувати тестовий порядок спеціально, щоб допомогти мені переконатися, що мої тести НЕ якось залежать від порядку. Звичайно, те, що я дійсно хотів би бути тестовим бігуном, який би виконував усі мої тести у випадковому порядку, поки не знайде проблеми, або я скажу "стоп". Якби я пробігав це протягом ночі, а вранці все було зеленим, то я міг би бути впевнений, що я усунув останній із непередбачуваних побічних ефектів.
Мел

1
це питання було б більш актуальним, якби питання було оновлено для уточнення, ми говоримо про інтеграційні тести тут ... Ми всі знаємо правила щодо тестування одиниць, принаймні, якщо ви читали тести XUnit тестів і дотримувались дядька Боба тощо. Ви робите .. але такі рамки, як NUnit, також дуже корисні для швидкого запуску інтеграційних тестів, і ви точно не хочете, щоб вони були випадковими, особливо якщо йдеться про дорогу установку бази даних ..
nrjohnstone

Відповіді:


51

Кожен ваш тест повинен мати можливість самостійно працювати і самостійно. Якщо вони задовольняють цьому критерію, то порядок значення не має.

Однак бувають випадки, коли спочатку потрібно запустити певні тести. Типовий приклад - це ситуація безперервної інтеграції, коли деякі тести тривають довше інших. Ми використовуємо атрибут категорії, щоб ми могли запускати тести, які використовують глузування перед тестами, які використовують базу даних.

тобто поставте це на початку ваших швидких тестів

[Category("QuickTests")]

Якщо у вас є тести, які залежать від певних умов навколишнього середовища, врахуйте атрибути TestFixtureSetUp та TestFixtureTearDown , які дозволяють позначити методи, які потрібно виконати до і після тестів.


2
@Chris, я, як правило, не використовую ці атрибути, це цікавий блог post- jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html . Хороший момент про тести на категорії, хоча.
RichardOD

29
Інший приклад тестів, що залежать від замовлення, - це коли ви хочете використовувати свою рамку nunit для запуску тесту на інтеграцію ...
Байрон Росс,

1
@ByronRoss: Я, як правило, збільшую тести, коли це роблю, і якомога більше спираюся на існуючі тести, щоб я могла написати менше тестів. Тоді кожен повний пробіг може вийти з ладу окремо. Я також намагаюся розробити свої дані так, щоб вони могли жити окремо від існуючих даних, а не залежно від існуючих даних.
Мерлін Морган-Грехем

1
Якщо ви не запускаєте свої тести у випадковому порядку, як ви можете перевірити, чи справді вони працюють, коли закінчилися? Те, що ви говорите, аналогічно тому, що "Якщо у вашому програмному забезпеченні немає помилок, тестування не потрібне".
jforberg

@jforberg: Якщо у вас є збій, який трапляється випадковим чином, як ви скажете, коли виправили це?
NeedHack

175

Я просто хочу зазначити, що хоча більшість опитаних вважали, що це були одиничні тести, у питанні не було вказано, що вони є.

nUnit - чудовий інструмент, який можна використовувати в різних ситуаціях тестування. Я бачу відповідні причини, які хочуть контролювати тестовий порядок.

У таких ситуаціях мені довелося вдатися до включення порядку виконання у назву тесту. Було б чудово, щоб можна було вказати порядок виконання за допомогою атрибута.


Ти маєш на увазі, що ти, наприклад, називав свої тести 001_first_test 002_second_testтощо?
ashes999

Так, це вірно, хоча я зазвичай використовую шаблон , який дозволяє мені легко вставити випробувань , якщо це необхідно, тому , можливо , 010_first_test, 020_second_test і т.д.
Les

83
Дякую за єдину тут здорову відповідь. Це специфічне запитання, але все-таки якимось невиразними педантичними відповідями наголошується. Так, ми всі знаємо, якими повинні бути одиничні тести, але це не питання.
Єгор Павлихін

1
Ви повинні НЕ покладатися на порядок виконання будучи алфавітний. Багато тестувальників одночасно виконують ваші тести на багатьох потоках або процесах, не обов'язково в алфавітному порядку. Наприклад, NCrunch визначає пріоритетність тестів на основі зміни коду (тести, які вплинули), потім на те, чи не відбулися вони минулого разу, а потім на те, чи вони запускаються швидко чи повільно. Якщо ви хочете певного порядку , просто створіть мета-бігун для цих тестів і виключіть їх із регулярних запусків.
Авель

3
Ще одна вагома причина уточнення порядку - це спочатку вирішити певні проблеми, перш ніж продовжувати роботу з рештою тестового набору. Іншими словами, якщо мій тест на створення користувача не вдається, мені не потрібно все інше запускати до того, як я дізнаюся цей результат. У своєму іншому тесті я, мабуть, знущаюся над користувачем, але мені важливо, щоб це був перший тест, який не вдався, особливо коли пакет тестів великий.
Брон Девіс

125

NUnit 3.2.0 додав OrderAttribute, див .:

https://github.com/nunit/docs/wiki/Order-Attribute

Приклад:

public class MyFixture
{
    [Test, Order(1)]
    public void TestA() { ... }


    [Test, Order(2)]
    public void TestB() { ... }

    [Test]
    public void TestC() { ... }
}

5
Дякую, прямо до того, що я шукав - і ніяких дискусій, чому це добре чи погано :)
aknoepfel

1
І тоді вони роблять це цілим числом, а не десятковим, тому якщо треба вставити тест, усі тести повинні бути перенумеровані.
епітка

Ви завжди можете почати з дуже великої кількості, як мільйони чи щось, якщо ви хочете ввести таким чином середні елементи - просто більше набираючи текст. Imo, має бути простіший спосіб замовити речі, ніж використовувати числа для пріоритету, як дерево залежності залежності від методу, але у кожного є свої власні дис / переваги.
Разван Флавій Панда

9
Хороша відповідь, але будьте уважні, документація заявляє, що випробування не чекають завершення попередніх тестів.
ROX

Цікаво, що з мого досвіду, якщо додати атрибути Test і Order окремо, немає гарантії замовлення тестів.
AT

22

Бажаючи, щоб тести запускалися в певному порядку, не означає, що тести залежать один від одного - я зараз працюю над проектом TDD, і будучи хорошим TDDer, я все знущався / заглушив, але це зробить він легше читається, якщо я міг би вказати порядок відображення результатів тестів - тематично замість алфавіту. Поки що єдине, про що я можу придумати, - це передати a_ b_ c_ до класів до класів, просторів імен та методів. (Не приємно) Я думаю, що атрибут [TestOrderAttribute] був би непоганим - не суворо дотримувався рамки, а підказки, щоб ми могли досягти цього


10

Незалежно від того, залежать чи ні тести від порядку ... деякі з нас просто хочуть контролювати все впорядковано.

Одиничні тести, як правило, створюються в порядку складності. Отже, чому б їх також не проводити в порядку складності чи порядку, в якому вони були створені?

Особисто мені подобається бачити тести, які виконуються в тому порядку, в якому я їх створив. У TDD кожен наступний тест, природно, буде складнішим і потребує більше часу для запуску. Я б швидше побачив, що простіший тест провалиться спочатку, оскільки це буде кращим показником щодо причини відмови.

Але я також бачу вигоду від запуску їх у випадковому порядку, особливо якщо ви хочете перевірити, що ваші тести не залежать від інших тестів. Як щодо додавання опції для тестування бігунів до "Виконання тестів випадковим чином до зупинки"?


9

Я тестую селен на досить складному веб-сайті, і весь набір тестів може тривати більше півгодини, і я ще не в змозі охопити всю програму. Якщо я повинен переконатися, що всі попередні форми правильно заповнені для кожного тесту, це додасть великої кількості часу, а не лише невеликої кількості часу, до загального тесту. Якщо занадто багато накладних витрат на тести, люди не запускатимуть їх так часто, як слід.

Отже, я приводжу їх у порядок і залежать від попередніх тестів, щоб текстові поля та такі були заповнені. Я використовую Assert.Ignore (), коли попередні умови не дійсні, але мені потрібно, щоб вони працювали в порядку.


1
Повністю. Я тут в одному човні.
Сон Сміт

Я також! Саме тому я приземлився на це питання!
Ніклас Вульф

@NiklasRingdahl, якщо ви використовуєте візуальну студію з nunit, dump nunit і використовуєте тести MS. тоді ви можете скористатись замовленим файлом візуальної студії, щоб організувати тестові справи в тому порядку, у якому ви хочете їх виконати
Рахул Лода

@RahulLodha Дякую! Я розберуся в цьому.
Ніклас Вульф

9

Мені дуже подобається попередня відповідь.

Я трохи змінив його, щоб мати можливість використовувати атрибут для встановлення діапазону замовлень:

namespace SmiMobile.Web.Selenium.Tests
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using NUnit.Framework;

    public class OrderedTestAttribute : Attribute
    {
        public int Order { get; set; }


        public OrderedTestAttribute(int order)
        {
            Order = order;
        }
    }

    public class TestStructure
    {
        public Action Test;
    }

    class Int
    {
        public int I;
    }

    [TestFixture]
    public class ControllingTestOrder
    {
        private static readonly Int MyInt = new Int();

        [TestFixtureSetUp]
        public void SetUp()
        {
            MyInt.I = 0;
        }

        [OrderedTest(0)]
        public void Test0()
        {
            Console.WriteLine("This is test zero");
            Assert.That(MyInt.I, Is.EqualTo(0));
        }

        [OrderedTest(2)]
        public void ATest0()
        {
            Console.WriteLine("This is test two");
            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(2));
        }


        [OrderedTest(1)]
        public void BTest0()
        {
            Console.WriteLine("This is test one");
            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(1));
        }

        [OrderedTest(3)]
        public void AAA()
        {
            Console.WriteLine("This is test three");
            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(3));
        }


        [TestCaseSource(sourceName: "TestSource")]
        public void MyTest(TestStructure test)
        {
            test.Test();
        }

        public IEnumerable<TestCaseData> TestSource
        {
            get
            {
                var assembly =Assembly.GetExecutingAssembly();
                Dictionary<int, List<MethodInfo>> methods = assembly
                    .GetTypes()
                    .SelectMany(x => x.GetMethods())
                    .Where(y => y.GetCustomAttributes().OfType<OrderedTestAttribute>().Any())
                    .GroupBy(z => z.GetCustomAttribute<OrderedTestAttribute>().Order)
                    .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

                foreach (var order in methods.Keys.OrderBy(x => x))
                {
                    foreach (var methodInfo in methods[order])
                    {
                        MethodInfo info = methodInfo;
                        yield return new TestCaseData(
                            new TestStructure
                                {
                                    Test = () =>
                                        {
                                            object classInstance = Activator.CreateInstance(info.DeclaringType, null);
                                            info.Invoke(classInstance, null);
                                        }
                                }).SetName(methodInfo.Name);
                    }
                }

            }
        }
    }
}

Я думаю, що такий підхід чудовий. Зауважте, хоча, що код відображення збирає усі методи з атрибутом, тому, якщо ви намагаєтеся запустити певний тестовий пристрій, ви можете здивуватися, виявивши, що він працює більше, ніж ви думали. Ви можете легко змінити запит LINQ, якщо це не бажана поведінка. Дивіться посилання у моїй відповіді для отримання додаткової інформації.
Кріпсі

OrderedTestбільше не підтримується в NUnit 3.
Конрад

7

Я знаю, що це відносно стара публікація, але ось ще один спосіб зберегти свій тест для того, щоб БЕЗ робити незрозумілих імен тестів. Використовуючи атрибут TestCaseSource і маючи об’єкт, який ви передаєте, є делегатом (Action), ви можете повністю не тільки контролювати порядок, але і називати тест, яким він є.

Це працює, тому що, згідно з документацією, елементи колекції, повернені з тестового джерела, завжди виконуватимуться в тому порядку, який вони вказані.

Ось демонстрація презентації, яку я даю завтра:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;

namespace NUnitTest
{
    public class TestStructure
    {
        public Action Test;
    }

    class Int
    {
        public int I;
    }

    [TestFixture]
    public class ControllingTestOrder
    {
        private static readonly Int MyInt= new Int();

        [TestFixtureSetUp]
        public void SetUp()
        {
            MyInt.I = 0;
        }

        [TestCaseSource(sourceName: "TestSource")]
        public void MyTest(TestStructure test)
        {
            test.Test();
        }

        public IEnumerable<TestCaseData> TestSource
        {
            get
            {
                yield return new TestCaseData(
                    new TestStructure
                    {
                        Test = () =>
                        {
                            Console.WriteLine("This is test one");
                            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(1));
                        }
                    }).SetName(@"Test One");
                yield return new TestCaseData(
                    new TestStructure
                    {
                        Test = () =>
                        {
                            Console.WriteLine("This is test two");
                            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(2));
                        }
                    }).SetName(@"Test Two");
                yield return new TestCaseData(
                    new TestStructure
                    {
                        Test = () =>
                        {
                            Console.WriteLine("This is test three");
                            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(3));
                        }
                    }).SetName(@"Test Three");
            }
        }
    }
}

Я використовую цю схему для паралельних інтеграційних тестів, які би зайняли занадто багато часу для лінійного запуску. Усі тести мають один тип, тому я використовую Action <T in>, і в кожній дії є ключ, який говорить про те, що означає "ShouldBeFoo". Таким чином тест тесту буде видно у назві тесту, і TestCaseSource можна відфільтрувати, щоб різні типи тестів були згруповані разом. Як не дивно, я не дбаю про порядок виконання, але погоджуюся, що це спрацювало б.
Новатерата

Використання TestCaseSourceяк спосіб запуску замовлених тестів є геніальним штрихом. Молодці. Я застосував цей підхід разом із наведеним нижче та додав кілька додаткових модифікацій, щоб полегшити його використання. Дивіться посилання у моїй відповіді для додаткової інформації, але основна ідея - це від цієї чудової відповіді!
Кріпсі

На жаль, з NUnit 3 джерело TestCaseSourceповинен бути статичним, що виключає використання шаблону. Бампер.
Конрад

@Conrad Я не бачу, яка різниця робить метод статичним чи ні. Тест все ще повертається до порядку в будь-якому випадку.
Дейв Буш

Це не той метод, який повинен бути статичним - джерело (змінна або властивість) TestCaseSourceмає бути статичним об'єктом в NUnit 3, інакше тести не виконуватимуться. І ви не можете створювати динамічні об'єкти в статичному об'єкті. Ось чому це не буде працювати в т. 3.
Конрад

5

Я працюю з тестовими випадками UI інтерфейсу Selenium WebDriver, написаними на C #, які виконуються за допомогою NUnit Framework. (Не одиничні випадки як такі)

Ці тести на користувальницький інтерфейс, безумовно, залежать від порядку виконання, оскільки інший тест повинен додати деякі дані як попередню умову. (Неможливо виконати кроки у кожному тесті)

Тепер, додавши десятий тестовий випадок, я бачу, що NUnit хоче запустити в такому порядку: Test_1 Test_10 Test_2 Test_3 ..

Тож я гадаю, що мені зараз доводиться занадто алфавізувати назви тестових випадків, але було б добре, щоб ця невелика особливість контролю наказу про виконання була додана до NUnit.


9
Не погоджуючись з Arran: Тести інтерфейсу по суті є послідовністю невеликих кроків. Кожен крок повинен бути тестом (Причина - якщо не вдасться, мені потрібно знати, який крок). Послідовності можуть бути незалежними, але в межах послідовності необхідне замовлення і зупинка на відмову.
Засс

3

Зазвичай Тест одиниці повинен бути незалежним, але якщо потрібно, то ви можете назвати свої методи в алфавітному порядку, наприклад:

[Test]
public void Add_Users(){}

[Test]
public void Add_UsersB(){}

[Test]
public void Process_Users(){}

або ви можете зробити ..

        private void Add_Users(){}

        private void Add_UsersB(){}

        [Test]
        public void Process_Users()
        {
           Add_Users();
           Add_UsersB();
           // more code
        }

2
За винятком того, що назви повинні бути в алфавітному порядку, що є жахливим рішенням. :(

@ user166390 - це не жахливо. Це працює і залежить від документально підтвердженої поведінки NUnit.
tymtam

➕1 досить добре для мене, набагато простіше, якщо ви почнете свої тести з a_ b_ t1_, t2_замість цього або покладаєтесь на пропустити
простежуючих

3

Для використання механізму тестового замовлення є дуже вагомі причини. Більшість моїх власних тестів використовують добру практику, таку як налаштування / вибування. Іншим потрібна велика кількість налаштувань даних, які потім можуть бути використані для тестування цілого ряду функцій. До цих пір я використовував великі тести для обробки цих інтеграційних тестів (Selenium Webdriver). Однак, я вважаю, що запропонований вище пост на https://github.com/nunit/docs/wiki/Order-Attribute має багато достоїнств. Ось приклад того, чому замовлення було б надзвичайно цінним:

  • Використання Selenium Webdriver для запуску тесту для завантаження звіту
  • Стан звіту (завантажуваний він чи ні) кешується протягом 10 хвилин
  • Це означає, що перед кожним тестом мені потрібно скинути стан звіту, а потім зачекати до 10 хвилин до того, як стан підтвердиться, що він змінився, а потім перевірити правильність завантаження звіту.
  • Звіти не можуть бути створені практичним / своєчасним шляхом глузування або будь-якого іншого механізму в рамках тесту через їх складність.

Цей 10-хвилинний час очікування сповільнює набір тестів. Коли ви множите подібні затримки кешування у безлічі тестів, це забирає багато часу. Замовлення тестів може дозволити налаштування даних робити як "Тест" прямо на початку тестового набору, при цьому тести покладаються на кеш, щоб бюст виконувався наприкінці тестового циклу.


2

Це питання справді старе, але для людей, які можуть досягти цього в результаті пошуку, я взяв відмінні відповіді від user3275462 та PvtVandals / Rico і додав їх у сховище GitHub разом із деякими власними оновленнями. Я також створив пов’язану публікацію блогу з додатковою інформацією, яку ви можете переглянути для отримання додаткової інформації.

Сподіваюся, що це корисно для всіх вас. Крім того, мені часто подобається використовувати атрибут Категорія, щоб відрізняти мої інтеграційні тести або інші тестові цілі від моїх фактичних одиничних тестів. Інші зазначають, що одиничні тести не повинні залежати від порядку, але інші типи тестів часто це роблять, тому це дає хороший спосіб запустити лише потрібну категорію тестів, а також замовити ці тестові тести.


чи можете ви допомогти мені у питанні, яке я маю, ось посилання: stackoverflow.com/questions/31281395/…
Morgan Soren

1

Я здивований, що у спільноті NUnit нічого не придумали, тому я пішов створити щось подібне сам.

Зараз я розробляю бібліотеку з відкритим кодом, яка дозволяє замовити свої тести з NUnit. Ви можете замовити тестові пристосування та замовити "замовлені специфікації тестування" так само.

Бібліотека пропонує такі функції:

  • Побудувати складні ієрархії тестування впорядкування
  • Пропустіть наступні тести, якщо тест з ладу не вдається
  • Замовляйте свої методи тестування залежно від цілого порядку
  • Підтримує використання паралельно з невпорядкованими тестами. Неорганізовані тести виконуються спочатку.

Бібліотека насправді надихається тим, як MSTest здійснює тестове впорядкування .orderedtestфайлів. Перегляньте приклад нижче.

[OrderedTestFixture]
public sealed class MyOrderedTestFixture : TestOrderingSpecification {
    protected override void DefineTestOrdering() {
        TestFixture<Fixture1>();

        OrderedTestSpecification<MyOtherOrderedTestFixture>();

        TestFixture<Fixture2>();
        TestFixture<Fixture3>();
    }

    protected override bool ContinueOnError => false; // Or true, if you want to continue even if a child test fails
}

1

Якщо ви використовуєте [TestCase], аргумент TestNameвказує назву тесту.

Якщо не вказано, ім'я створюється на основі назви методу та наданих аргументів.

Ви можете контролювати порядок виконання тесту, як наведено нижче:

                    [Test]
            [TestCase("value1", TestName = "ExpressionTest_1")]
            [TestCase("value2", TestName = "ExpressionTest_2")]
            [TestCase("value3", TestName = "ExpressionTest_3")]
            public void ExpressionTest(string  v)
            {
                //do your stuff
            }

Тут я використав "ExpressionTest"суфікс назви методу з числом.

Ви можете використовувати будь-які імена, упорядковані за алфавітом, див. Атрибут TestCase


0

Ви не повинні залежати від порядку, в якому тестова рамка підбирає тести для виконання.Тести повинні бути ізольованими та незалежними. У зв'язку з цим вони не повинні залежати від деяких інших тестових установок для них чи прибирання після них. Вони також повинні давати однаковий результат незалежно від порядку виконання тестів (для даного знімка SUT)

Я трохи погукав. Як завжди, деякі люди вдаються до підступних хитрощів (замість того, щоб вирішувати основні проблеми тестування / дизайну

  • називаючи тести в алфавітному порядку, таким чином, щоб тести відображалися в тому порядку, який вони потребують. Однак NUnit може змінити цю поведінку з пізнішим випуском, і тоді ваші тести будуть прийняті. Краще перевірте в поточних бінарних файлах NUnit до Source Source.
  • VS (ІМХО, що заохочує неправильну поведінку своїми "спритними інструментами"), у своєму тестуванні для MS-тестів називається "упорядкованими тестами". Я не витрачав часу на читання, але, схоже, націлений на ту саму аудиторію

Дивіться також: характеристики хорошого тесту


Бувають випадки, коли ви хочете виконати швидші запущені тести перед тривалими запущеними тестами, зокрема, при тестах інтеграції та прийняття. Наприклад, у програмі для ведення блогів: спершу ви тестуєте логін, оскільки якщо ця функція не працює, публікація також не працюватиме, тому немає ніякого сенсу виконувати цей тест (ви можете зупинити бігуна вручну). Але якщо ви спробуєте тримати запущені тести, це займе більше часу.
Марсель Вальдес Орозько

@MarcelValdezOrozco - ви можете досягти цієї мети, розділивши свої тести або через різні фізичні dll, або за допомогою тегів / категорій. Ви можете створити свої сценарії побудови для запуску dll / категорій в порядку. Взагалі, дозволити замовлення тестів, як правило, призводить до поєднаних тестів, що розвивають залежність від сусідніх тестів (з часом, звичайно). ПОСЛУГА в наступному великому випуску NUnit, він буде підтримувати різні замовлення тестів, наприклад, випадкові тощо.
Gishu

2
Далі розділяти однотипні тести (наприклад, тести прийняття) не має сенсу, і розділення їх на іншу DLL без потреби виховує всюди складність: вихідний код, сценарії побудови, тестові сценарії, структура проекту тощо. Просто для простого упорядкування тести.
Марсель Вальдес Ороско

Випромінювання (в основному всі глузуючі губки) - причина, чому порядок буде важливим. Ви не можете вивантажити домен додатка, і nunit runner (якщо він виконує всі тести в збірці) зберігає цей домен для всіх тестів принаймні у тому, що "фіксується". Якщо один тест створює типи для тестування чогось, а інший тест суперечить цьому створеному типу через порядок, це не є несправним тестом. Вони логічно ізольовані, це просто те, що nUnit не забезпечує належної ізоляції між кожним «тестом».
Келлі Елтон

6
Це досить покровительська відповідь, і це робить смішним, оскільки воно дійсно стосується лише одиничних тестів і повністю ігнорує прагматичність.
tymtam

0

У разі використання TestCaseSourceключа - це override string ToStringметод, як це працює:

Припустимо, у вас є клас TestCase

public class TestCase
{
    public string Name { get; set; }
    public int Input { get; set; }
    public int Expected { get; set; }
}

І список тестових випадків:

private static IEnumerable<TestCase> TestSource()
{
    return new List<TestCase>
    {
        new TestCase()
        {
           Name = "Test 1",
           Input = 2,
           Expected = 4
        },
        new TestCase()
        {
            Name = "Test 2",
            Input = 4,
            Expected = 16
        },
        new TestCase()
        {
            Name = "Test 3",
            Input = 10,
            Expected = 100
        }
    };
}

Тепер давайте використовувати його за допомогою методу тестування і побачити, що станеться:

[TestCaseSource(nameof(TestSource))]
public void MethodXTest(TestCase testCase)
{
    var x = Power(testCase.Input);
    x.ShouldBe(testCase.Expected);
}

Це не буде перевірено в порядку, і результат буде таким:

введіть тут опис зображення

Тож якщо ми додали override string ToStringдо нашого класу на кшталт:

public class TestCase
{
    public string Name { get; set; }
    public int Input { get; set; }
    public int Expected { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

Результат зміниться, і ми отримаємо порядок та назву тесту на зразок:

введіть тут опис зображення

Примітка:

  1. Це лише приклад, щоб проілюструвати те, як отримати ім’я та порядок у тесті, порядок приймається чисельно / в алфавітному порядку, тому якщо у вас є більше десяти тестів, я пропоную зробити тест 01, тест 02 .... тест 10, тест 11 тощо, тому що якщо ви робите тест 1 і в якийсь момент тест 10, ніж наказ буде тест 1, тест 10, тест 2 .. і т.д.
  2. Вхідні дані та очікувані можуть бути будь-якого типу, рядка, об’єкта чи спеціального класу.
  3. Крім порядку, тут добре, що ви бачите ім'я тесту, яке важливіше.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.