Негативний досвід TDD [закрито]


94

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

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

Будемо вдячні за посилання на статті, що описують негативні сторони TDD (Google наповнений позитивними та часто фанатичними статтями).


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

20
Чи є у вас проблеми з пошуку негативу в Інтернеті ?!
Ерік Вілсон

4
@Job (і, можливо, інші): не забудьте, що він запитав про TDD, а не про тестування одиниць. TDD! = Одиничне тестування.
n1ckp

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

2
Коли я виявляю, що витрачаю достатньо часу на помилки, то, здається, я можу витрачати менше часу на написання тестів на кожну окрему річ, яку я пишу перед тим, як писати її, я не прийму тест-спочатку-все-речі-TDD. Я замість того від сорому повішу голову і почну шукати нову кар’єру. Не про помилок, про які говорите? Дизайн? Так. Це воно. Саме так. І ви не навчилися проклятої речі про надійний дизайн, надавши собі безпечну сітку та ліцензію на продовження дурної роботи. Відкладіть IDE і спробуйте прочитати свій код, якщо ви хочете виявити справжню проблему.
Ерік Reppen

Відповіді:


94

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

Визначення TDD не врізане в камінь: хлопці, як Кент Бек, вимагають, щоб тест, який не складається, повинен бути написаний перед одним рядком коду, і кожен рядок коду повинен бути записаний, щоб пройти невдалий тест. Передня конструкція мінімальна, і все рухаєтьсятестами. Це просто не працює. Я бачив великий корпоративний додаток, розроблений за цією методологією, і я сподіваюся, що це гірший код, який я бачу в своїй кар'єрі (він не за горами; і це було незважаючи на те, що над ним працюють талановиті розробники). З того, що я бачив, це призводить до величезної кількості погано продуманих тестів, які в основному підтверджують, що виникають виклики функцій, що винятки кидаються, коли змінні є нульовими, і глузуючий фреймворк отримує ретельне тренування (whoop-de-whoop); ваш виробничий код сильно поєднується з цими тестами, і мрія про постійне і легке рефакторинг не з'являється - адже люди навіть рідше виправляють поганий код через тест, який він порушить.

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


7
+1 "проектування тестів на високому рівні в рамках етапу планування - поряд з архітектурним дизайном" Звучить і для мене набагато розумнішим.
Стівен Євріс

11
@Aaronaught Agile не означає ніякого планування, це означає просто своєчасне планування.
Адам Яскевич

25
@Adam Jaskiewicz: Я люблю річ "не планування заздалегідь". Скажімо, планування наперед визначається . Якщо ви не плануєте заздалегідь, але під час заходу ви взагалі не плануєте; ви імпровізуєте. ;-)
CesarGon

34
@Adam - "Чи дійсно люди перескакують прямо в кодування в перший день ітерації?" е-да. Ось "спритний" чоловік. На останньому місці, де я працював (і мене звільнили за те, що він не "Agile"), вони провели весь тримісячний цикл випуску, не будуючи ніколи планування єдиного рядка коду або створення однієї сторінки документації. І так, код був жахливим, і так, програмне забезпечення було повільним, незграбним та глючним. Того дня, коли я приєднався до мене, менеджер із гордістю сказав, що вони є "Найспритнішим магазином Лондона". Вони точно були.

7
Можна додати ще одну проблему: поки вона пройде тест, це добре. Не забувайте, що сам тест може бути помилковим і, таким чином, викликає помилкові негативи та / або помилкові позитиви. І, звичайно, вимагається "100% тестового покриття" і все, що має таке, за визначенням ідеальне, що призводить до марних тестів, які насправді нічого не перевіряють, але написані виключно для досягнення 100% охоплення, коду, який не є документальним, оскільки ваш лічильник покриття враховує коментарі як непокритий код і т. д.
jwenting

66

Це інтерв'ю Річака Хікі ( автор Clojure ) містить таке. Я відчуваю 100% співчуття:

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

Ще одна аналогічна заява Дональда Кнута в інтерв'ю Coders at Work , скопійована звідси :

Сейбель: Якщо говорити про практичну роботу, то в середині роботи над «Мистецтвом комп’ютерного програмування» ви взяли те, що перетворилося на десятирічну перерву, щоб написати свою систему набору тексту TeX. Я розумію, ви написали першу версію TeX повністю від комп'ютера.

