Чи є вагомі докази рентабельності інвестиційних випробувань?


127

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

Який доказ є? Хтось насправді розробив одне і те ж програмне забезпечення з двома окремими командами, одна використовувала тестування одиниць, а інша ні, і порівнювала результати? Я сумніваюся в цьому. Чи просто я повинен це виправдати: "Подивіться це в Інтернеті, всі про це говорять, значить, це потрібно зробити правильно"?

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

Відповіді:


98

Так. Це посилання на дослідження Бобі Джорджа та Лорі Вільямса в NCST та ще одне Нагаппан та ін. Я впевнений, що є більше. Публікації доктора Вільямса про тестування можуть стати хорошою відправною точкою для їх пошуку.

[EDIT] Дві статті вище конкретно посилаються на TDD і показують на 15-35% збільшення початкового часу розробки після прийняття TDD, але зменшення дефектів перед випуском на 40-90%. Якщо ви не можете отримати повнотекстові версії, пропоную скористатися Google Scholar, щоб дізнатися, чи можна знайти загальнодоступну версію.


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

Жодне з досліджень не порівнює порівнянну модель процесу зі зміною лише тестметофології. Тобто витрачати час, використаний на UT, фактично краще витратити на напр. тестування системи. На сьогодні це може бути так, "якщо ми перевіримо розумніші, чи допоможе це" вивчення.
Руна ФС

1
Що робити, якщо вартість виправлення помилок після випуску становить 0,01% від загальної розробки? TDD була б жахливою інвестицією в цьому випадку. А якщо клопів мало? Ці% s нічого не означають без контексту. Щоб бути справедливим, я ще повинен прочитати все дослідження. Але на сьогоднішній день ваша публікація корисна (хороші посилання), але не відповідає на питання щодо ROI, IMO.
Інстин

1
@Instine На щастя (?) Є хороші докази того, що це не так. Виправлення помилок після випуску експоненціально дорожче, ніж помилки, виявлені на початку розвитку (саме це робить TDD). У цьому контексті вартість 0,01% від загальної розробки для всіх помилок після випуску видається малоймовірною. (Докладніше див. Code Complete , зокрема Boehm та ін. , "Розуміння та контроль витрат на програмне забезпечення", IEEE Trans Softw Eng (1988)).
Конрад Рудольф

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

29

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

Чому?

Чому б не зробити це, тихо і розважливо. Вам не доведеться робити це все відразу. Це можна зробити невеликими крихітними шматочками.

Рамкове навчання займає дуже мало часу.

Написання одного тесту, лише одного, займає дуже мало часу.

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

Це все, що потрібно. Нікому не потрібно знати, що ти це робиш. Просто зроби це.


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

Просто зробіть це і не кажіть їм, і продайте ідею вашим коледжам на перерві на каву ;-)
Йохан

3
Тому що вас звільнять, коли послідовно не досягаєте своїх термінів?
Андрій

3
@Neko: Тести одиниць не додають "трохи накладних витрат". Вони зменшують загальну завантаженість, запобігаючи цілому потопу тупих помилок. Робота не росте; він просто переходить в природі від поганого коду до хорошого одиничного тесту та хорошого коду.
С.Лотт

1
Лічильники квасолі хочуть, щоб їхні інженери пропонували надійні рішення проблем домену. Ви можете просто написати тести як частину свого рішення. Вони навіть не помітять. Якщо вони запитують, ви можете просто сказати їм, що витрачаєте на це більше часу, щоб переконатися, що він надійний і не потребуватиме переробки. Якщо ви ПІДПРИЄМИ тести для написання одиниць, ви просите їх схвалення на те, про що вони нічого не знають.
Йоркширман

16

Я підходжу до цього іншого підходу:

Яка впевненість у вас, що ваш код правильний? Або що це не порушує припущення X, коли хтось із вашої команди змінює func1 ()? Без тестів, що зберігають вас "чесними", я не впевнений, що ви багато впевнені.

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

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

Ось де вона себе окупає: 1) Ви маєте впевненість у своєму коді та 2) Ви уловлюєте проблеми раніше, ніж ви могли б інакше. У вас немає QA хлопець сказати "ей, ви не турбувались межі перевірки функції xyz (), чи не так? Він не знайде цю помилку, тому що ви її знайшли місяць тому. Це добре для йому, добре для вас, добре для компанії і добре для клієнта.

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


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

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

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

10

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

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

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

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

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


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

"Це справа лічильників бобів, щоб визначити, як повинні працювати технічні люди?" -> всі бізнес-рішення зводиться до грошей. Все-таки хороша відповідь, +1
jcollum

@jcollum, але те, як ви виконуєте свою роботу, не має нічого спільного з грошима, і якщо ви хочете, щоб хтось з куполів був підзвітним, ви дозволяєте їм вирішити, ЯК вони роблять, ЩО ви просили про них
Rune FS

