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
Обмежений prompt для characterization
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

  1. Сформулюйте словами поведінку, яку потрібно захистити.
  2. Додайте один-два вузькі тести.
  3. Запустіть їх на поточній реалізації.
  4. Виконайте одну невелику структурну зміну.
  5. Запустіть characterization і основний harness.
  6. Перевірте diff і лише після цього створюйте коміт.

Коли characterization недостатня

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

Канонічне джерело уроку · JavaRush

Відкрити матеріал JavaRush