скільки часу ви витрачаєте на тестування одиниць?


27

У компанії, в якій я працював, керівники наполягали на тому, що покриття коду тестами підрозділу повинно становити 99% або більше. Це призвело до написання більше тестів, ніж код. На те, щоб скласти тести для одного класу, на реалізацію якого пішов день, нам знадобилося буквально 3 дні.

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

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

Зараз, як самозайнята людина, мені цікаво - скільки часу насправді потрібно витратити на тестування одиниць? Які частини коду повинні бути охоплені тестами, будучи переважно розробником iPhone / Android?


У моїй попередній компанії це був Java EE, смужки та підкоси. Як я вже заявив, зараз це в основному розробка iPhone та Android.
Меггі

TDD означає, що ви пишете тести перед кодом. Здається, це було тестування "після факту", це щось інше.

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

Меггі, ви можете знайти цю статтю цікавою: fastcompany.com/magazine/06/writestuff.html

Чи є якісь метрики для оцінки часу? Інструменти для JS / .NET-коду?
пеклобоя

Відповіді:


16

Кількість одиничного тестування, яке потрібно, залежить від кількох факторів:

  • Розмір продукту (чим більший проект, тим більша потреба включити принаймні деякі одиниці тестування)
  • Необхідний рівень якості (Якщо ви швидко збираєте програмне забезпечення, яке повинно бути якнайшвидшим, і деякі незначні помилки є прийнятними, можливо, ви будете змушені пропустити тестування, як тестування одиниць)
  • Тип продукту (користувальницькі інтерфейси можуть бути перевірені одиницею, але іноді простіше пропустити тестування одиниць на важких розділах GUI проекту та замість цього випробувати вручну)
  • Ваша здатність / історія кодування (який тип помилок ви зазвичай створюєте? Це речі, які зазвичай тестує модуль тестування, або речі, які зазвичай знаходить інший тип тестування. Знаючи, що це може підштовхнути вас до більш-менш тестування одиниць)

10

У нашій групі продуктів ми орієнтуємось на 50-70% покриття коду від одиничних тестів та 90% + покриття від одиничних тестів та автоматизації тестування разом. Типовий час, розрахований на написання одиничних тестів, становить приблизно 1 день для кожної функції, яка займає 3-4 дні кодування головою вниз. Але це може змінюватись у багатьох факторах.

99% покриття коду чудово. Тести одиниці чудові. Але 99% покриття коду від лише тестування одиниць? Мені важко повірити в те, що ти можеш отримати стільки покриттів лише від одиничного тестування .

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

Але ви сказали, що три дні тестового написання були лише для одного класу. Можливо, сам клас не був розроблений для одиничного тестування. Чи реалізує клас інтерфейс користувача? Мережі? Файл вводу / виводу? Якщо так, то, можливо, ви написали більше коду для тестування часу виконання Java, ніж ваша бізнес-логіка, яка взаємодіє з програмою.

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


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

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

10

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

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


3
І ти погано виглядаєш, коли виправляєш помилку лише для того, щоб впроваджувати помилки B&C
JeffO

залежить, чи B і C потрапляють на тести чи ні

"Ви витратите більше часу на підтримку, ніж ви думаєте зараз" - дійсно, особливо враховуючи, що продукти SW зазвичай переживають запланований термін експлуатації, часто далеко.
Péter Török

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

1
@Eran, тож варто планувати збій, щоб не довелося складати бюджет на тести?

4

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

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


Так, для мене це правда (адже я зазвичай перебуваю між тестами та кодом товару кожні кілька секунд , а не хвилин). Тому я, певно, працюю над тестами у 100% часу.
Джонатан Хартлі

2

Якщо ви не витратите час на тести, ви витратите ще більше часу на налагодження в реальному коді.
Тому витрачайте стільки часу, скільки потрібно на тести, щоб покрити весь (або 99% коду).


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

3
@Coder, тому що люди мають досвід і знають, що тести - це набагато корисніше, ніж сліпі налагодження.
OZ_

2
Залежить. Тестові одиниці часто є контрпродуктивними і додають помилкового почуття безпеки. І в добре структурованому коді ви не потрапите в проблему "сліпої налагодження". У вас виникає проблема, ви знаєте, де шукати. Якщо цього не зробити, пройдіть повний перегляд коду / дизайну. Також дивіться: programmers.stackexchange.com/questions/86636/…
Coder

4
У цьому проблема багатьох прихильників TDD, вони вороже ставляться до налагодження та дизайну, покладаючись на тести, щоб знайти всі помилки. Потім у виробничому коді програми просочують пам’ять, обробляють і виходять з ладу на багатоядерних ядрах, і вони схожі на «WTH». TDD - це лише інструмент, і залежно від заданих завдань може бути або дуже продуктивним, або дуже контрпродуктивним. Постарайтеся написати одиничні тести для всіх важких випадків у пов’язаному пості, і ви ніколи не доставляєте продукт.
Coder

1
"Якщо ви знаєте інструменти, ви рідко стикаєтеся з проблемою, яка потребує більше ніж 5 хвилин для налагодження." - @Coder Цікаво, який тип додатків ви дивитесь.
Кірк Бродхерст

2

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

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

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


у вас є досвід роботи з мобільними додатками? що було б прийнятним співвідношенням тесту / розробки для простого мобільного додатка?
Меггі

@Maggie, на жаль, ні. (Отже, якщо мені потрібно було написати, я, мабуть, витратив би більше, ніж звичайний час, на тестування одиниць :-)
Péter Török
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.