Кнут: Коли я писав TeX спочатку в 1977 та 78 роках, я, звичайно, не мав грамотного програмування, але у мене було структуроване програмування. Я написав це у великий зошит з довгих рук, олівцем. Через півроку, переживши весь проект, я почав друкувати в комп’ютер. І здійснив налагодження в березні '78 року, поки я почав писати програму в жовтні 77 року. Код, який знаходиться в архівах Стенфорда - це все олівцем - і, звичайно, я б повернувся і змінив підпрограму, коли дізнався, що це має бути. Це була система першого покоління, тому було можливо багато різних архітектур, і їх потрібно було відкинути, поки я деякий час не жив з нею і не знав, що там є. І це була проблема з куркою-яйцем - ви не могли ввести шрифти, поки не мали шрифтів, але тоді не могли мати шрифти, доки не зможете набрати шрифти. Але структуроване програмування дало мені уявлення про інваріанти та знання того, як зробити чорні скриньки, які я міг би зрозуміти. Тому я мав впевненість, що код спрацює, коли я нарешті його налагоджую. Я відчував, що заощаджую багато часу, якби зачекав півроку, перш ніж щось тестувати. Я мав достатньо впевненості, що код був приблизно правильним.

Сейбель: А економія часу була б тому, що ви б не витрачали час на будівництво будівельних лісів та заглушок для перевірки неповного коду?

Кнут: Правильно.


24
Я думаю, ви повинні подивитися на тип роботи, яку ви виконуєте. Кнут і Хікі говорять про розробку нових (інноваційних) додатків. Якщо ви подивитесь, де TDD популярний (широка перегенералізація), то ви зрозумієте, що більшість програм, написаних TDD-манером, вже мають добре відому архітектуру.
sebastiangeiger

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

3
Бачачи, що ОП вимагає негативного досвіду з TDD, жоден із ваших прикладів не здається відповідним цьому питанню, оскільки жоден із них не показує приклад дії TDD.
Вінстон Еверт

5
@Michael Borgwardt: Додати тести до існуючого, гарного дизайну порівняно просто, щоб позбутися від помилок у впровадженні. Але позбутися поганого дизайну часто означає повне переписування. Отже, головна мета повинна полягати в тому, щоб отримати дизайн правильно; Виконання буде простіше виправити згодом.
Joonas Pulakka

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

58

Мій негативний досвід роботи з TDD був моїм першим. TDD мені звучало чудово, я робив QA роками і все ще мав жахливі свідомості. Мені хотілося розчавити кожну помилку, перш ніж вона перетворилася на збірку. На жаль, використання TDD не гарантує написання хороших тестів. Насправді, моя первісна схильність полягала в тому, щоб писати прості тести, які створювали простий код. Дійсно простий код, який містив кілька абстракцій. Дійсно прості тести, які були переплетені з внутрішніми класами. І як тільки у вас є кілька тисяч тет-биттових тестів, ви впевнені, що не відчуваєте, що рухаєтесь швидше, коли вам доведеться змінити сто з них, щоб змінити код коду, щоб використовувати дуже важливу концепцію домену X.

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

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

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


7
Ви прибили це в пункті 2.
Шелдон Варкентін

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

@jwenting - І цей анекдот досить добре підтримує аргумент Реї. Я виявив, що аспект захисту від регресії TDD є перекритим на практиці, навіть якщо в теорії це є надійною ідеєю. Випробування повинні підтримуватися на тому самому рівні, що і виробничий код, щоб він працював, і трохи неприродно ставитися до невиробничого коду таким чином - я бачу ту саму «кодову гниль» з апаратними тренажерами, генераторами коду, і т. д. весь час.
Стів Джексон

"По-справжньому прості тести, які були переплетені з внутрішніми класами" <- тут є ваша проблема. Тестуйте лише публічні інтерфейси. TDD! = UT
Стівен А. Лоу

2
@ StevenA.Lowe - Я знаю, що зараз, але 9 років тому це було не так зрозуміло :) "TDD - це не тестова майстерність"
Стів Джексон

41

Я збираюся тут вийти на кінцівку і з жорстокою чесністю заявити, що це буквально ритуальна трата часу. (У більшості ситуацій.)

