Каталог одиниць тестування


203

антидіаграма : має бути принаймні два ключові елементи, щоб офіційно відрізнити фактичний антидіапазон від простої шкідливої ​​звички, поганої практики чи поганої ідеї:

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

Проголосуйте за антидіапазон TDD, якого ви бачили "в дикій природі" один раз занадто багато.
Повідомлення в блозі Джеймса Карра та пов'язаної з ним дискусії про тестування yahoogroup testdrivendendep

Якщо ви знайшли "безіменного", опублікуйте і їх. Один пост за анти-шаблон, будь ласка, щоб голоси підрахували щось.

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


Аароне, ти, здається, перебуваєш над усім цим :) Чи було б непогано додати теги-рядки чи слогани до коментарів, щоб ми могли менше прокручувати .. що говорити?
Гішу

1
Це виходить досить добре .. дякую, хлопці, дружини. Продовжуйте йти .. одне з найбільш інформативних повідомлень про ІМХО
Gishu

2
+1 люблю цю нитку !!! І більшість із них є такими правдивими і переважаючими!
Chii

Приємна тема, чому це вікі спільноти ???
Дивовижна

2
Тому що це свого роду опитування - ви б не хотіли збирати реп. Просто тому, що ви розмістили найпоширеніший тип анти-шаблону;)
Gishu

Відповіді:


70

Громадяни другого класу - тестовий код не так добре відтворений, як виробничий код, що містить багато дублюється коду, що ускладнює підтримку тестів.


67

The Free Ride / Piggyback - Джеймс Карр, Тім Оттінгер
Замість того, щоб написати новий метод тестового випадку, щоб перевірити іншу / відмітну особливість / функціональність , нове твердження (та відповідні йому дії, тобто дії, дії з AAA) їде разом із існуючим тестом .


15
Так, це мій улюблений. Я роблю це постійно. Ой ... почекай ... ти сказав, що це було погано . :-)
путівка

1
Я не дуже впевнений, що це анти-модель. Усі інваріанти повинні бути trueпісля кожного можливого виклику мутаторів. Отже, ви хочете перевірити, чи є кожен інваріант trueпісля кожної комбінації мутаторів та вхідних даних, які ви тестуєте. Але ви хочете зменшити дублювання та забезпечити перевірку всіх інваріантів, у тому числі тих, які наразі не викликають збоїв тесту. Отже, ви покладете їх на функцію checkInvariants()перевірки і використовуєте це у кожному тесті. Код змінюється і додається інший інваріант. Ви, звичайно, і цю функцію. Але це фрірайдер.
Raedwald

2
@Raedwald - З часом назва тесту більше не відповідає всім тестам. Крім того, у вас є щось молотіння через переплетення тестів; збій не вказує точної причини відмови. наприклад, канонічний приклад цього тесту буде читати щось на кшталт непрозорого суперсета всіх етапів "Упорядкувати" >> Акт >> Активувати А >> Активувати більше >> Акт В >> Діяти ще більше >> Акт Ст. Тепер ідеально, якщо А і С зламано, ви повинні побачити 2 проби тесту. З вищевказаним тестом ви побачите лише один, потім виправите A, і при наступному запуску він скаже вам, що тепер C зламаний. тепер уявіть 5-6 різних тестів, зрощених разом ..
Gishu

1
"ім'я тесту більше не відповідає всім тестам, які він перевіряє" Тільки якщо тест призначений для умови публікації, яка була спочатку присутня. Якщо ви назвали комбінацію методу-імені, стану налаштування та вхідних даних (аргументів методу), проблем не виникає.
Raedwald

"невдача не вказує точну причину відмови" жодна заява про помилку ніколи не вказує на причину відмови. Це вимагає деякого заглиблення в деталі реалізації: налагодження збою регресії, ваші знання про стан розробки для деяких робіт TDD.
Raedwald

64

Щасливий шлях

Тест залишається на щасливих шляхах (тобто очікуваних результатах) без тестування меж та винятків.

JUnit Antipatterns


Причина: або перебільшені часові обмеження, або кричуча лінь. Ремонтне рішення: Знайдіть трохи часу, щоб написати більше тестів, щоб позбутися помилкових позитивних результатів. Остання причина потребує батога. :)
Spoike

59

Місцевий герой

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

Прихована залежність

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


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


Це хороший приклад абревіатури розробника WOMPC. "Працює на моєму ПК!" (зазвичай говорять, щоб зняти тестерів зі спини.)
Joris Timmermans

58

Chain Gang

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

