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


103

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

Я пропускаю одиничне тестування - це просто полегшує життя. Але я знаходжу, що коли я шукаю нову роботу, тестування підрозділу - це чи то, з чим компанії хотіли б "піти" в майбутньому, або те, що вони взагалі не роблять (е-е, це вже деякий час зараз!). Я б сказав, що 60-75% запитань про роботу, які я переглядав за останні 2 роки, взагалі не перераховували тестування. Я можу подумати лише про одного або двох, які мали досвід тестування підрозділу як вимогу (для посади розробника середнього рівня).

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

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


У якому домені ви працюєте? Я завжди стикався з одиничними тестами різної повноти, де б я не працював. Але мій досвід полягає у медичній та промисловій томографії, тому це може бути причиною ...
Кена

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

11
Тестування крісла: людина сидить у кріслі, запускає додаток, повідомляє про помилки.
jcollum

3
@Darknight повинен мати 50k грошей за свою чесність. Хай старі голови, підкачайте сьогоднішній час. Тримайте це тестове лайно ще в 90-х, де воно належить. Найбільша трата часу. Це просто щось піднести, щоб ви могли виглядати важливими, але в більшості випадків абсолютно нічого не робите. У нас є щось, що називається IDE в наші дні, ми більше не програмуємо на консолі чи в блокноті. Ми знаємо, що наш код правильний, тому що ми можемо курсувати над текстом і бачити значення. Продовжуйте тестування приладів у минулому разом із усіма іншими старими таймерами.
портфоліобудівник

1
@portfoliobuilder Так, роздуття над значеннями у вашому IDE дійсно допоможе покращити якість коду. Тому що стан завжди буде однаковим, а код ніколи не зміниться. Прямо! І удачі.
Франц Д.

Відповіді:


112

З мого досвіду, в цьому є кілька факторів:

  1. Керівництво насправді не розуміє, що таке насправді одиничне тестування або чому воно має для них справжнє внутрішнє значення.
  2. Керівництво, як правило, більше турбується про швидку доставку товару, і (неправильно) розглядає одиничне тестування як контрпродуктивне для цієї мети.
  3. Існує неправильне уявлення про те, що тестування належить виключно до поваги QA. Розробники є кодерами і не можуть писати тести.
  4. Існує поширена помилка, що керівництву доведеться витратити гроші, щоб зробити тестування підрозділів правильно, незважаючи на те, що інструменти є у вільному доступі. (Існує, звичайно, час розробника, щоб розглянути, але це не дуже забороняється.)
  5. Відповідь Вілла завершить цю відповідь: дуже важко визначити значення тестового коду (редагувати jcollum)

Природно, є й інші фактори, але це лише те, що я натрапив на даний момент.


Так, в значній мірі описано моє управління, і у нас немає тестування.
Тай.

І підтримка в деяких популярних мовах (C / C ++) погана.
Мартін Бекетт

@mgb - CxxUnit для мене працює добре ...
Домінік Роджер,

2
CxxTest також дуже хороший. Через погані механізми відображення в C ++, здається, представлені більш різноманітні "рішення"; Для CxxTest потрібен крок попередньої обробки в системі збирання, тоді як такі інструменти, як TUT, повністю підтримуються часом компіляції та мовою, але незручні у використанні.
Том

2
Я виявив, що користувачі сайту stackoverflow.com, як правило, звинувачують управління у багатьох своїх подібних проблемах. Коли я запитав своїх друзів з реального життя про їхні "проблеми управління", які виникають, як правило, я виявив, що вони ніколи навіть не висловлювали занепокоєння керівництву, я повинен менше брати участь у кампанії зі зміни поглядів людей. Замість того, щоб сказати, що "менеджмент не робить ..." Я намагаюся продумати способи, яким я можу допомогти керівництву побачити свою точку зору, і переконати їх, що моя позиція правильна. Я думаю, що це проблема, оскільки розробники не дуже добре продають одиничний тест.
Брайан Стінар

87

1) Важко
2) Це потребує часу
3) Визначити значення тестового коду дуже важко

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


11
"Хороші одиничні тести зменшують помилки. Але це добре робить виробничий код." - Хороші одиничні тести дозволяють поліпшити виробничий код. Навіть якщо код спочатку поганий, але у вас хороше тестове покриття, ви можете впевнено переробити систему, поки код не буде хорошим.
Еско Луонтола

1
Esko, окрім хорошого покриття, ви також повинні мати хороші тести, які насправді щось тестують. Ви могли б мати 100% покриття коду і насправді випробовувати дуже мало
Джейкоб Адамс

Відмінна відповідь! Ви сказали те саме, що і моя відповідь набагато менше слів.
Клин