TDD - це не техніка проектування, це лише техніка кодування. blog.ploeh.dk/2010/12/22/TTTDApostate Багато коментаторів не погоджуються, що TDD передбачає рефакторинг (який є дизайнерською технікою), але рефакторинг не передбачає TDD. Можна рефакторувати без тестів, великий складний рефакторинг так чи інакше впливає на одиничні тести, тобто тести також повинні бути відновлені, щоб вони також стали недійсними / помилковими зеленими; більш прості рефакторинг багато не впливають на тести, але ризик помилок нижчий - тому що рефакторинг простий.
KolA

@KolA добре, маючи на увазі 10,5 років після цієї відповіді, я можу сказати, що це дещо захисніше сьогодні, але все-таки: я не заперечую, що TDD - це єдина техніка дизайну, яка вам коли-небудь знадобиться, і Марк відкривається, коли вона є хороша техніка дизайну, перш ніж зробити висновок, що це зовсім не один. Я ослаблю його думку і можу сказати, що це не повинна бути єдиною технікою дизайну. Кожен код, який я коли- небудь писав TDD, виглядає відмінним від коду, який я написав без. Я б назвав це результатом дизайну. Я найкраще працюю з дошкою, дискусіями та іншими інструментами, крім TDD. Але дякую за посилання
Олаф Кок


6

Більше про TDD, ніж про строго одиничне тестування, тут - посилання на Усвідомлення покращення якості завдяки розробці тестових розробок: результати та досвід роботи чотирьох промислових команд : Нагаппан, Е. Майкл Максимілієн, Тірумалеш Бхат та Лорі Вільямс. документ, опублікований групою Microsoft Empirical Software Engineering and Measurement (ESM) і вже згадуваний тут.

Команда виявила, що команди TDD виробляли код, який на 60% і 90% відсотків кращий (з точки зору щільності дефектів), ніж команди, що не мають TDD. Однак команди TDD потребували від 15% до 35% більше, щоб завершити свої проекти.


5

Ось чудовий і захоплюючий прочитання хлопця, який змінює свою компанію зсередини. Це не обмежується TDD. http://jamesshore.com/Change-Diary/ Зауважте, що він досить довго не переконував "лічильників бобів" і замість цього робив "партизанську тактику".


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

5

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

Вступ гостей редакторів: TDD - мистецтво безстрашного програмування [ посилання ]

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

Таблиця 1. Короткий зміст вибраних емпіричних досліджень тестово-розробленого: учасники галузі *

https://www.computer.org/cms/Computer.org/dl/mags/so/2007/03/figures/s3024t1.gif

Таблиця 2. Підсумок вибраних емпіричних досліджень TDD: академічні учасники *

введіть тут опис зображення

Вплив тестової розробки на зовнішню якість та продуктивність: метааналіз [ посилання ]

Анотація:

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

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

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


4

Ну, є кілька великих компаній, які вимагають від вас тестування одиниць, але якщо ви невелика компанія, то чому імітуєте великі?

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

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

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

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

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

Почніть з чогось такого простого, що ви не помітите, що це робите. Тренуючись на марафоні, почніть з ходьби 9 метрів і бігу на 1 метр, повторіть.


Отже, я повинен це просто зробити? Це гарантовано працює, і не має значення, якщо ніхто зі мною цього не робить?
ворон

Власне, це тест Джоеля: joelonsoftware.com/articles/fog0000000043.html . Мені здається, що у вас може виникнути більше проблем, ніж відсутність дослідження Нобелівської премії про тест на одиницю
Jonke

4

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

Редагувати : наприклад, як зазначалося, книга " Кодекс завершена " повідомляє про такі дослідження (параграф 20.3, "Відносна ефективність методик якості"). Але є також приватні дослідження в галузі консалтингу, що також доводить це.


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

Це не пов’язано з методом тестування, але коли в процесі повідомляється про помилку, і надалі краще витратити час на пошук помилок у специфікаціях, оскільки витрати на їх виправлення при пошуку при розробці повідомляються до 1000 разів як дорого ( коефіцієнт 10 на фазу розвитку)
Rune FS

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

0

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

Багато місяців тому я був свіжим випускником, працюючи над великим проектом VB6 і мав нагоду написати великий масив збереженого коду процедури. З підсистеми, яку я писав, вона складала приблизно 1/4 всієї кодової бази - близько 13000 LOC з 50K або близько того.

Я написав набір одиничних тестів для збережених процедур, але тестування блоку VB6 UI-коду реально неможливо без таких інструментів, як Rational Robot; принаймні, тоді не було.

Статистичні дані, отримані з оцінки якості, свідчили про те, що в цілій підсистемі було виявлено близько 40 або 50 дефектів, з яких два походять із збережених процедур. Це один дефект на 6500 рядків коду проти 1 на 1000-1200 або близько всієї частини. Майте на увазі також, що приблизно 2/3 коду VB6 був кодовим шаблоном для обробки помилок та ведення журналів, однаковий для всіх процедур.

Без занадто великого ручного розмахування ви можете приписати принаймні поліпшення на коефіцієнт дефектів в коефіцієнті дефектів.

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