Ви часто бачите це в тестах баз даних. Замість того, щоб робити відкат teardown(), тести здійснюють свої зміни в базі даних. Інша поширена причина полягає в тому, що зміни в глобальному стані не загортаються в блоки "try / нарешті", які очищаються у разі невдачі тесту.


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

56

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

Джерело: Повідомлення Джеймса Карра.


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

@Spoike; Якщо ви маєте шарувату архітектуру, яка дійсно залежить від ролі класу; деякі шари, як правило, мають більшу залежність, ніж інші.
krosenvold

Нещодавно я побачив у поважному блозі створення установки макетної сутності, яку потрібно повернути з макетного сховища. WTF? Чому б просто не створити справжню сутність в першу чергу. Сам мене якраз спалив знущався інтерфейс, де моя реалізація кидала NotImplementedExceptions навколо.
Томас Ейд

40

Мовчазний Ловець - Келлі?
Тест, який проходить, якщо буде викинуто виняток.
Дивіться також: Таємний видовище

[Test]
[ExpectedException(typeof(Exception))]
public void ItShouldThrowDivideByZeroException()
{
   // some code that throws another exception yet passes the test
}

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

34

Інспектор
Тестовий блок, який порушує інкапсуляцію, прагнучи досягти 100% покриття коду, але знає стільки про те, що відбувається в об'єкті, що будь-яка спроба рефактора перерве існуючий тест і вимагає, щоб будь-які зміни були відображені в апараті. тест.


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


2
Причина: Абсурдна залежність від тестування у білій коробці. Існують інструменти для генерації таких тестів, як Pex в .NET. Реконструйоване рішення: замість цього тестуйте на поведінку, і якщо вам дійсно потрібно перевірити граничні значення, тоді дозвольте автоматизованим інструментам генерувати решту.
Спіке

1
Перед тим, як Moq прийшов навколо, мені довелося відмовитися від глузливих рамок на користь написання макетів. Це було просто надто просто пов'язати мої тести з реальною реалізацією, зробивши будь-яке рефакторинг поруч неможливим. Я не можу сказати різниці, окрім Moq, я рідко роблю подібні помилки.
Thomas Eyde

34

Надмірне налаштування - Джеймс Карр
Тест, який потребує величезних налаштувань, щоб навіть почати тестування. Іноді кілька сотень рядків коду використовуються для підготовки середовища до одного тесту з декількома об'єктами, що може ускладнити дійсне визначення того, що тестується через "шум" усіх налаштувань, що відбуваються. (Src: посада Джеймса Карра )


Я розумію, що надмірне налаштування тесту зазвичай вказує на: а) погано структурований код або б) недостатнє глузування, правильно?
Тофер Хант

Ну і кожна ситуація могла бути різною. Це може бути пов’язано з високою муфтою. Але зазвичай це випадок надмірного уточнення, уточнення (знущання над очікуваннями) кожного співавтора у сценарії - це з’єднує тест на реалізацію та робить їх крихкими. Якщо виклик співпрацівнику є випадковою деталлю тесту, він не повинен бути в тесті. Це також допомагає зберегти тест коротким і читабельним.
Gishu

32

Анальний зонд

Тест, який повинен використовувати божевільні, незаконні чи інші нездорові способи для виконання своїх завдань, як-от: читання приватних полів за допомогою Java setAccessible (істина) або розширення класу для доступу до захищених полів / методів або необхідність помістити тест у певний пакет для доступу пакетні глобальні поля / методи.

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

Різниця між цим та Інспектором полягає в тому, що досліджуваний клас намагається приховати навіть те, що потрібно перевірити. Отже, ваша мета - не досягти 100% тестового покриття, а мати можливість протестувати що-небудь взагалі. Подумайте про клас, у якому є лише приватні поля, run()метод без аргументів і зовсім не отримує. Немає можливості перевірити це, не порушуючи правила.


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

Аарон Дігулла: Я згодна з цим. Можливо, цей запис дійсно краще підходить для вікі "JUnit HOWTO", а не антипатрітену. Коментарі?


Хіба це не те саме, що інспектор?
Gishu

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

2
npellow: Maven2 має для цього плагін, чи не так?
Аарон Дігулла

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

1
IDK, він повинен мати якийсь побічний ефект. Я перевірив побічний ефект. Не впевнений, що ви маєте на увазі під тестуванням API сторонньої сторони, я б заперечував, ви повинні зафіксувати, що у вашому власному коді, який ви можете перевірити, було використано правильно, а потім інтегруйте тест цього коду на сторонній API. Не перевіряє код стороннього коду.
Джошуа Щока