Я купив книгу про Unit Testing, в якій також обговорювалося TDD, і, хоча я згоден з перевагами UT, через сто годин випробування TDD я відмовився від неї з безлічі причин. Я тут щось перехресне повідомлення , але TDD:

  1. Не краща документація, ніж реальна документація.
  2. Не вловлює помилок чи регресій .
  3. Це насправді не робить мої конструкції кращими, ніж вони в кінцевому підсумку, якщо я застосую якісь концепції функціонального програмування та компонування .
  4. Час, який можна краще витратити на перегляд коду чи полірування документації та технічних характеристик.
  5. Дає менеджерам помилкове почуття безпеки, коли вони бачать список із сотні зелених іконок.
  6. Підвищує продуктивність при впровадженні алгоритмів з обмеженими відображеннями вводу-виводу.
  7. Ви незграбні в тому, що ви можете знати, що ви робите в результаті TDD, але ви не заробляєте розуміння того, чому це працює так добре, чому ваші дизайни виходять так, як вони роблять.

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

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

У культурному відношенні TDD показує симптоми ритуальної практики. Він їде на вину; це заохочує процедуру щодо розуміння; у ньому є багато доктрин та гасел ("підробка", поки ти це зробиш "- це справді досить тривожно, якщо поглянути на це об'єктивно). Визначення у Вікіпедії слова "ритуал" насправді є досить підходящим:

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


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

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

8
@jwenting Люди роблять TDD, тому що вони не знають, що робить дизайн модульним, тому вони ніколи не можуть зняти свої 35 "навчальні колеса зі своїх 40" велосипедів. Створення модульної конструкції - це завжди кероване завдання, якщо ви розумієте поняття, тому що кожна дилема у вашому дизайні буде мати керований розмір через те, що вона, за своєю концепцією, перетворюється на модульну. Я не погоджуюся з тим, що TDD є ефективним у вимушенні модульності, але я не погоджуюся з тим, що потрібно змусити створювати модульні конструкції. Модульний дизайн - це ідеально піддається навчанню та навчанню навичкам.
Rei Miyasaka

@jwenting Що стосується корисності публічних інтерфейсів, то серед практиків TDD є дві школи думки з цього приводу, обидві з яких небажані: оприлюднити все, щоб його можна було перевірити, або залишити речі приватними, якщо їх все одно не потрібно перевіряти. . Перший змушує непотрібні деталі впровадження піддаватися кінцевим користувачам (які потенційно можуть бути нецільовим чином використані або використані), а останній змушує одиничні тести бути ближче до системних тестів. Звичайно, ви можете використовувати інструменти тестування одиниць для доступу приватних осіб, але це не має особливого сенсу робити в TDD.
Rei Miyasaka

1
@Kall У цьому інтерв'ю він каже, що "приблизно на 15 - 35% більше часу" - не лише 15%, як ви його цитували. Дослідження також включає лише Java / C ++ / C # (ймовірно, C # 2, вказану дату) - усі мови тієї ж імперативної парадигми OOP. Я, звичайно, більше ніж 15% і, мабуть, понад 35% продуктивніший у функціональній мові (і навіть на C # 3), і я створюю набагато менше помилок, пишучи код без громадянства, компонований код - ті самі види помилок, які тестують меліорати, тому що обидві речі вирішують абсолютно однакові проблеми. Іншими словами, звичайно, 60-90% зменшення помилок, але порівняно з чим ?
Рей Міясака

18

Додамо, ще одне занепокоєння щодо TDD, яке я помітив:

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

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


2
Звучить як пекло PHB! Мені це нагадує компанії, які впроваджують бонусні схеми, - звичайно, що розробники замість того, щоб концентруватись на коді якості, зосереджуються на задоволенні будь-яких вимог щодо бонусу. Ви неминуче отримуєте код crappier. (Тут також є аналогія з поточною банківською кризою :-))
TrojanName

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

Покриття коду стосується тестування модулів, а не TDD. TDD піклується лише про функції та тести через загальнодоступні інтерфейси.
Стівен А. Лоу

14

Мій основний негативний досвід - це намагатися використовувати TDD для редагування коду іншого програміста, у якого немає тестів, або дуже-дуже базових інтеграційних тестів. Коли я йду, щоб додати функцію або виправити проблему із вказаним кодом; Я вважаю за краще спочатку написати тест (спосіб TDD). На жаль, код щільно поєднаний, і я не можу нічого протестувати без багато рефакторингу.

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

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

