Чи варто тестування одиниць або тестова розробка?


48

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

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

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

Крім того, чи є щось, що робить TDD особливо гарним для Scrum?


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

3
Подумайте про бажання / потребу в рефакторі. Чи були б ви впевненішими в тому, що насправді робите рефакторинг (будь-якої величини) з вичерпним набором одиничних тестів або без них, щоб зловити вас, коли ви щось ненароком зламали?
Мар'ян Венема

2
"Дає людям милицю, коли вони пишуть реальний код"? Чи не можна так описати більшість найкращих практик?
user16764

4
@DavidWallace: Це проблема некомпетентних розробників, а не відсутність TDD. Більше того, навіть коли TDD використовується широко, він дає нульові гарантії, що внесена вами зміна нічого не порушить.
Кодер

6
@NimChimpsky: У мене немає негативу щодо TDD, я просто не слідкую за ажіотажем. У неї є і позитивні сторони, і негативи. Одне з них є помилковим почуттям безпеки.
Кодер

Відповіді:


68

Коротка відповідь: Абсолютно позитивно.

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

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

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

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


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

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

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

4
ви не можете довести, що нетривіальний код працює будь-яким відповідним способом, лише використовуючи автоматизовані тести. За допомогою автоматизованих тестів ви можете лише довести, що код проходить тести - якщо тести охоплюють 100% випадків використання, можливо, у вас є "певний рівень", але це все ще не означає, що код "доказово працює". Щоб мати справжню доказовість, вам знадобиться en.wikipedia.org/wiki/Formal_verification - як такий, ви тут вживаєте термін "очевидно" неправильно.
vaxquis

1
@vaxquis так, ви строго правильні щодо використання терміна доказ. Але я б заперечив, що наявність тестів (або практики TDD) є кращим свідченням роботи системи, ніж відсутність тестів.
rupjones

16

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

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

Джерело зображення


Що ви маєте на увазі під традиційним ? Що-небудь, що не є TDD?
Джорджіо

Здається, цей графік не ґрунтується на реальній статистиці, він лише відображає досвід однієї людини, яка написала цю запис у блозі в 2006 році. Не те, що я говорю, це абсолютно неправильно, але реальність набагато складніша.
Док Браун

9

Чи варто тестування одиниць або тестова розробка?

Так, це так . Дядько Боб (Роберт Мартін) розповів у презентації;

Щоб розробник довів, що його код працює краще, щоб написати тест і здати його, ніж кричати, співати чи танцювати про нього.

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

На ньому написано багато речей,

  1. Ви несете відповідальність за те, щоб ця функція працювала. Напишіть тест. Просто зроби це.
  2. Коли замінити модульні тести інтеграційним тестом

Чи пов'язані SCRUM, Unit тестування та TDD?

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

Чи є щось, що робить TDD особливо гарним для SCRUM?

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


8

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

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

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

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

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

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

Крім того, чи є щось, що робить TDD особливо гарним для SCRUM?

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


6

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

Мої причини тестування одиниць також включають:

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

Дає відчуття прогресу.

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

Забезпечує додатковий рівень документації (особливо якщо ви правильно коментуєте свої тести).

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

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


2

Чи варто тестування одиниць або тестова розробка?

Безумовно, так (див. Інші відповіді)

[Це] насправді гарна ідея і варті зусиль і часу?

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

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

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

Якщо ви робите TDD, код автоматично перевіряється.


2

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

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

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

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

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

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


1

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

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

Щодо підходу червоно-зеленого рефактора до TDD, я вважаю, що це трохи нудно. Але у кожного своє.


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

0

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

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

Насправді існує один тип тестування, який я виявив загальновизнаним і, на мою думку, зрештою марним. А саме тестування на основі GUI, наприклад, за допомогою селену, веб-драйвера, Watir або Arquillian. Ось так ми отримуємо 7-годинний цикл побудови, а не 5-хвилинний цикл збірки на моїх проектах TDD.

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

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

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


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

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

unittests можуть бути дуже хорошою документацією для розробників, оскільки вони показують приклади використання api.
k3b

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