Недоліки тестової розробки? [зачинено]


192

Що я втрачаю, приймаючи тестовий дизайн?

Список лише негативів; не перераховуйте пільги, написані у негативній формі.


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

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

1
У заголовку згадується "Тест-керований розвиток", але в тілі питання згадується "Тест-керований дизайн". Про кого з двох це питання? Існують важливі, але тонкі відмінності між ними. Тестова конструкція полягає в тому, щоб тести керували дизайном програмного забезпечення. Тестова розробка зазвичай пов'язана з написанням тестів перед виробничим кодом (але не обов'язково дозволяти тестам впливати на дизайн).
Джим Хурн

3
TDD - клітка, яка затримує творчість розробника.
Льюїс

13
будь ласка, перестаньте закривати важливі питання, djesus
Каспер Леон Нільсен

Відповіді:


129

Кілька недоліків (і я не стверджую, що переваг немає - особливо при написанні фундаменту проекту - це заощадить багато часу в кінці):

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

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

12
Щоправда, але хіба це не було б без TDD? Без цього вам доведеться провести більше ручного тестування, яке зазнало б тієї ж проблеми.
sleske

50
Хіба "великі інвестиції в час" не допоможуть вам заощадити час згодом на розробці вашого рішення? Особливо зі складним? Я думаю, це має заощадити ваш час. Не думати про фазу технічного обслуговування, коли невеликі зміни можуть легко зламати систему. ( або, можливо, я просто наївний щодо тестування регресії та регресії для запобігання майбутніх помилок )
Роберт Коритник

6
Серхіо / Роберт, я дуже за те, щоб провести одиничне тестування для загальних систем і, безумовно, для компонентів, що є самою базою для систем. Сказавши це, я додам, що потрібно розмежовувати ці випадки і над спрощенням реального життя, намагаючись стверджувати, що до кожної системи можна ставитися так. Не всі системи можна узагальнити та спростити для тестування одиниць, і якщо ви спробуєте примусити характер тестування одиниць на таких системах, ви можете легко витратити набагато більше часу на виправлення одиничних тестів, ніж насправді на тестування реальних результатів.
Аді

3
@Adi: Я думаю, що ти помилився. На мою думку, кожну систему можна перевірити таким чином, це лише питання самодисципліни.
BlueLettuce16

189

Якщо ви хочете зробити "справжній" TDD (прочитайте: спершу тестуйте з червоними, зеленими, рефакторними кроками), тоді ви також повинні почати використовувати макети / заглушки, коли ви хочете перевірити точки інтеграції.

Коли ви почнете використовувати макети, через деякий час вам захочеться почати використовувати залежність впорскування (DI) та контейнер інверсії управління (IoC). Для цього вам потрібно використовувати інтерфейси для всього (що має багато підводних каменів).

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

І пам’ятайте, що тестовий код також слід підтримувати та доглядати. Тести повинні бути начитаними, як і все інше, і потрібен час, щоб написати хороший код.

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

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

Усі ці тести набагато важче "змінити" (навпаки рефакторингу) поведінку вашої системи, а прості зміни просто стають занадто важкими та трудомісткими.

Якщо ви читаєте літературу TDD, завжди є дуже хороші приклади, але часто в додатках у реальному житті ви повинні мати інтерфейс користувача та базу даних. Тут TDD стає дуже важким, і більшість джерел не дають хороших відповідей. І якщо вони це роблять, це завжди передбачає більше абстракцій: знущаються над об'єктами, програмуванням на інтерфейс, шаблонами MVC / MVP тощо, що знову вимагає багато знань, і ... вам доведеться написати ще більше коду.

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


7
Використовуючи такі інструменти, як Pex & Moles, ви можете легко уникнути написання інтерфейсів для кожної дрібної чортової речі. Кроти допоможуть вам у цьому надзвичайно.
Роберт Коритник

24
Схоже, критика тестування одиниць та об'єктно-орієнтованого програмування, а не TDD
plmaheu

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

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

голосувати за Мудрість
субота

66

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

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


3
Напевно це може бути проблемою, однак я вважаю, що я бачу помітну різницю в тому, наскільки мене це впливає. Я думаю, все зводиться до "написання тестового коду".
Роб Купер

2
Скотт, прикладом, який я зазвичай даю, є SqlDataSource, вбудований у сторінку ASPX. Ви не можете автоматизувати тест для цього. Це просто і виконує роботу, лише 1 файл. Тестова складова є об'єктом SqlDataSource MSFT, і це вже зроблено для нас. Не потрібно нам більше робити.
Eric Z Beard

8
+1 "Ви можете почати приймати дизайнерські рішення, що базуються більше на TDD, ніж на дійсно хороших дизайнерських принцесах" - найбільший підводний камінь TDD IMHO.
András Szepesházi