У будь-якому випадку, TDD - це орієнтир. Дотримуйтесь його до того моменту, коли ви знайдете максимальну ефективність. Достойне покриття тесту та роз'єднаний код, добре написаний код.


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

7
Це не негативний досвід роботи з TDD, це негативний досвід роботи з хижим кодом.
Rei Miyasaka

13

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

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

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


2
Можливо, ви повинні написати кілька тестів для своїх тестів! : p ...... I Kid, I Kid
Арен

+1 +1 +1 +1 (якщо у мене були 3 фіктивних рахунки). Вирок №2 є дуже проникливим і не має упередженості підтвердження TDD, що є занадто поширеним.
tgm1024

11

Як великий шанувальник TDD, я іноді бачу ці недоліки

  • Спокуса написати занадто багато тесту заради майже 100% покриття коду. На мою думку, не варто писати тести
    • для простих власників нерухомості / власників
    • для кожного випадку, коли кидається виняток
    • що перевіряє однакові функціональні можливості через різні шари. (Приклад: якщо у вас є тест одиниць, щоб перевірити перевірку вхідності для кожного параметра, то повторювати всі ці тести через тест інтеграції також не потрібно)
  • Витрати на технічне обслуговування тестового коду для аналогічних тестів, які незначно змінюються (створюються за рахунок дублювання коду (він же копіювати-вставляти-успадкування)). Якщо у вас вже є такий, легко створити подібний. Але якщо ви не перефактуруєте тестовий код, усунувши дублювання коду в допоміжні методи, можливо, вам знадобиться певний час, щоб виправити тести, якщо деталі щодо впровадження бізнес-коду зміниться.

  • Якщо ви перебуваєте під тиском часу, у вас може виникнути спроба усунути зламані тести (або прокоментувати їх), а не виправляти їх. Таким чином ви втрачаєте інвестиції в тести


2
+1: "Спокуса написати занадто багато тесту заради майже 100% кодового покриття.": Я потрапив у цю пастку один раз, і витративши стільки годин на написання всіх тих тестових одиниць, єдині три помилки, які я знайшов у своєму коді, були не охоплені одиничними тестами, і їх можна легко знайти шляхом налагодження коду крок за кроком.
Джорджіо

9

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

Можливо, що-небудь колись змінить мою думку, але серед практик XP ідея безжалісного рефакторингу та коду, що розвивається у власній формі, є набагато важливішою і призводить до найбільшої продуктивності для мене, пор. цитата з статті Джеймса Ньюкірка :

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

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


9
Проблема полягає в тому, що без тестових одиниць, як ви знаєте, що ваш нещадний рефакторинг призводить до коду, який робить те саме? На моєму досвіді я виявив, що в залежності від проблеми на написання тестів + ​​код може знадобитися менше часу, ніж на написання коду самостійно! Причина, головним чином, зводиться до того, що для деяких проблем я можу спробувати повторний фактор і автоматично повторно протестувати набагато швидше, ніж я міг би перевірити його вручну, що може значно збільшити швидкість ітерацій.
Марк Бут

6
Для ігор дуже часто можна побачити результати. Якщо їх можна побачити і здатись досить хорошими, вони будуть прийняті, оскільки гра в будь-якому випадку має бути суб'єктивним досвідом. З іншого боку, приймаючи напр. Як приклад Diablo 2, кількість помилок у бойових формулах показала, де TDD принесла б величезну цінність і врятувала їм величезну кількість роботи над виправленнями. Для дуже чітко визначених проблем, таких як розв’язування рівнянь, і там, де їх не можна судити за візуальними результатами під час виконання, TDD є обов'язковим для забезпечення коректності. Але це невелика частка коду в більшості ігор.
Інженер

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

3
На моєму досвіді одиничні тести значно спрощують рефакторинг .
Том Керр

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

7

