Яке значення перевірки при невдалі тестові одиниці?


13

Хоча існують способи запобігти виконанню одиничних тестів, яка цінність перевірки при невдалому одиничному тесті?

Я буду використовувати простий приклад: Чутливість до справ. Поточний код залежить від регістру. Дійсний вхід до методу - "Cat", і він би повернув перерахунок Animal.Cat. Однак бажана функціональність методу не повинна враховувати регістри. Тож якби описаний метод був переданий "кіт", він, можливо, може повернути щось на зразок Animal.Null замість Animal.Cat, і тестовий пристрій не вдасться. Хоча проста зміна коду зробила б цю роботу, складнішою проблемою може знадобитися тиждень, але ідентифікація помилки з одиничним тестом може бути менш складним завданням.

Програма, яка зараз аналізується, має 4 роки коду, який "працює". Однак останні дискусії щодо одиничних тестів виявили недоліки в коді. Деякі просто потребують явної документації щодо впровадження (наприклад, залежно від регістру чи ні) або коду, який не виконує помилку, залежно від того, як вона зараз викликається. Але одиничні тести можуть бути створені, виконуючи конкретні сценарії, які спричинять побачення помилки та є коректними вхідними даними.

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

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

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


Це один із способів збільшити кількість тестових покриттів.
JeffO

Якщо ви вже доклали зусиль для написання одиничного тесту, то чому б вам довелося переписувати його, коли ви вирішили вирішити проблему? Тільки те, що він зареєстрований, не означає, що його потрібно запускати в наборі. (Ви можете створити категорію "Відомі проблеми" і розглядати ці тести як відставання / список TODO.)
Caleb

Відповіді:


17

Мені не подобається перевірених ламаних тестів, оскільки вони видають непотрібний шум. Після кожного тестування мені доведеться перевірити всі помилки (червоний). Це червоний колір, тому що з’явилася нова проблема, або тому, що є старе, що відкрито робити / виправити. Це не нормально, якщо є більше 20 одиниць тестів.

Натомість я використовую

  • [Ignore("Reason")]атрибут, який робить результат жовтим або
  • throw new NotImplementedException()що робить результат сірим

Примітка. Я використовую NUnit для .net. Я не впевнений, чи є "сіра" функція в інших тестових рамках.

Тому мені подобається таке значення результатів тестових одиниць.

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

Все, крім "червоного", можна зареєструвати.

Щоб відповісти на запитання: перевірити "червоний-невдалий-тестик" є більше шкоди, ніж значення, але перевірка "тестів-жовтого-проігнорованого" чи "--сірого-NotImplementedYet-тестів" може бути корисним як список-тодо.


Проблема, яку я бачу при такому підході, полягає в тому, що ігноровані тести, ймовірно, ніколи не будуть виправлені. Ви також можете просто видалити весь тестовий код. Яка буде різниця (я тут трохи зухвалий)
Ловіс

4
will probably never be fixedце політичне рішення, хочете ви витратити зусилля на автоматизовані тести чи ні. За допомогою "проігнорованих тестів" ви маєте шанс виправити їх. Викидання "проігнорованих тестів" означає "відмовитися від автоматизованих тестів до і до тих пір, поки їх більше не буде"
k3b

8

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

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


5
Але ніколи не слід перевіряти невдалий тест, оскільки сервер збирання не повинен будувати проект зі зламаним тестом.
CaffGeek

@Chad: Створення та тестування - це дві окремі частини одного автоматизованого кроку. Побудова гарантує, що все складається. Тест гарантує, що результат збірки є дійсним. Моє тлумачення питання не було: "чи слід перевірити код, який не компілюється?" Натомість це було, "чи повинен я перевірити тест, який я знаю, що не вдасться?"
unholysampler

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

@Chad: Правильно, я зовсім забув про CI-сервери. Це, безумовно, було б кращим питанням. Також варто уточнити, що ми маємо на увазі під "зламаними" тестами; це просто прості "погані" тести, чи тест не вдається, оскільки API якимось чином змінився?
Tieson T.

Питання повинно було бути зрозумілішим. Це має бути тест, який буде складено, але очікуваний результат не вдасться.

6

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

Коротше кажучи, невдалі одиничні тести дають команді список "TODO".

