Characterization test — знімок фактичної поведінки
Lightweight characterization — невеликий тест, який фіксує, що код робить зараз у конкретному сценарії перед рефакторингом. Він захищає вузьку ділянку від випадкової зміни, але не стверджує, що поточна поведінка правильна з бізнесового погляду.
Такий тест доповнює unit-, integration- і regression-тести, але не замінює їх.
| Коли доречно | Чому |
|---|---|
| Один метод або локальний flow | Область легко обмежити |
| Повний integration-test надто широкий | Потрібен дешевий safety net |
| Існує 1–2 ключові сценарії | Достатньо зафіксувати головні результати |
| Наявного покриття мало | Потрібен baseline перед структурною зміною |
Тестуйте observable behavior
- статус відповіді;
- код або причина помилки;
- повідомлення;
- зовнішній побічний ефект;
- іншу частину публічного результату.
Приклад для finalizeOrder
Тест викликає публічний finalizeOrder і перевіряє результат. Якщо helper під час рефакторингу буде перейменовано, обʼєднано або видалено, assertions мають залишитися актуальними.
| Сценарій | Очікуваний поточний результат |
|---|---|
| Оплата успішна, товар є на складі | Статус FINALIZED і відповідне повідомлення |
| Оплата успішна, залишок дорівнює нулю | Статус REJECTED і причина OUT_OF_STOCK |
Target: finalizeOrder
Scenarios: one successful and one boundary case
Add only 1-2 behavior tests.
Do not change production code.
Capture current behavior; do not call it business-correct. Цикл lightweight characterization
- Сформулюйте словами поведінку, яку потрібно захистити.
- Додайте один-два вузькі тести.
- Запустіть їх на поточній реалізації.
- Виконайте одну невелику структурну зміну.
- Запустіть characterization і основний harness.
- Перевірте diff і лише після цього створюйте коміт.
Коли characterization недостатня
- великий модуль із багатьма інтеграціями;
- черги, база даних і численні побічні ефекти;
- зміна охоплює кілька пакетів;
- оновлюється зовнішній контракт;
- одночасно змінюються бізнес-правила.
Канонічне джерело уроку · JavaRush
Відкрити матеріал JavaRush