Мій негативний досвід TDD, як і раніше обмежений, просто знає, з чого почати! Наприклад, я спробую зробити що - то TDD і або не має ні найменшого уявлення , з чого почати забороняючи тестування тривіальних речей (можу я нова вгору Fooоб'єкт, я можу передати в Quuxдо Bazі тому подібному. Тестів , які нічого не перевіряють ), або якщо я намагаюся реалізувати його у вже наявному проекті, я вважаю, що мені доведеться переписати різні класи, щоб мати можливість їх використовувати в TDD. Кінцевий результат полягає в тому, що я швидко повністю відмовляюся від цього поняття.

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


1
Це де глузливі рамки бувають. Інстанціювати Fooз Mock об'єктів , а не Quuxта Bazбезпосередньо, то ви можете викликати функцію ви хочете перевірити , а потім перевірити , що знущається були викликані з функціями , які ви очікуєте. Об'єкти макету - це вмикаюча технологія, яка допомагає роз’єднати одиниці та зробити їх одиницями тестовими. Ось чому одинаки є злими, оскільки ви часто не можете просто знущатися над ними. * 8 ')
Марк Бут

7

ТДД ревнощі.

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

ІМО, найбільша їхня брехня полягає в тому, що TDD приведе вас до порятунку кращою розробкою алгоритму. Дивіться знаменитий солюку Solver, написаний в TDD: тут , тут , тут , тут і тут

І порівняйте це вирішувач судоку Peter Norvig, зроблений не за допомогою TDD, а за допомогою старомодної інженерії: http://norvig.com/sudoku.html


Подивіться, ми могли б сперечатися і про це. Але у мене занадто багато роботи, оскільки я закінчив університет Fullsail, отримавши ступінь ігрового дизайну. Виходячи з моїх курсів і моєї дуже вимогливої ​​роботи, я можу сказати, що TDD справді перемагає шалену лінійку за лінією (відсутність дизайну) розробки лінивих програмістів. Подивіться, я б цього не казав, але це правда: більшість розробників, які перейшли на звичайну програму університету CS, здебільшого не закінчили навчання; мало хто з них переважно не перейшов на розробку програмного забезпечення, і крім того, що багато хто з них ледве проходить , рядок за рядком. Fullsail university має
Zombies

повний курс лише в розробці тестових програм, і це дійсно привертає розробників до правильного шляху (на відміну від реалізації пов'язаного списку в c ++).
Zombies

Посилання порушені чувак!
lmiguelvargasf

Це через багато років, але @Zombies дивіться у "Підтвердження упередженості". Багато з того, що нас усіх навчають в КС в коледжі, потрапляє саме в цю категорію. Подивіться на
невдале

Чоловік-лол, якого я тролінгував ... Я писав, що так давно забув про ту маленьку дорогоцінну каменю.
Зомбі

5

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


1
Чи можете ви мати інше відчуття, ніж знати, що для заданого набору входів ваше програмне забезпечення повертає заданий набір результатів?

доки ви розумієте, що tdd - це процес розробки, а не золоте правило для вирішення будь-яких проблем, це нормально. Але більшість людей, які пропонують використовувати цей процес, забули, що це процес розробки, як і будь-який інший процес, мають яскраву і темну сторону. Для всіх вони говорять, що якщо ви будете використовувати tdd, у вас буде вільне програмне забезпечення, тому що ви використовуєте тест для покриття кожної функції. І зазвичай це неправильно. У кращому випадку буде тест для кожного випадку (або принаймні функції), але тести - це програми (у яких є помилки), і це лише тести чорного поля.
Дайній

4

TDD має деякі переваги:

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

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

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


3
Перевага 2 може бути досягнута простими тестовими одиницями без TDD підходу. Користь 1, якою ви повинні займатися. (Орієнтуючись на API) Ще неможливо створити хитрий API за допомогою TDD, але так, ви впевнені, що він буде працювати (для письмових тестів).
Стівен Євріс

2
Питання було не питання про переваги TDD. З цього питання вже багато.
Aaronaught

1
@aaronaught, я звертаюся до його больових точок.

Відповіді мають відповідати на питання .
Aaronaught

1
@aaronaught, тоді напишіть деякі з них.

3

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

Що мене дратує щодо TDD - це той факт, що щодо цього існує багато правил чи рекомендацій. Оскільки це все ще зовсім нове, ми більшість із нас відчуваємо себе початківцями в TDD. Тож те, що добре працює для деяких з нас, може не працювати для інших. Я хочу сказати, що немає справжнього «неправильного чи правильного» способу виконання TDD: Є спосіб, який працює для мене - і для моєї команди, якщо я маю.

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


+1 Відмінний коментар. Це насправді не повинно бути ні єдиним справжнім способом, ні зовсім.
непітонічний

3

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


1
Зазвичай друга спроба дасть вам більше розуміння проблеми, ніж перша спроба, TDD чи ні.
wobbily_col

3

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

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

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

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

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

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

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