Що насправді є одиничним тестом? І чи справді тут грає така велика дихотомія?
Ми працюємо в галузі, де читання буквально одного біта повз кінець буфера може повністю збіти програму або призвести до того, що вона отримає абсолютно неточний результат, або, як свідчить нещодавня помилка TLS "HeartBleed", закласти нібито безпечну систему відкрити, не пред'являючи жодних прямих доказів недоліку.
Усунути всю складність цих систем неможливо. Але наша робота полягає в тому, наскільки це можливо, мінімізувати та керувати цією складністю.
Чи є тест одиничного тесту, який підтверджує, наприклад, що бронювання успішно розміщено в трьох різних системах, створюється запис у журналі та надсилається підтвердження електронною поштою?
Я скажу ні . Це інтеграційний тест. І ті, хто, безумовно, мають своє місце, але вони теж інша тема.
Тест на інтеграцію працює для підтвердження загальної функції всієї "функції". Але код, що стоїть за цією функцією, повинен бути розбитий на прості, перевірені будівельні блоки, відомі також як "одиниці".
Отже, одиничний тест повинен мати дуже обмежений обсяг.
Що означає , що код протестований з допомогою модульного тестування повинен мати дуже обмежену сферу застосування.
Що далі означає, що один із стовпів хорошого дизайну - це розбити вашу складну проблему на більш дрібні, цільові деталі (наскільки це можливо), які можна перевірити у відносній ізоляції один від одного.
У кінцевому підсумку - це система, яка складається з надійних компонентів основи, і ви знаєте, чи хтось із цих основоположних одиниць коду ламається, тому що ви написали прості, невеликі тести з обмеженою сферою, щоб точно сказати вам це.
У багатьох випадках ви, ймовірно, повинні мати кілька тестів на одиницю. Самі тести повинні бути простими, тестуючи одну і лише одну поведінку, наскільки це можливо.
Поняття "одиничного тестування" тестування нетривіальної, складної, складної логіки, я думаю, трохи оксиморон.
Отже, якщо відбулося таке навмисне розбиття дизайну, то як у світі може несподівано тест одиниці почати виробляти помилкові позитиви, якщо основна функція тестованої кодової одиниці не змінилася? І якщо це сталося, то краще повірте, що в грі є якісь не очевидні ефекти пульсації. Ваш розбитий тест, той, який, здається, дає помилковий позитив, насправді попереджає вас про те, що якась зміна порушила ширше коло залежностей у кодовій базі, і його потрібно вивчити та виправити.
Деякі з цих підрозділів (багато з них), можливо, потрібно буде протестувати за допомогою макетних об'єктів, але це не означає, що вам потрібно писати більш складні або складні тести.
Повертаючись до мого надуманим наприклад системи бронювання, ви дійсно не можете посилати запити від до живої базі даних резервування або третьої сторони обслуговування (або навіть «Dev» примірнику цього) кожен раз , коли ви блок тестового коду.
Отже, ви використовуєте макети, які представляють один і той же контракт на інтерфейс. Потім тести можуть підтвердити поведінку відносно невеликого, детермінованого фрагмента коду. Після цього зелений колір вниз на дошці повідомляє вам, що блоки, які складають ваш фундамент , не порушені.
Але логіка самих одиничних тестів залишається максимально простою.