Coverage — testlar dastur kodining qaysi qismi bajarilganini o‘lchaydigan ko‘rsatkichlar to‘plami. Ko‘pincha code coverage deb ataladi. Coverage testlar mavjudligini ko‘rsatadi, ammo testlarning sifati yoki to‘g‘ri assertion yozilganini avtomatik isbotlamaydi.
Masalan, kod qatori test vaqtida bajarilgan bo‘lishi mumkin, lekin natija umuman tekshirilmagan bo‘lsa ham line coverage oshadi.
Line coverage
Test bajarilishida source kod qatorlarining qanchasi ishlaganini ko‘rsatadi.
Formula soddalashtirib:
bajarilgan qatorlar / instrument qilingan qatorlar
Comment, bo‘sh qator va ayrim declarationlar hisobga olinmasligi mumkin.
Toollar bir xil source uchun boshqa natija berishi ehtimoli bor.
Statement coverage
Dastur statementlarining qanchasi bajarilganini o‘lchaydi.
Bir qatorda bir nechta statement bo‘lsa line coverage va statement coverage farq qilishi mumkin.
Minified yoki generated kodda mapping source mapga bog‘liq.
Branch coverage
Shartning barcha yo‘nalishlari bajarilganini tekshiradi.
Masalan:
if active:
allow
else:
deny
Line’lar bajarilgan bo‘lsa ham else yo‘li tekshirilmagan bo‘lishi mumkin.
Branch coverage buni ko‘rsatadi.
Condition coverage
Murakkab boolean expression ichidagi har alohida shart true va false bo‘lganini o‘lchaydi.
Masalan:
if is_admin or is_owner
Umumiy branch true va false bo‘lsa ham is_ownerning alohida ta’siri test qilinmagan bo‘lishi mumkin.
Function coverage
Function yoki methodlarning qanchasi kamida bir marta chaqirilganini ko‘rsatadi.
Function ichidagi barcha branchlar test qilinganini anglatmaydi.
Faqat chaqirish uning natijasi to‘g‘ri tekshirilganini ham bildirmaydi.
Path coverage
Programmadagi mumkin bo‘lgan control-flow yo‘llarni qamrashga intiladi.
Loop va ko‘p shartlar sabab yo‘llar soni juda tez ko‘payadi.
To‘liq path coverage ko‘p real dasturda amaliy emas.
Muhim va xavfli yo‘llar tanlab test qilinadi.
Instrumentation
Coverage tool kodga counter yoki hook qo‘shadi.
Test vaqtida qaysi qator va branch bajarilgani yoziladi.
Instrumentation performance’ni sekinlashtirishi mumkin.
Release binary coverage build bilan aynan bir xil bo‘lmasligi ehtimoli bor.
Source map
Transpiled TypeScript, Kotlin, minified JavaScript yoki generated code original source’ga map qilinadi.
Source map noto‘g‘ri bo‘lsa coverage noto‘g‘ri qatorga yoziladi.
Generated fayllarni reportdan chiqarish mumkin.
Coverage report
Report odatda:
ni ko‘rsatadi.
HTML report developerga qizil-yashil belgilangan source ko‘rsatishi mumkin.
Threshold
CI minimal coverage talabini belgilashi mumkin:
line >= 80%
branch >= 70%
Threshold regressiyani oldini oladi.
Ammo jamoa faqat raqamni ko‘tarish uchun ma’nosiz test yozmasligi kerak.
Muhim modul uchun yuqoriroq talab bo‘lishi mumkin.
Global va diff coverage
Global coverage butun repository’ni o‘lchaydi.
Legacy projectda uni tez oshirish qiyin.
Diff coverage faqat yangi yoki o‘zgargan qatorlarning qamrovini tekshiradi.
Bu yangi code sifati pasaymasligini ta’minlashga yordam beradi.
100 foiz coverage
100% line coverage barcha buglar topilganini anglatmaydi.
Quyidagilar hali mavjud bo‘lishi mumkin:
- noto‘g‘ri assertion;
- boundary case;
- concurrency;
- performance;
- integration;
- security;
- requirements xatosi.
Coverage — signal, yakuniy maqsad emas.
False confidence
Test methodni chaqiradi, lekin assert true bilan tugaydi.
Coverage yuqori, foyda past.
Mutation testing koddagi shartni ataylab o‘zgartirib, test bu xatoni topadimi, tekshiradi.
Bu coverage sifatini kuchliroq baholaydi.
Qoplanmagan kod
Har uncovered qator bir xil muhim emas.
Misollar:
- error handling;
- rare branch;
- defensive code;
- platform-specific code;
- generated code;
- unreachable code.
Error branch ko‘pincha kam ishlaydi, ammo juda muhim.
Exclusion
Generated file, migration yoki platform shim coverage’dan chiqarilishi mumkin.
Exclusion aniq sabab bilan configurationda yoziladi.
Test qilish qiyin kodni shunchaki exclude qilish coverage’ni sun’iy yaxshilaydi.
Integration coverage
Unit test coverage faqat bir test turiga tegishli bo‘lishi mumkin.
Integration va E2E test natijalari bilan merge qilinsa kengroq ko‘rinish olinadi.
Turli process va containerlardan coverage file yig‘ish qo‘shimcha konfiguratsiya talab qiladi.
Backend service
Request service ichidagi ko‘p qatorni bajaradi.
Ammo external database yoki queue boshqa processda bo‘lsa ularning coverage’i alohida yig‘iladi.
Subprocess shutdowndan oldin coverage data diskka yozilishi kerak.
Frontend coverage
Browser test JavaScript bundle’ni instrument qilishi mumkin.
Lazy chunk ochilmasa uning qatorlari qoplanmaydi.
Source map original TypeScript yoki component fayliga report beradi.
Browser extension va third-party scriptlar chiqarib tashlanadi.
Trend
Coverage bir martalik raqam emas, vaqt bo‘yicha trend sifatida ko‘riladi.
Yangi feature bilan branch coverage pasaysa review talab qilinadi.
Foiz o‘zgarmasa ham muhim module qoplanmagan bo‘lishi mumkin.
Directory va risk bo‘yicha report foydali.
Test dizayni
Coverage report test yozish uchun xarita beradi, ammo qaysi behaviorni tekshirish kerakligini requirements va risk belgilaydi.
Avval business rule, boundary va failure mode aniqlanadi.
Keyin coverage qolgan ko‘r nuqtalarni topishga yordam beradi.
Mutation score
Mutation testing operatorni almashtirish, shartni teskarilash yoki return qiymatini o‘zgartirish kabi sun’iy xatolar kiritadi. Test shu mutantni yiqitsa u “o‘ldirilgan” hisoblanadi. Yuqori line coverage, ammo past mutation score assertionlar kuchsizligini ko‘rsatishi mumkin.
Risk bo‘yicha coverage
Authentication, payment va migration kabi kritik module uchun branch coverage maqsadi yuqoriroq bo‘lishi mumkin. Generated UI wrapper yoki trivial mapping uchun bir xil talab qo‘yish resursni noto‘g‘ri taqsimlaydi.
Bog‘liq tushunchalar
Code coverage, Line coverage, Branch coverage, Condition coverage, Function coverage, Instrumentation, Coverage threshold, Mutation testing, Test quality, CI