26

Тест без імені - Нік Пілот

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

Через два роки, коли цей тест не вдасться, вам може знадобитися спершу спробувати знайти BUG-123 у вашому трекері помилок, щоб з’ясувати наміри тесту.


7
Такий справжній. Tho, що трохи корисніше, ніж тест під назвою "TestMethod"
NikolaiDante

8
якщо тільки помилка не зміниться, і ви втратите старий трекер та його ідентифікатори випусків ... тож PROJECT-123 більше нічого не означає ....
Chii

25

Повільний ривок

Тест одиниці, який працює неймовірно повільно. Коли розробники починають це, вони встигають піти до ванної кімнати, закурити, або ще гірше, розпочати тест, перш ніж повернутися додому в кінці дня. (Src: посада Джеймса Карра )

також тести, які не запускаються так часто, як слід


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

Це очевидне питання, але які найзагальніші способи виправити це?
Тофер Хант

Це спочатку здається корисним, так?
Кев

1
@TopherHunt Зазвичай тести повільні, оскільки вони мають деяку дорогу залежність (наприклад, файлова система, база даних). Хитрість полягає в тому, щоб проаналізувати залежності, поки не побачите проблему, а потім підсуньте залежність вгору до стопки виклику. Я написав тематичне дослідження, де мої студенти взяли набір тестів від 77 секунд до 0,01 секунди, виправивши
Джошуа

20

Метелик

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

Кажан його крила може спричинити ураган на іншому боці світу. - Едвард Лоренц, Ефект Метелика


У чому полягає антидіаграма: Як виглядає такий тест? Чи є виправлення? Чи є яка-небудь сперечальна перевага тестування коду, щоб визначити залежність на зразок System.DateTime.Now, крім того, що простіші чи детерміновані одиничні тести?
Мерлін Морган-Грехем

1
Прикладом Java може бути виклик toString()об'єкта, який не перезаписує метод. Це дасть вам ідентифікатор об'єкта, який залежить від адреси пам'яті. Або toString()містить первинний ключ об'єкта, який змінюється щоразу, коли ви запускаєте тест. Існує три способи виправити це: 1. Змініть код, який ви тестуєте, 2. за допомогою regexp для видалення змінних частин результатів тестування або 3. використовуйте потужні інструменти для перезапису системних служб, щоб вони повернули передбачувані результати.
Аарон Дігулла

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

19

Тест на мерехтіння (Джерело: Роміллі Коккінг)

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

Можливо, супер набір антидіаграми " Чекай і дивись " та антитіла " Сплячий ".

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


@Stuart - обов’язково перегляньте відео з описом цього "Автомобіль зупинився - Спробуйте зараз!" videosift.com/video / ... Ця модель також можна було б назвати «Спробуйте прямо зараз!», або просто - «Тест Flakey»
npellow

1
Одного разу я написав тест на PRGN, який забезпечив правильний розподіл. Іноді вона може вийти з ладу випадково. Піди розберися. :-)
Кріс Вест

1
Хіба це не було б хорошим тестом? Якщо тест коли-небудь не вдасться, вам потрібно знайти джерело проблеми. Я бився з кимось про тест, який провалився між 9 і півночі. Він сказав, що це випадково / переривчасто. Врешті-решт було простежено помилку, яка займалася часовими поясами. Піди розберися.
Трентон

@Christian Vest Hansen: Ви не могли б це посіяти?
Ендрю Грімм

@trenton Це лише хороший тест, якщо розробники можуть потурбуватися простежити його, а не просто ігнорувати (що вони можуть уникнути, оскільки це проходить більшу частину часу).
Буде Шеппард

19

Зачекай і побачиш

Тест, який виконує деякий налаштований код, а потім йому потрібно «зачекати» певний проміжок часу, перш ніж він зможе «побачити», чи функціонує код тесту, як очікувалося. TestMethod, який використовує Thread.sleep () або еквівалент, це, звичайно, тест "Зачекай і побачи".

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

Такий тест також може бути локальним героєм, оскільки він ЗНАЄ при запуску на повільному вікні або перевантаженому сервері CI.

Антидіаграму Wait and See не слід плутати з Sleeper .


Хм .. ну я використовую щось подібне. як інакше я зможу протестувати багатопотоковий код?
Gishu

@Gishu, чи ти дійсно хочеш одночасно перевірити кілька потоків, що працюють? Я намагаюся просто перевірити тестування будь-якого методу run (). Простий спосіб зробити це - зателефонувавши run () - який заблокує замість start () тесту одиниці.
npellow