2
Так, одиничні тести потребують часу. Але так само відбувається "випадкове виправлення помилок". Правильна розробка тестів має "всі" функції, "задокументовані" в тестах. Якщо тести зеленого кольору, виріб працює за призначенням (за винятком питань зручності використання тощо). Мій досвід полягає в тому, що загальний час розробки майже не впливає. Ви витрачаєте більше часу на речі, і вправляєте їх правильно в перший раз, а не після часу, витраченого на виправлення помилок.
Арве Систад

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

70

Легко покласти всю провину на "управління". Але чи справді керівництво говорить вам, щоб спеціально не проводити тестування?

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

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

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

  • Взаємодія з користувачем. Половина вашої програми - це логіка користувальницького інтерфейсу. Як ви протестуєте його в автоматизованому вигляді, який не виходить з ладу, якщо ви перемістите кнопку?
  • Взаємодія із зовнішніми API та рамками. Якщо ви пишете драйвер ядра Windows, як ви його тестуєте? Ви пишете заглушки для кожної функції IRP та ядра, ефективно створюючи імітацію ядра ОС?
  • Мережеві комунікації - справа 21 століття. Як ви координуєте тест одиниці, що складається з декількох розподілених компонентів?
  • Як ви обираєте хороші тестові справи? Я часто бачу людей, які намагаються "робити випадкові речі в циклі з 1000 ітерацій і бачити, чи не виходить з ладу". Коли ви зробите це, зусилля вище, ніж віддача, важливі помилки пропускаються, а тестування одиниць припинено.
  • Як ви перевіряєте, чи відповідають вимогам продуктивності?
  • Знання закономірностей тестування обмежене: заглушки, консервовані відповіді, регресійне тестування - це поняття, які більшість людей не знає. Скільки на вашому робочому місці насправді прочитали книгу про тестування одиниць?

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

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


2
Гарна ідея. Але не вимагайте часу для створення одиничних тестів окремо від часу створення коду "продукт"!
Джефф Котула

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

1
На одному драйвері ядра, над яким я працював, я відновив купу коду до бібліотеки, яку я пов’язав у тестовий ремінь користувальницького режиму. Цей конкретний код був екологічно-агностичним, тому він був досить простим. Я не пробував цього, але IRP, як файлові системи та бази даних, повинні бути підданими.
Джордж В. Рейлі

1
За допомогою Bochs або QEMU можна написати моделювання вашого пристрою, щоб поговорити з вашим драйвером ядра.
Зан Лінкс

2
@floding, захоплююча відповідь. Думаю, мені доведеться читати книгу про тестування одиниць.
Дан Розенстарк

28

Більшість тестів нічого не перевіряє.
Ви пишете функцію fileopen () і тест, що виходить з ладу, якщо файл не існує і успішний, якщо файл існує. Чудово! Тепер ви перевірили, чи працює вона з назвою файлу китайською мовою BIG5? на акцію NFS? на Vista з файлом на USB-ключі та UAC увімкнено?

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

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


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

4
Елемент, який вам не вистачає, полягає в тому, що одиничні тести - це не просто одноразова річ. Якщо пізніше я дізнаюся, що мені потрібно виправити помилку з fileopen () на спільній доступності NFS, тоді я можу додати тест до свого тестового набору для цього. Потім, коли я буду більше розвиватися в майбутньому, у мене є регресійне тестування.
Пол Осборн

2
Багато помилок виникають у взаємодії поза кодом, про яку не думали програмісти, і їх неможливо знайти, просто перевіривши код. Поширена проблема gui - машини з дуже високими / низькими налаштуваннями DPI - ви можете перевірити діалогову функцію всього, що вам подобається, але цього не помітите.
Мартін Бекетт

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

1
TDD обробляє виправлений тестовий номер "програміста, який написав код, а потім записує тести", змусивши вас написати тести, перш ніж писати код.
Офідіан


15

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


12

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

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

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

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


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

11

Ну, моя компанія не пройшла тестування TDD або Unit. Якщо чесно, ми не впевнені, як це зробити. Ми, очевидно, можемо зробити це для дурних функцій, таких як CapitalizeString () тощо, але ми не знаємо, як це зробити для дуже складних систем зі складними об'єктами. Більше того, більшість опитаних людей мають або нульовий досвід, або обмежений досвід. Здається, що Unit Testing є великим від натовпу SO, але не особливо великий у доступній робочій групі.

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

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


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

4
Сенс TDD, який, здається, вам не вистачає, полягає в тому, що ви записуєте всі крайові випадки у свій тест на одиницю. Для кожного випадку ви пишете твердження у своєму тесті на одиницю. Потім, якщо ваш фактичний код не відповідає твердженню, ви знаєте, що у вашому коді є помилка, і ви неправильно реалізували свою логіку. Оскільки одиниці невеликі, а ваше твердження перевіряє конкретний код у підрозділі, то слід точно визначити, де ваша логічна помилка. Важливим є те, що ви спочатку пишете свої твердження. Потім зробіть ваш код пропуском. Чи можете ви вказати, де цей процес стримує щось, окрім зростання помилок?
Крістофер Паркер

