модульне тестування
Unit testing (юніт тестування або модульне тестування) - полягає в ізольованій перевірці кожного окремого елемента шляхом запуску тестів в штучному середовищі. Для цього необхідно використовувати драйвери і заглушки. Поелементне тестування - найперша можливість реалізувати вихідний код. Оцінюючи кожен елемент ізольовано і підтверджуючи коректність його роботи, точно встановити проблему значно простіше ніж, якби елемент був частиною системи.
Unit (Елемент) - найменший компонент, який можна скомпілювати.
Драйвери - модулі тестів, які запускають тестований елемент.
Заглушки - замінюють відсутні компоненти, які викликаються елементом і виконують такі дії:
- повертаються до елементу, не виконуючи ніяких інших дій;
- відображають трасувальні повідомлення і іноді пропонують тестеру продовжити тестування;
- повертають постійне значення або пропонують тестеру самому ввести значення, що повертається;
- здійснюють спрощену реалізацію якої бракує компоненти;
- Імітують виняткові або аварійні умови.
White-box testing. Для конструювання тестів використовуються внутрішня структура коду і керуюча логіка. При цьому існує ймовірність, що код буде перевірятися так, як він був написаний, а це не гарантує коректність логіки.
Black-box testing. Для конструювання тестів використовуються вимоги і специфікації ПО. недоліки:
- таким способом неможливо знайти взаимоуничтожаются помилок,
- деякі помилки виникають досить рідко (помилки роботи з пам'яттю) і тому їх важко знайти і відтворити
Стратегія модульного тестування
Модульне тестування є однією з ключових практик методології екстремального програмування. Прихильники XP наводять такі аргументи на захист цієї практики:
- Написання тестів допомагає увійти в робочий ритм
- Надає впевненість в працездатності коду.
- Дає запас міцності при подальшій інтеграції або зміни коду.
Згоден, входження в робочий ритм - благородне завдання. Впевненість в працездатності - теж добре. Але «впевненості в працездатності» я вважаю за краще дійсно працездатний код. Нехай навіть при цьому я не зовсім «впевнений».
Ключовий фактор при оцінці перспективності будь-якого методу - вартість проекту. Додаткова робота по створенню тестів, їх кодування і перевірці результатів вносить істотний внесок в загальну вартість проекту. І те, що продукт виявиться якіснішим не завжди переважує те, що він буде істотно дорожче.
На мій погляд, модульне тестування виправдано, якщо воно:
- Знижує час на налагодження
- Дає можливість пошуку помилок з меншими витратами, ніж при інших підходах
- Дає можливість дешевого пошуку помилок при змінах коду в подальшому
Сумарний виграш від застосування модульних тестів повинен бути більше, ніж витрати на їх створення і підтримання в актуальному стані.
Якщо в результаті виправлення помилок інтеграції змінюється вихідний код, в ньому з великою ймовірністю з'являються помилки. Якщо в результаті додавання нової функціональності змінюється вихідний код, в ньому з великою ймовірністю з'являються помилки. І шукати їх краще за допомогою раніше створених модульних тестів.
Мета модульного тестування:
Отримання працездатного коду з найменшими витратами. І його застосування виправдане тоді і тільки тоді, коли воно дає більший ефект, ніж інші методи.
Звідси випливає кілька висновків:
- Немає сенсу писати тести на весь код. Деякі помилки простіше знайти на більш пізніх стадіях. Так, наприклад, для ООП дане правило може звучати так: немає сенсу писати тести на клас, який використовується тільки одним класом. Ефективніше написати тести на викликає клас і створити тести тестуючі всі ділянки коду.
- Писатимуть тести для коду потенційно схильної змін вигідніше, ніж для коду, зміна якого не передбачається. Складна логіка змінюється частіше, ніж проста. Отже, в першу чергу має сенс писати модульні тести на складну логіку. А на просту логіку писати пізніше або взагалі тестувати іншими методами.
- Для того щоб якомога рідше змінювати тести слід добре планувати інтерфейси. Те ж саме можна сказати і стосовно написання вихідного коду. Дійсно, створення оптимальної архітектури часто визначає подальший хід проекту. І є оптимум, на якому етапі архітектура «досить хороша». Все так, але я хочу сказати про інше:
Якщо в проекті застосовується модульне тестування, то ретельне планування інтерфейсів стає більш вигідним. Впровадженню модульного тестування має передувати впровадження планування інтерфейсів.
планування тестів
Перше питання, яке постає перед нами: «Скільки потрібно тестів». Відповідь, яку часто дається: тестів має бути стільки, щоб не залишилося неоттестірованних ділянок. Можна навіть ввести формальне правило:
В першу чергу тести повинні відповідати не коду, а вимогам. Правило, яке слід застосовувати:
Тести повинні базуватися на специфікації.