@Gishu використовуйте CountDownLatches, Semaphores, Умови тощо, щоб потоки повідомили один одному, коли вони можуть перейти на наступний рівень.
Кріс Вест

Приклад: madcoderspeak.blogspot.com/2008/11/… Кнопка заварки evt. Спостерігач проводить опитування з інтервалом і піднімає змінені події. У цьому випадку я додаю затримку, щоб нитки опитування отримали шанс запуститись до закінчення тесту.
Гішу

Я думаю, посилання на мультфільми порушено.
Ендрю Грімм

17

Неналежно спільне кріплення - Тім Оттінгер
Кілька тестових випадків у тестовій арматурі навіть не використовують або не потребують налаштування / зняття. Частково завдяки інерції розробника для створення нового тестового кріплення ... простіше просто додати ще один тестовий кейс до палі


1
Можливо також, що тестуваний клас намагається зробити занадто багато.
Майк другий

16

Гігант

Тест на одиницю, який, хоч і справді тестує досліджуваний об'єкт, може охопити тисячі рядків і містити безліч тестових випадків. Це може бути показником того, що тестувана система є об'єктом Бога (пост Джеймса Карра).

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


15

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

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

"Ви повинні розуміти, що бачити - це вірити, але також знати, що вірити - це бачити". - Деніс Уейтлі


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

Я не погоджуюсь. Тестувати GUI важко, але вони також є джерелом помилок. Не тестувати їх просто ледачий.
Рей

3
Суть у тому, що ви не повинні тестувати графічні інтерфейси, а скоріше, щоб ви не протестували лише через GUI. Ви можете виконати тестування без голови без графічного інтерфейсу. Тримайте графічний інтерфейс якомога тонкішим - використовуйте аромат MVP - ви можете піти, не перевіряючи його взагалі. Якщо ви виявите, що у вас весь час виникають помилки в тонкому шарі графічного інтерфейсу, прикрийте його тестами. Але більшу частину часу я не вважаю, що варто докладати зусиль. Помилки інтерфейсу графічного інтерфейсу, як правило, простіше виправити ...
Gishu

@Spoike: Керовані ручні тести не є поганими, а також не використовує jUnit (або будь-яку іншу рамку тестування блоку) для автоматичного тестування, що не є одиничними тестами. Ви просто не повинні розміщувати їх в одному проекті і не ставитися до них як до одиничних тестів (наприклад, працювати постійно або після кожної збірки).
Мерлін Морган-Грехем

1
@ MerlynMorgan-Graham Я згоден, і я не мав на увазі, що ти не повинен тестувати GUI. Переконання членів команди про те, що правильно поєднувати керовані ручні тести з автоматичними, мене тривожило. Пізніше я з’ясував, що це відмінний спосіб змусити всіх, хто не звик до TDD, припинити його використовувати. Я вважаю, що змішування функціональних тестів (які є мінливими) з одиничними тестами (які повинні бути стабільними) є поганим, якщо ви хочете прослідкувати процес TDD.
Спойк

14

Сонник, він же гора Везувій - Нік Плоу

Тест, якому призначено НЕПОЗНАЧЕНО в якийсь конкретний час і дату в майбутньому. Це часто виникає через неправильну перевірку меж під час тестування коду, який використовує об’єкт Дата або Календар. Іноді тест може бути невдалим, якщо він працює в дуже певний час доби, наприклад, опівночі.

"Сплячий" не слід плутати з антидіаграмою " Чекай і дивись ".

Цей код буде замінено задовго до 2000 року - Багато розробників у 1960 році


Я б швидше назвав це дрімаючим Вулканом :) .. але я знаю, про що ви говорите .. наприклад, дата, обрана як майбутня дата для тесту на час написання, стане теперішньою / минулою датою, коли ця дата проходить .. порушуючи тест. Чи можете ви опублікувати приклад .. просто щоб проілюструвати це.
Gishu

@Gishu - +1. Я думав так само, але не міг визначитися між ними. Я оновив заголовок, щоб зробити це трохи зрозуміліше;)
npellow

11

Мертве дерево

Тест, де було створено заглушку, але тест насправді не був написаний.

Я насправді це бачив у нашому виробничому коді:

class TD_SomeClass {
  public void testAdd() {
    assertEquals(1+1, 2);
  }
}

Я навіть не знаю, що з цим думати.


8
:) - також відомий як Back Compliance Backdoor.
Гішу

