Оцінка того, чи слід писати тестовий блок або тести інтеграції спочатку на проекти синього неба / прототип


11

Щось я помітив останнім часом, коли я роблю такі проекти:

  • При початку проекту
  • Робота над MVP / прототипом
  • Додавання функцій, які не повністю визначені
  • Робота над меншим масштабом проекту

Для довідки, я зараз працюю над проектом Python, який наразі має ~ 1k рядків коду, включаючи деякі коментарі та весь пробіл.

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

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

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


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

@FrankHileman дійсно, це мій підхід. Але оскільки мені цікаво, я хочу переконатися, що я роблю правильний підхід, якщо я щось пропускаю.
Ендерленд

Спершу зосередьтесь на технічних характеристиках: безкодова частина. Які інваріанти системи? Роблячи це, вам може здатися, що вам потрібно спочатку з'ясувати низький чи перший. Це залежить, де розташовані найбільш критичні або ризиковані алгоритми. Спробуйте спочатку вийти з них. Це основне управління ризиками.
Френк Хілеман

1
У разі роботи над прототипом нормально взагалі не писати тестів. Мета прототипу - перевірити робочу ідею. Впровадження прототипу допоможе розпізнати очікувану конструкцію програми.
Фабіо

Це називається зовнішнім розвитком. Ви можете перевірити наступну книгу, яка робить саме це: amazon.com/dp/0321503627
Eternal21

Відповіді:


7

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

Ні. Ти прекрасно працюєш.

Дві великі цілі TDD:

  • Визначення інтерфейсів фактичним використанням, а не внутрішньою реалізацією 1
  • Максимізація покриття тестом

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

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

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


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

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


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


1

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

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

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

Це сказало

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

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

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

Майкл Перо: Набір правил тестування одиниць

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

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

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