Characterization test — hujjati yoki testlari yetarli bo‘lmagan mavjud tizimning hozirgi xatti-harakatini qayd etadigan avtomatik test. Uning dastlabki maqsadi behavior ideal yoki to‘g‘ri ekanini tasdiqlash emas, kodni o‘zgartirishdan oldin amaldagi natijani ko‘rinadigan contractga aylantirishdir. U legacy kodni xavfsiz refactor qilishda ishlatiladi.
Jarayon
Avval o‘zgartiriladigan boundary tanlanadi. Real input bilan tizim bajarilib actual output kuzatiladi. Test shu natijani expected sifatida qayd etadi va mavjud kodda yashil bo‘ladi. Keyin refactor yoki kichik feature davomida kutilmagan farqni ko‘rsatadi.
- Muhim use case va boundary aniqlanadi.
- Dependency hamda side effect nazoratga olinadi.
- Hozirgi output yozib olinadi.
- Output tushunilib, maxfiy va nondeterministik qism tozalanadi.
- Test regression safety net sifatida ishlatiladi.
Actual natijani ko‘r-ko‘rona snapshot qilish xatoni ham muzlatishi mumkin. Har qayd etilgan xususiyatning biznes ahamiyati ko‘riladi.
Golden va snapshot
Katta parser outputi, HTML yoki report golden file’da saqlanishi mumkin. Keyingi run semantic yoki textual diff bilan solishtiriladi. Timestamp, random ID va absolute path canonical formatga keltiriladi.
Juda katta snapshotdagi kichik muhim farq reviewda yo‘qoladi. Output mantiqiy qismlarga bo‘linadi yoki strukturaviy comparator field pathlarni ko‘rsatadi. Har run’da “update snapshot” qilish testni ma’nosiz qiladi.
Seam yaratish
Legacy function global clock, filesystem va networkga qattiq bog‘langan bo‘lishi mumkin. Seam dependency’ni testda almashtirish mumkin bo‘lgan nuqtadir. Wrapper, dependency injection, link seam yoki subprocess boundary orqali tashqi ta’sir nazorat qilinadi.
Seam yaratishning o‘zi behaviorni o‘zgartirmasligi kerak. Avval eng tashqi characterization test, so‘ng ichki refactor bilan kichikroq unit testlar paydo bo‘ladi.
Qamrov tanlovi
Butun legacy tizimni birdan testlash qimmat. O‘zgartiriladigan modul, yuqori defect tarixi va biznes kritik oqim ustuvor bo‘ladi. Production log va usage telemetry real input sinflarini topishga yordam beradi; maxfiy ma’lumot test fixture’ga nusxalanmaydi.
| Test darajasi | Foydasi |
|---|---|
| End-to-end characterization | Keng behaviorni tez muzlatadi |
| API boundary | Tashqi contractni qayd etadi |
| Component | Sababni aniqroq ajratadi |
| Unit | Tez va nozik, lekin seam talab qiladi |
Keng testdan boshlab refactor bilan ichkariga yaqinlashish mumkin.
Defect behavior
Hozirgi xatti-harakat ma’lum defect bo‘lsa uni “to‘g‘ri” expected sifatida doimiy saqlash kerak emas. Avval test defectni aniq reproduksiya qiladi va hozir qizil bo‘lishi yoki “known behavior” sifatida vaqtincha belgilanishi mumkin. Fix bilan yangi expected requirementga moslanadi.
Ba’zi consumer bugga bog‘langan bo‘lishi mumkin. Behaviorni o‘zgartirish backward compatibility va migrationni talab qiladi. Characterization test ta’sirni ko‘rsatadi, qarorni o‘zi bermaydi.
Nondeterminism
Real vaqt fake clock bilan, random seed fixed generator bilan, tashqi endpoint fake server bilan boshqariladi. Collection tartibi contract bo‘lmasa sort qilinadi. Biroq barcha farqni olib tashlash muhim behaviorni yashirishi mumkin.
Concurrency behaviorini characterization qilish takroriy run va invariantlarni talab qiladi; bitta snapshot timingning tasodifiy namunasini saqlab qolishi mumkin.
Keyingi rivojlanish
Refactoringdan so‘ng keng characterization testlar sekin va redundant bo‘lib qolishi mumkin. Ularning kritik contract qismi saqlanadi, ichki holatlar maqsadli unit va integration testlarga ko‘chiriladi. Test ownership va maqsadi hujjatda aniq qoladi.
Bog‘liq tushunchalar
Legacy code, Golden file, Snapshot testing, Regression testing, Seam, Refactoring, Test oracle