2
Спробувати і випробувати тест без написання тестів спочатку буде дуже складно. Це тому, що ваш код буде важко потрапити в тест-ремені заднім числом. Це одна з головних переваг тесту в першу чергу: дизайн можна перевірити з самого початку, оскільки тести керували дизайном.
Алан Крістенсен

3
Яким чином може бути те, що ви "не знаєте, як" провести тестування, але вважаєте, що TDD стримує творчість та гнучкість?
jcorcoran

1
@Steve 6 років, було б непогано знати, чи ви коли-небудь вводили тестування одиниць (або навіть TDD) і чи продовжували ви з цим.
Люк Пуплетт

11

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

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

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


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

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

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

6

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


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

6

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

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

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


1
+1 для "має бути природною частиною робочого процесу розробки коду". Кожен професійний розробник повинен проводити там тестування підрозділів незалежно від офіційного процесу. Єдиним законним аргументом з цього питання є визначення одиниці .
Данк

1
@Dunk Якщо ви не визначаєте "unit", то ви лише говорите, що "професійні розробники повинні робити власне тестування".
ChrisW

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

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

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

5

Ймовірно, це поєднання пари речей, про які ви вже згадували. Важко виміряти економію витрат на TDD. Якщо ви хочете передавати свої ІТ-ресурси в аутсорсинг, ви можете показати, скільки ви платите за рік хлопцям, у яких є персонал, порівняно з витратами на укладання контракту; це дуже конкретно. Як ви скажете: "О, цей тест виявив помилку, яка потребувала б 4 годин, щоб налагодити та виправити ..."?


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

1
Так, саме тому я сказав, що настільки важко кількісно оцінити переваги тестування.
Ovi Tisler

5

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

Крім того, команді (або комусь) потрібно створити інфраструктуру та підтримувати її.

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


5

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


5

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

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

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


4

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

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


4

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

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

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

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


3

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


Я згоден. Якщо ви використовуєте модель / перегляд / контролер, то має велике сенс перевірити модель та контролер. Користувацький інтерфейс майже завжди найкраще перевіряється людиною.
Zan Lynx

3

Я пропускаю одиничне тестування - це просто полегшує життя.

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

Достатньою причиною може бути "дешевше" (та / або "краще"): що не так просто довести про тестування одиниць.

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

Є багато розробників, які не вважають світ тестових одиниць: в тому числі такі, хто вважає, що інші форми тестування (наприклад, автоматизована інтеграція / функціональні тести) можуть бути дешевшими і ціннішими, наприклад, чи я єдиний розробник, який не робить ' т, як одиничні тести?


3

Звичайно, в ідеальному світі не можна сперечатися проти тестування одиниці.

Однак, чи ви пишете одиничний тест, залежить від кількох речей:

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

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

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

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

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


3

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

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

Третя причина - лінь та / або дешевизна.


3

Тому що одиничні тести корисні лише тоді, коли ви пишете тестовий код. І писати тестовий код важко. А люди ліниві та / або дешеві.

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


Я б підтримав це, за винятком того, що я не думаю, що люди "ліниві". Подумайте, що "програмування", тобто "ваша популярна мова програмування та пов'язані з нею інструменти, документи, навчання, робочі процеси та інше", ніколи не було розроблено таким чином, щоб полегшити написання тестового коду. Тож для написання тестового коду завжди потрібно пройти додаткову милю. Без винагороди "оскільки вона вже працює" до цього моменту (так що написання тестів спочатку, код пізніше, TDD має практичний сенс). Вважайте, що це скоріше когнітивний ухил, який хитрує не лише сучасних програмістів, але вже обдурив авторів інструментів «програмування», над якими тепер будуються кодери.
n611x007

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

2

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

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

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


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


2

Мої 2 копійки:

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

Отже, це лише питання часу.

Існує дискусія про Мартіна-Копліена, в якій Боб Мартін стверджує, що:

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

[ http://www.infoq.com/interviews/coplien-martin-tdd]


2
Я не вірю в існування складної системи реального світу, в якій кожен рядок коду охоплювався одиничними тестами.
Quant_dev

2

Якщо ви хочете продати всіх на тестування, зробіть наступне:

  1. Напишіть купу тестів.
  2. Повідомте інших розробників, які змінюють код і не виконують ваш тест.
  3. Вони виправлять свій код.
  4. Тепер ви можете випустити без цих помилок.

Навіть менеджер міг це зрозуміти.


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

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

@jcollum Як завжди, це залежить від співвідношення витрат і прибутку.
Quant_dev

2

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


2

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

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

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

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

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


1

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


Ви повинні прочитати посилання про рентабельність інвестицій.
jcollum

1

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


Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх дописом.
AlexVogel

Питання: "Чому більше компаній не роблять [тестування одиниць]?" Відповідь: "Тому що більшість компаній марні". Мені звучить відповідь ...
Роджер Ліпскомб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.