Дублери (англ. Test double) — спеціалізовані методи чи об'єкти, які використовуються при тестуванні систем, в яких виникає необхідність взаємодії з зовнішніми об'єктами, наприклад: бази даних, файлова система, мережеве з'єднання та тощо. При цьому дублер повинен реалізувати інтерфейс зовнішнього об'єкту та відповідати всім вимогам, які висуваються до реального об'єкта.

Випадки використання дублерів ред.

Використання дублерів доцільно в наступних випадках:

  1. Низька швидкість роботи з зовнішнім об'єктом;
  2. Необхідність запуску тестів незалежно від оточення та можливостей машини розробника;
  3. Необхідність роботи з реальними та чутливими до змін об'єктами;
  4. Складність перевірки коректності взаємодії між частинами;
  5. Та інші випадки, в яких виникає необхідність перевірки стану зовнішнього об'єкту, де це досить складно зробити з зовнішнього коду.

Згідно з Gerard Meszaros [Архівовано 15 лютого 2015 у Wayback Machine.] виділяються наступні типи Test Double:

  • Dummy;
  • Fake;
  • Stubs;
  • Mock;
  • Spy.

Dummy ред.

Dummy — це об'єкти, які передаються у метод, але насправді не використовуються, не проводяться ніякі зміни, не має поведінки, ніякі методи не викликаються. В загальному випадку це параметри методів (звісно, якщо вони не впливають на те що перевіряється). Це об'єкт, який необхідний для того щоб тест пройшов. Іноді це просто NULL, new object().

Fake ред.

Fake — це об'єкти, які мають внутрішню реалізацію, але зазвичай вона сильно урізана та їх не можна бути використана в кінцевому коді. Найяскравішим прикладом, де можуть використовуватися Fake, є бази даних.

Stubs ред.

Stubs (заглушка) — забезпечує жорстко визначену відповідь під час тестування. Використовуються для заміни об'єктів, які забезпечують SUT (system under testing) вхідними даними. При цьому ігноруються всі дані які можуть поступати з тестованого об'єкту.

Spy ред.

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

Mock ред.

Докладніше: Макет об'єкта

Mock — дуже схожий на тестового шпигуна, однак не записує послідовність викликів з переданими параметрами для подальшої перевірки, а може сам генерувати виключення, тобто mock може перевірити коректність поведінки об'єкту.

«The Art of Unit Testing» ред.

Roy Osherove в книзі «The Art of Unit Testing» пропонує спростити дану класифікацію та залишити всього три типи тестових об'єктів — Fakes, Stubs и Mocks. При умові, що Fake може бути як stub-ом, так і mock-ом, а тестовий шпигун стає mock-ом.

Джерела та література ред.