Mutation testing — testlar xatoni aniqlash kuchini baholash uchun production kodga kichik sun’iy o‘zgarishlar kiritib, test suite ularni ushlaydimi-yo‘qmi tekshiradigan usul. Har o‘zgartirilgan variant mutant deyiladi. Test yiqilsa mutant “o‘ldirilgan”, barcha test o‘tsa “tirik qolgan” hisoblanadi.
Mutatorlar
Mutator real dasturlash xatolariga o‘xshash lokal o‘zgarish qiladi: >ni >=ga, +ni -ga, trueni falsega almashtiradi yoki method chaqiruvini olib tashlaydi. Bir mutantda odatda bitta o‘zgarish bo‘ladi, shunda failure sababi tushunarli.
| Mutator | Misol |
|---|---|
| Boundary | x > 10 → x >= 10 |
| Arithmetic | a + b → a - b |
| Negation | enabled → !enabled |
| Return | qiymat → null yoki default |
| Statement removal | side effect chaqiruvini olib tashlash |
Haddan tashqari g‘ayritabiiy mutantlar signalni pasaytiradi. Tool til va domain uchun foydali operatorlar to‘plamini tanlaydi.
Mutation score
Mutation score odatda o‘ldirilgan mutantlar sonining test qilinishi mumkin bo‘lgan mutantlarga nisbatidir. Compile bo‘lmagan mutantlar hisobdan chiqariladi. Equivalent mutant xatti-harakatni o‘zgartirmaydi va hech bir test uni o‘ldira olmaydi; uni aniqlash qiyin.
100% score mutlaq correctness isboti emas. Mutatorlar cheklangan xato sinfini modellashtiradi. Past score esa covered koddagi assertion yoki test data kuchsizligini ko‘rsatishi mumkin.
Coverage bilan farqi
Code coverage qator bajarilganini ko‘rsatadi. Mutation testing qatorning xatti-harakati o‘zgarsa test buni sezadimi, deb so‘raydi. Test functionni chaqirib, resultni tekshirmasa line covered, ammo return mutantlari tirik qoladi.
Coverage mutation testingni tezlashtiradi: mutant faqat uni qamragan testlar bilan bajariladi. Uncovered koddagi mutant “no coverage” sifatida alohida ko‘rsatiladi.
Jarayon
Tool avval original test suite o‘tishini tasdiqlaydi. So‘ng mutant yaratadi, ta’sirlangan testlarni bajaradi va natijani qayd etadi. Timeout mutant infinite loop yoki juda sekin yo‘l yaratganini bildirishi mumkin va odatda killed sifatida tasniflanadi.
Har mutant uchun butun suite’ni ishlatish qimmat. Incremental cache, test impact analysis, parallel worker va changed-code scope vaqtni kamaytiradi. CI’da pull request mutation, tungi run’da to‘liq scan ishlatilishi mumkin.
Tirik qolgan mutant
Survived mutant uch sababdan biri bo‘lishi mumkin: test input o‘sha yo‘lni farqlamadi, assertion natijani tekshirmadi yoki mutant equivalent. Avval mutantning observable behavior’ni haqiqatan o‘zgartirishi aniqlanadi. Keyin biznes ma’noli test qo‘shiladi.
Mutantni o‘ldirish uchun implementation detailga bog‘langan sun’iy test yozish maqsad emas. Agar o‘zgarish public xatti-harakatga ta’sir qilmasa, kodning o‘zi ortiqcha yoki mutator mos emas bo‘lishi mumkin.
Equivalent mutant
x * 1ni boshqa teng ifodaga almashtirish yoki unreachable branchdagi o‘zgarish natijani o‘zgartirmaydi. Umumiy holda equivalence’ni avtomatik aniqlash qiyin. Tool compiler optimizatsiyasi, static analysis va heuristic bilan ayrimlarini chiqaradi.
Ko‘p equivalent mutant review vaqtini oshirsa muayyan mutator o‘chiriladi yoki kod regioni exclusion qilinadi. Exclusion sababi hujjatlashtiriladi.
Qo‘llanish chegarasi
Generated code, trivial DTO va juda sekin integration boundary mutation uchun qimmat bo‘lishi mumkin. Kritik calculation, parser, authorization va state transition yuqori qiymat beradi. Mutation score modul riski bilan talqin qilinadi.
Regression to‘plami
Muhim tirik mutant uchun qo‘shilgan test keyingi runlarda oddiy regression test sifatida ham qoladi. Test faqat mutant operatorini nishonga olmay, buzilgan biznes xatti-harakatini aniq ifodalaydi. Shunda tool yoki mutatorlar to‘plami almashsa ham testning mustaqil qiymati saqlanadi.
Bog‘liq tushunchalar
Code coverage, Test quality, Mutant, Equivalent mutant, Assertion, Test impact analysis, Fault injection