2
@ScottSaad Проблема ІМО полягає в тому, що спочатку слід накреслити дизайн, а потім його затвердити шляхом написання тестів та виправити за потреби. Я бачив численні випадки, коли люди ставили під загрозу хороший дизайн лише для того, щоб можна було написати тест. Як результат - більша частина системи була охоплена тестами, але дизайн був справді некрасивим. Я думаю , що це відбувається тому , що TDD проштовхується до мас , як дуже проста методологія з наступним помилкою : if part of the system is covered by tests and they pass, then everything is fine (including design).
Юрій Наконечний

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

54

Я думаю, що найбільшою проблемою для мене є ВЕЛИЧЕЗНА Втрата часу, який потрібен "на те, щоб потрапити". Я все ще дуже на початку своєї подорожі з TDD (Дивіться мій блог для оновлень моїх тестувальних пригод, якщо вас цікавить), і я буквально витратив години на початок роботи.

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

ТБХ, я з повагою не погоджуюся з коментарями Джейсона Коена щодо оприлюднення приватних методів, це не про що йдеться. У новому способі роботи я більше не публікував публічних методів, ніж раніше . Однак це включає в себе архітектурні зміни і дозволяє вам "гарячу модуль" модулів коду, щоб полегшити тестування всього іншого. Ви не повинні робити внутрішні дані свого коду більш доступними для цього. Інакше ми повертаємося до квадратного, коли все публічне, де інкапсуляція в цьому?

Отже, (IMO) у двох словах:

  • Кількість часу, необхідного для роздумів (тобто власне тестування grok'ing ).
  • Нові знання, необхідні для вміння писати тестовий код.
  • Розуміння архітектурних змін, необхідних для перевірки коду.
  • Підвищення своєї майстерності "TDD-Coder", намагаючись удосконалити всі інші навички, необхідні для нашого славного ремесла програмування :)
  • Організація бази коду для включення тестового коду, не накручуючи виробничий код.

PS: Якщо ви хочете посилань на позитиви, я попросив і відповів на декілька питань, перегляньте мій профіль .


1
На жаль, першу розумну відповідь, яку я побачив ...
Даніель К. Собрал

5
Досить практична і проста відповідь - +1 для частини "Налаштування розуму"
ha9u63ar

50

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

Продаж його в управління

TDD найкраще робити парами. Для одного важко протистояти прагненню просто написати реалізацію, коли ви ЗНАЄМО, як написати оператор if / else . Але пара буде тримати вас у завданні, тому що ви тримаєте його перед завданням. На жаль, багато компаній / менеджерів не вважають, що це вдале використання ресурсів. Навіщо платити двом людям, щоб написати одну функцію, коли у мене є дві функції, які потрібно зробити одночасно?

Продаж його іншим розробникам

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

Підтримка тестового коду разом із виробничим кодом

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

Написання тестів, щоб ви покривали все (100% покриття коду)

В ідеалі, знову ж таки, якщо ви дотримуєтесь методології, ваш код буде перевірений на 100% за замовчуванням. Як правило, подумав, я закінчую покриття коду вгору на 90%. Зазвичай це відбувається, коли у мене є якась архітектура стилю шаблону, і база перевірена, і я намагаюся вирізати кути, а не перевіряти налаштування шаблону. Крім того, я виявив, що коли я стикаюся з новим бар'єром, якого раніше не стикався, у мене є крива навчання при його тестуванні. Я визнаю, що писав кілька рядків коду старим способом, але мені дуже подобається, що це 100%. (Я здогадуюсь, що я був надто успішним у школі, ер skool).

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

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

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


7
Чим решта речення закінчувалась "(тест на кашель VS), то основний"?
Ендрю Грімм

+1 для проблеми з продажем. :) Я зараз в новій компанії і думаю, як створити культуру, яка дозволила б навичкам вільно поширюватися.
Еско Луонтола

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

24

У вашому першому проекті TDD є дві великі втрати, час та особиста свобода

Ви втрачаєте час, тому що:

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

Ви втрачаєте особисту свободу через:

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

Сподіваюся, це допомагає


1
Я не знаю, чи це тому, що я найгірший чи найкращий .. але TDD розтирає мене неправильно. Це тому, що воно занадто рано змушує мене в режимі подвійного обслуговування. Кожен раз, коли я змінюю дизайн класу, тепер мені також доводиться змінювати тестові приклади. Я очікую і приймаю це від зрілого класу, але не від класу, про який я щойно писав минулого тижня! Також можу сказати, що DI та TDD не підтримуються такими мовами, як Java та C #. Комусь справді потрібно створити нову мову, щоб вартість TDD та DI була буквально нульовою . Тоді ми більше не матимемо цієї розмови.
Джон Генкель

