Чому в тесті Джоеля відсутня розробка тестових програм?


23

Я читав цей блог Джоела Спольського про 12 кроків, щоб краще кодувати . Відсутність тестово керованої розробки дійсно мене здивувало. Тому я хочу передати це питання гуру. Чи справді TDD не варте зусиль?


13
Ця стаття була написана в середу, 9 серпня 2000 року (приблизно 12 років тому). Не те, що TDD тоді не було, але я не вірю, що йому сподобалося майже той шум, який він робить ці дні.
Майк

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

2
« Я придумав власний, дуже безвідповідальний, неохайний тест, щоб оцінити якість роботи програмного забезпечення. Велика частина цього полягає в тому, що це займає приблизно 3 хвилини ... Акуратний момент про тест Джоеля полягає в тому, що швидко отримати так чи ні на кожне питання. Вам не доведеться з'ясовувати рядки коду на день або середні помилки за перегин ... » - вирішення питання про те, чи буде ваш проект корисним для TDD, займе більше 3 хвилин, і, ну , можливо, знадобиться фіксувати середню кількість помилок на перегин - це тому його немає в списку
gnat

Перехід до Joel Stack plz. Це цікаве питання.
Ерік Reppen

Вам слід подумати про прийняття відповіді, на яку посилається і цитує безпосередньо Джоеля, оскільки вона не має більш авторитетного значення. Дивіться програмісти.stackexchange.com
a/189493/6586

Відповіді:


30

Тестова розробка була практично невідома до виходу книги Кента Бека у 2002 році, через два роки після того, як Джоел написав цю посаду. Тоді виникає питання, чому Джоел не оновив свій тест, чи якби TDD був більш відомий у 2000 році, чи включив би його до своїх критеріїв?

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


1
Крім того ... о, ви дещо потрапили в TDD - це пункт Kool Aid, чи не так?
Ерік Реппен


27

Джоел насправді вирішив це конкретно в кількох місцях.

Він пояснив, що тести речей не здатні наздогнати багато важливих питань, особливо суб'єктивних, таких як "чи смоктає користувальницький інтерфейс цього програмного забезпечення?" За його словами, надмірна залежність від автоматизованих тестів у Microsoft - це те, як ми закінчилися з Windows Vista.

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

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


2
Насправді ти маєш рацію. Звичайний Джоель МО - солом’яний чоловік. Як і TDD, не піймав би жодної помилки для мене, тому це не може бути добре. Що дещо пропускає те, що TDD - це не тестування, а дизайн. Тести, залишені позаду, - це бонус. Або стверджувати, що невелика зміна призведе до порушення багатьох одиничних тестів, що говорить про те, що він просто робить це неправильно. Або повністю переписати принцип SOLID, перш ніж його атакувати. Така річ. Насправді його прихильники використовують кругову логіку, а не він.
pdr

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

2
@MasonWheeler: Ви серйозно стверджуєте, що безпека компілятора / типу усуває потребу в одиничних тестах? Ви також свідомо нехтуєте дизайнерськими перевагами TDD, але, що ще важливіше, у вас має бути певний час, що переробляє щось. Швидше за все, було вірно: навпаки .NET розробники, які дотримуються методології TDD, раптом виявляють розчарування кількістю коду, який потрібно написати, щоб догодити компілятору, який все більше не допомагає у відповідь.
пдр

2
@pdr: Я серйозно стверджую, що "потреба в одиничних тестах" в першу чергу - відсутність безпеки типу. І, будучи розробником .NET, я не можу сказати багато про їхній досвід, але на власному досвіді я виявив, що складність у рефакторингу повністю базується на двох чинниках: я написав код чи ні місце, і чи автор добре написав код чи ні. (Примітка: пункти 1 і 2 не обов'язково сильно співвідносяться один з одним!)
Мейсон Уілер

3
Тести @Pdr Unit не підтверджують ваш код, вони в основному перевіряють синтаксис, але можуть бути дуже корисними під час розробки. Однак інтеграція та системні тести мають набагато більше сенсу. Також більшість переробників на мовах, які мають статичний тип, можуть бути безпечними, адже саме таке рефакторинг - це набір відомих операцій "Безпечний", які трансформують ваш код без внесення змін. Статичною мовою IDE часто може внести ці зміни для вас і запевнити, що вони є безпечними, що часто є неможливим у динамічних мовах, тому необхідні тестові одиниці для забезпечення (не доведення) тієї ж безпеки
Білл К

25

Сам Joel Spolsky відповів на це питання ще у 2009 році :

Джоел: Йде дискусія з приводу тестового розвитку ... якщо у вас є одиничні тести на все, подібні речі ... багато людей пишуть мені, прочитавши Тест Джоела, щоб сказати: "У вас повинен бути 13-й Про те, що тут: Тестування модулів, 100% одиничні тести всього вашого коду. "

І це вражає мене, як те, що я трохи надто доктринерний про щось, що вам може не знадобитися. Мовляв, вся ідея спритного програмування полягає не в тому, щоб робити речі, перш ніж вони вам знадобляться, а в тому, щоб виправити їх на сторінку в міру необхідності. Я відчуваю, що автоматичне тестування всього, багато разів, просто не допоможе вам. Іншими словами, ви збираєтеся написати дуже багато одиничних тестів, щоб забезпечити той код, який насправді буде працювати, і ви обов'язково дізнаєтесь, чи він не працює [якщо ви цього не зробите пишіть тести], насправді все ще працює, ... я не знаю, я отримаю для цього таку полум’я, оскільки я не так добре це висловлюю. Але я відчуваю, що якби команда справді мала 100-відсоткове покриття кодом своїх одиничних тестів, виникло б декілька проблем. Один, вони витратили б дуже багато часу, пишучи одиничні тести, і вони не обов'язково змогли б заплатити за цей час покращеною якістю. Я маю на увазі, вони мали б кращу якість, і вони мали б можливість змінювати речі в своєму коді з впевненістю, що вони нічого не порушують, але це все.

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

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


2
Дійсно? Думає про розміщення власної відповіді Джоеля на питання ОП?
Росс Паттерсон

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

Я ніколи не працював над проектом, який мав 100% тестовий покрив. Але якщо у вас 0% тестового покриття ... ... це неабияк.
Kzqai

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

5

Ніхто, крім Джоеля, не міг відповісти на це точно. Але ми можемо спробувати деякі причини / спостереження.

Перш за все, тест Джоела не відсутній

  • Тести згадуються два рази в 12 кроків безпосередньо (10 і 12)
  • Існування збірки є одним із перших моментів. Ідея побудови полягає в тому, щоб отримати здатність бачити, чи не зламаються вони, тому ми (також) говоримо про тестування тут.

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

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


3
"Ви робите TDD?" Звичайно, підходить як питання "ні". І я маю на увазі, що це питання, на яке всі відповідають з чітким "так", що насправді означає "ні".
янніс

2
@YannisRizos: Начебто "Ви використовуєте найкращі інструменти, за які можна купити гроші?" (Так ... wellllll ... в межах причини.) Та "Чи мають програмісти спокійні умови праці?" (О, так ... ну, так, ну, залежно від вашого орієнтиру, тихо, я думаю.)
Пдр

@pdr Залежить від того, чи вважаєте ви звук сирени, що надходить через відкриті вікна тихим.
Роберт Харві

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