Characterization Test
Test ghi lại HÀNH VI HIỆN TẠI của legacy code. Nó KHÔNG nói code đúng; nó chỉ nói: nếu refactor xong test vẫn pass thì hành vi cũ chưa bị đổi. Khái niệm lấy cảm hứng từ Working Effectively with Legacy Code (Michael Feathers).
Cách làm
Lấy dữ liệu thật từ production (đã anonymized), mỗi record gồm input + output hiện tại, rồi nhờ AI sinh test:
@Test
void characterization_case_001_subscription_v2_with_roaming() {
var input = loadFixture("case-001.json"); // production trace
var expected = loadFixture("case-001-expected.json"); // output HIỆN TẠI
var actual = calculator.calculate(input);
assertThat(actual).isEqualTo(expected);
}Ở billing-engine, Tâm lấy 50 record billing thật của tháng trước. “Năm mươi test này giống như năm mươi ảnh chụp.”
Vì sao quan trọng với brownfield
Với legacy, trước khi refactor bạn cần biết hành vi hiện tại là gì. Characterization test tạo lưới an toàn: refactor không đổi hành vi thì test vẫn xanh. Đôi khi chỉ cần biết “mình chưa làm đổi hành vi cũ” đã là bước tiến rất lớn.
Khác với AC test: AC test kiểm hành vi đúng theo spec; characterization test chỉ chốt hành vi đang chạy (kể cả sai) để refactor an toàn. Hai loại bổ sung nhau trong brownfield.
Liên quan
- Brownfield với SDD - bước 4 của chiến lược 5 bước
- Test-Protected - dạng test bám AC (khác mục đích)
- Reverse Engineering từ code - bước trước đó
- Big Bang Rewrite - thứ mà characterization test giúp tránh