14

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

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

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


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

4
Я згоден з вакуумом. Оригінальні навчальні посібники TDD, де ви будете писати тест без будь-якого коду - і отримаєте помилку компіляції - божевільний.
mparaz

Неправильне припущення, що ви можете написати тести один раз і не змінювати їх. Вони є кодом, і кожен код вимагає можливого рефакторингу після змін. Тести не є винятком. Тести на рефакторинг є обов'язковим, якщо ви хочете зберегти їх доступними.
Роман Коновал

12

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

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


9

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

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


13
Ага - але ось тут приходить TDTDD. Розробка тестового керованого тесту.
Snowcrash

3
Я все ще час від часу виявляю помилки в своїх тестових тестах. Тому зараз я практикую TDTDTDD.
HorseloverFat

@SnowCrash +1 Я роздивлявся Google, щоб дізнатися, скільки часу люди проводять на тестування, і тоді я побачив цю відповідь. Я офіційно знайшов це, тому що мені було цікаво про TDTDTDD.
Відновлення балів BalinKingOfMoria

1
Я вважаю, що майбутнє (TD) <sup> ∞ </sup> TDD. Я маю досі один файл: він містить літеру "х".
мійський гризун

Я згоден з @Tim. Переконати членів його прийняти - це найважча частина.
Олу Сміт

7

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

На цій замітці, якщо ваша перевірка санітарної перевірки знайде те, що не перевірено, обов'язково поверніться та напишіть тест на це.


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

7

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

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

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


1
Прекрасно кажучи. Я не міг більше погодитися. Для мене тести, безумовно, не допомагають описати визначення проблем вищого рівня в реальному світі. Хороша документація ще раз підтвердила свою цінність. Як техн. галузеві віки, перевірені часом уявлення слід відмовлятись із все більшою обережністю. Самодокументування коду - це смішне поняття. Я вірю в розробку прототипів, рефакторинг і спритність, яку спричиняє не завжди визначення проблеми на початку. Однак, за іронією долі, не переоцінка проблеми на початку робить заглушку для TDD мінним полем.
wax_lyrical

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

6