З цієї причини невдалі одиничні тести є набагато кращими, ніж взагалі відсутні одиничні тести. *
Відсутність одиничних тестів залишає команду розробників у темряві; Технічні характеристики повинні бути неодноразово підтверджені вручну .

[* За умови, що одиничні тести насправді перевіряють щось корисне.]


2
Є кращі способи збереження списку todo, наприклад, дошка, програма списку справ або система відстеження проблем. Набагато простіше користуватися тестовим набором, якщо ви очікуєте, що він завжди пройде повноцінно, і будь-який тест, який з’явиться, - це нова проблема, яку потрібно негайно виправити.
bdsl

6

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

Ось абзац з початку глави 13 „ Ефективна робота зі спадковим кодексом” :

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


3

Але зламані, які ідентифікують помилки в новому проекті, названому таким. Таким чином, ви можете побачити, що вони ПОТРІБНІ ... По мірі їх фіксації вони стануть зеленими та переходять у звичайний набір тестів.

ПРИМІТКА. Цей проект повинен був бути встановлений таким чином, щоб він не будувався на сервері збірки, якщо ваш сервер збирання не дозволяє перевіряти, що порушують збірку (якщо ви визначите, що зламана збірка є такою, в якій всі тести не проходять)


+1, хоча немає відповіді, чи потрібно перевіряти чи ні, є важливий аргумент: build server
k3b

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

2

Одиничні тести повинні перевіряти випадки помилок на додаток до випадків успіху функції. Функція повинна явно відхиляти неправильний вхід або повинна мати документацію для пояснення того, який вхід вважається дійсним.

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

Суть одиничного тестування не має 100% успіху, справа в пошуку та виправлення помилок у коді. Не робити тести - це простий спосіб досягти 100% успіху, але це не дуже вигідно проекту.


Вуа ... "Сенс тестування в одиниці - не мати 100% успіху", ти кажеш, їм не все потрібно здавати !?
CaffGeek

2
@Chad: Справа в тому, що краще провести тести, які, як ви знаєте, не вдасться, але демонструєте справжню проблему, а не тесту, щоб мати зелену галочку в кінці нічного складання / тесту.
unholysampler

8
@unholysampler, ніколи не мають зламаних тестів, якщо вони НЕ ЧИСЛО позначені як "слід" перервати (будучи в іншому проекті). Інакше вони стають шумом, і ви не знаєте, коли тест, який повинен був пройти, був порушений. Це повністю перемагає мету постійної інтеграції та наявність UnitTests
CaffGeek

2
@Chad: Я думаю, це переходить у семантику визначень. На основі ОП це звучало так, ніби він говорив про створення дійсного тесту, який здійснює помилку. Однак помилка має низький пріоритет і, швидше за все, її не вдасться виправити негайно. Ви є тим, хто виховував постійну інтеграцію, яка ставить набагато суворіші обмеження на автоматизований процес.
unholysampler

4
@unholysampler, CI або немає CI, справа в тому, що коли ви запускаєте тести і звикли бачити деякі червоні вогні, ви звикаєте до цього. Отже, коли щось, що було зеленим, червоніє ... як ти знаєш?!? Це жахлива практика, і одна з причин тестування не може бути прийнята у багатьох організаціях.
CaffGeek

1

Подайте помилку за кожну помилку та зауважте, що в результаті тесту. Тоді, якщо ви коли-небудь зіберетеся і виправите помилку, ваш тест пройде, і ви видалите це з результату тесту. Ніколи не ігноруйте проблеми.


-3

Як я бачу TDD, виконаний із впровадженням тестів для незакінченого коду, спочатку записуйте тести з атрибутом [ExpectedException] або подібним. Це повинно пройти спочатку, оскільки неповний код не матиме в ньому логіки і написати в нього новий код Exception (). Незважаючи на те, що виняток через неправильне, це може принести тести спочатку проходження та придатність для перевірки. Ми можемо забути ігнорований тест, але, безумовно, може привести в порядок або заповнити неповний код. Коли ми це зробимо, автоматично відповідний тест, який очікував витримки, зараз почне виходити з ладу і тривожить вас виправити це. Це може включати незначну зміну тесту, щоб позбутися ExpectException, а натомість робити реальні твердження. CI, Dev, тестери та клієнти всі щасливі та безпрограшна ситуація?


1
Це не відповідає на питання. Не задається питанням, що таке TDD і чому перевірити на очікувані винятки.
Енді Візендангер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.