1
Нещодавно у нас був приклад цього тесту та тестування методу, який неодноразово ремонтувався. Після декількох ітерацій тест став закликом до тестування методу. А оскільки метод тепер повернувся до недійсності, тверджень не було заявлено. Отже, тест лише переконався, що метод не кидає винятку. Не важливо, чи насправді щось корисне чи правильно. Я знайшов це в огляді коду і запитав: "Отже ... що ми тут навіть тестуємо?"
Марво

11

сьогодні покусав цим:

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

У нашому випадку тест залишив файл, що лежав у режимі "temp", з дозволом від користувача, який вперше виконував тест. Коли інший користувач намагався протестувати на одній машині: boom. У коментарях на сайті Джеймса Карра Йоаким Олрогге назвав це "неохайним працівником", і це було частиною натхнення для "Щедрих залишків". Мені подобається, що його ім’я краще (менш образливе, більш знайоме).


Для уникнення вологих підлог можна використовувати правило тимчасової папки джуніту.
DaveFar

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

11

Зозуля - Френк Карвер
Одиничний тест, який знаходиться в тестовому випадку з кількома іншими, і користується тим самим (потенційно тривалим) процесом налаштування, що й інші тести в тестовому випадку, але потім відкидає частину або всі артефакти від налаштування. і створює своє.
Розширений симптом: Неналежно спільне кріплення


10

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

[Test]
public void ShouldNotThrow()
{
   DoSomethingThatShouldNotThrowAnException();
}

2
Насправді це може бути вагомим тестом, на мою думку - особливо як тест регресії.
Ілья Прейс

Вибачте, знову заплутався у "Мовчазному виловлювачі" ... одиничні тести повинні чітко заявляти про те, що тестується, а не говорити "це має працювати". (+1 tp щось краще, ніж нічого. esp, якщо ви перебуваєте в спадщині країна)
Gishu

1
У таких видах тестів я, принаймні, переймаю виняток і присвоюю його змінній. Тоді я стверджую, що не має сили.
Томас Ейд

4
Деякі рамки мають Assert.DoesNotThrow(SomeDelegateType act)твердження про стиль, яке може бути використано конкретно у таких випадках. Я вважаю це менш грубим, ніж тестовий випадок, який досягає успіху, коли конструктор повертає ненульове значення, але виходить з ладу, коли конструктор кидає. Конструктор ніколи не поверне нульове значення. (Примітка: застосовується лише до мов, де конструктор гарантовано повернеться без нуля)
Merlyn Morgan-Graham

10

Екологічний вандал

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

Ці тести будуть періодичними, і розробники дозволять говорити такі речі, як "просто запустіть її знову".

Я бачив одне рішення - випадковим чином вибрати номер порту для використання. Це зменшує можливість виникнення конфлікту, але явно не вирішує проблему. Тому, якщо можете, завжди знущайтесь над кодом, щоб він фактично не виділяв нерозмінний ресурс.


@gcrain .. тести повинні бути детермінованими. Кращим підходом до ІМО було б використання порту "добре відомого в команді" для тестування та очищення до і після тесту правильно, щоб він завжди був доступний ...
Gishu

1
@gishu - проблема не в тому, що немає методів setup () та teardown () для обробки цих портів. Проблема полягає, наприклад, у запуску сервера CI та декількох версіях тестового запуску одночасно, намагаючись використовувати ті самі, жорстко закодовані номери тесту, порти
gcrain

10

Тест Тьюрінга

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

Привіт дурний. - Найрозумніший комп'ютер у світі до нового учнівства (зі старовинного коміксу про Амігу).


10

Тест на сорок стоп

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


9

Doppelgänger

Для того, щоб щось перевірити, вам потрібно скопіювати частини тестового коду в новий клас з тим же ім'ям та пакетом, і ви повинні використовувати магію classpath або користувальницький завантажувач, щоб переконатися, що воно спочатку видно (щоб ваша копія була вибрана вгору).

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

Я дивився на його обличчя ... моє обличчя! Це було як дзеркало, але мою кров замерзла.


7

The Mother Hen - Frank Carver
Загальна установка, яка робить набагато більше, ніж потрібно для фактичних тестових випадків. Наприклад, створення всіляких складних структур даних, заповнених, мабуть, важливими та унікальними значеннями, коли тести стверджують лише про наявність чи відсутність чогось.
Розширений симптом: Неналежно спільне кріплення

Я не знаю, що це робить ... Я все одно додаю це, на всякий випадок. - Анонімний розробник


7

Тест Все це

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

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


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