Я стикався з декількома ситуаціями, коли TDD зводить мене з розуму. Щоб назвати деякі:

  • Ремонтопридатність тестового випадку:

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

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

  • Складність тестування автоматизації:

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

    Крім того, ви витратите час на налагодження кодів, які допоможуть вам зловити помилки. На мою думку, більшість цих помилок походить від того, що команда тестування не відображає зміни програми у сценарії тестування автоматизації. Зміни в бізнес-логіці, графічному інтерфейсі та інших внутрішніх матеріалах можуть змусити ваші сценарії припиняти роботу або працювати ненадійно. Іноді зміни дуже тонкі і їх важко виявити. Колись усі мої сценарії повідомляли про помилку, тому що вони засновували свій розрахунок на інформації з таблиці 1, тоді як таблиця 1 тепер була таблицею 2 (оскільки хтось поміняв ім'я об’єктів таблиці в коді програми).


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

5

Найбільша проблема - це люди, які не знають, як правильно скласти одиничні тести. Вони пишуть тести, які залежать один від одного (і вони чудово працюють з Ant, але потім раптом не вдається, коли я запускаю їх із Eclipse, тільки тому, що вони працюють в іншому порядку). Вони пишуть тести, які не перевіряють нічого конкретного - вони просто налагоджують код, перевіряють результат і змінюють його на тест, називаючи його "test1". Вони розширюють сферу занять і методів лише тому, що їм буде простіше писати одиничні тести. Код одиничних тестів жахливий, з усіма класичними проблемами програмування (важке з'єднання, методи довжиною 500 рядків, жорстко закодовані значення, дублювання коду) і пекло дотримуватися. Чомусь люди розглядають одиничні тести як щось, що поступається "справжньому" коду, і вони не " т взагалі дбати про їх якість. :-(


4

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


Це справді негативний, чи хитрий спосіб висловити позитив.
IanL

3

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

Якщо ви працюєте в компанії, яка платить вам за KLOC (або вимоги, реалізовані - навіть якщо вони не перевірені), тримайтеся подалі від TDD (або оглядів коду, парного програмування, або постійної інтеграції, і т. Д. Тощо).


3

Ви втрачаєте можливість сказати, що ви "готові", перш ніж протестувати весь код.

Ви втрачаєте можливість записувати сотні чи тисячі рядків коду перед його запуском.

Ви втрачаєте можливість вчитися через налагодження.

Ви втрачаєте гнучкість для надсилання коду, в якому ви не впевнені.

Ви втрачаєте свободу щільно з'єднувати свої модулі.

Ви втрачаєте можливість пропустити написання проектної документації низького рівня.

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


1
Залежить від вашого визначення поняття «доставити рішення вчасно» - це те, що «будь-яке старе, частково зламане рішення вчасно» або «доставити робочі рішення вчасно». Ви, звичайно, втрачаєте можливість вчасно доставляти частково розбиті рішення. Що стосується швидкості розробки, мені подобається показник "минув час між початком розробки та тижнем бездоганного живого розгортання". Якщо ви вимірюєте це справедливо, важко навіть взагалі зупинити годинник на роботі з copmlex, що не працює на TDD.
Дафідд Різ

47
-1, це саме те, що ОП заявило, що не хоче.
erikkallen

1
Багато правдивих тверджень, але: що сказав erikkallen. -1.
j_random_hacker

@ J_random_hacker говорить хакер ... LOL
Ден

лише третє твердження легітимне: "навчання через налагодження втрачено"
YEH

2

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


2

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


2

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

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

Це, звичайно, меч з двома кінцями. Якщо ви витратите весь свій час на розробку всіх мислимих, уявних, X, Y і Z, яких користувач міг би хотіти, ви неминуче ніколи нічого не закінчите. Якщо ви щось доробляєте, будь-хто (включаючи себе) буде неможливо уявити, що ви робите у своєму коді / дизайні.


Подумайте над цим, ви, швидше за все, закінчите розробку конкретних тестових випадків, тому ви не будете проявляти творчість і починати думати, "було б здорово, якщо користувач міг би робити X, Y і Z". - На мою думку, саме навпаки. Якщо ви пишете одиничні тести, вам цікаво про різні бізнес-випадки, а це означає, що ви творчі, і це дозволяє передбачити щось непередбачене. Однак ця творчість не важлива, якщо у вашій реалізації є помилки.
BlueLettuce16

1

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


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

1

Ви втратите великі класи з численними обов'язками. Ви також, ймовірно, втратите великі методи з численними обов'язками. Ви можете втратити деяку здатність до рефакторингу, але ви також втратите частину потреби в рефактори.

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

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

Дейв Манн


1

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

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

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

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


1

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


1
  • Тест одиниці - це більше код для запису, таким чином, вища перша вартість витрат на розробку
  • це більше код для підтримки
  • потрібне додаткове навчання

1

Гарні відповіді на всіх. Я б додав кілька способів уникнути темної сторони TDD:

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

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

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


Випадкові тести можуть переривати час від часу і ускладнюють їх повторення
Девід Сайкс

@DavidSykes: Щоразу, коли ви робите випадковий тест, ви записуєте параметри, так що, якщо він не вдається, ви можете повторити його, або ви можете повторити його пізніше, навіть якщо він не вийшов з ладу. Справа в тому, що не залежати від того, щоб ви придумували тестові випадки. Якщо ти такий, як я, ти інстинктивно тяжієш до безпечних тестових випадків.
Майк Данлаве

0

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

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


9
Усі приватні методи повинні бути протестовані за допомогою публічних методів, які все одно існували б.
Гаррі Шутлер

Це неможливо для всіх класів. Іноді ви не хочете знущатися над усіма залежностями тощо. Ви просто хочете перевірити корисний метод.
Джейсон Коен

+1, так правда. До цього додайте вимогу іноді додавати геттерів / сетерів до приватних полів лише для того, щоб мати можливість налаштувати та прочитати стан правильно для одиничного тесту, навіть якщо стан повинен бути приватним для класу.
erikkallen

Подумайте написати свої тести так, ніби це живий документ. Тоді ви побачили б світло. Читайте також XUnit Test Patterns.
Скотт Німрод

0

Дозвольте додати, що якщо ви застосовуєте принципи BDD до проекту TDD, ви можете усунути деякі основні недоліки, перелічені тут (плутанина, непорозуміння тощо). Якщо ви не знайомі з BDD, прочитайте вступ Дена Норта. Він придумав цю концепцію у відповідь на деякі питання, що виникли внаслідок застосування TDD на робочому місці. Вступ Дана до BDD можна знайти тут .

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


Абсолютно. Ви повинні враховувати BDD при оцінці TDD.
user9991

Здається, BDD = розвиток, орієнтований на поведінку
hayalci

0

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

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


0

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

Його девізом був рефактор, рефактор, рефактор. Я зрозумів, що рефактор означає «не планувати заздалегідь».


-1

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


Я розвиваюся в протягом 36 поіменний тепер цей пост може дати вам добру пораду: stackoverflow.com/questions/738539/tdd-how/45971814#45971814
user2288580
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.