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