Kodni testlar bilan qamrab olish nima va u qanchalik kerak
Asoslar4 daqInnovialabs tahririyati
Qisqacha
Kod qamrovi testlar vaqtida kodning qaysi qismlari bajarilganini ko‘rsatadi, ular tekshirilganini emas; undan test qilinmagan joylarni topish, CI da yangi kod qamrovini talab qilish va 100% ortidan quvish o‘rniga mo‘tadil chegara qo‘yish uchun foydalaning.
Kod qamrovi nimani o‘lchaydi
Kod qamrovi (code coverage) — testlar ishlagan vaqtda bajarilgan kod ulushi. Vosita dasturni instrumentlaydi, testlarni ishga tushiradi va qaysi satrlar, tarmoqlar va funksiyalarga yetib borilganini xabar qiladi.
Asosiysi: qamrov nima bajarilganini ko‘rsatadi, nima tekshirilganini emas. Funksiyani bitta ham tekshiruvsiz (assert) chaqiradigan test ham qamrovni oshiradi.
Qamrovning asosiy turlari
| Tur | Nima hisoblanadi | Zaif joyi |
|---|---|---|
| Satr bo‘yicha (statement) | Har bir bajarilgan satr | if a and b satri shartlardan biri hech qachon yolg‘on bo‘lmagan bo‘lsa ham qamrab olingan hisoblanadi |
| Tarmoq bo‘yicha (branch) | Har bir qarorning har bir natijasi: if ning ikkala tomoni, har bir case, siklga kirish va uni o‘tkazib yuborish | Shartlarning barcha kombinatsiyalarini tekshirmaydi |
| Funksiya bo‘yicha | Har bir funksiya kamida bir marta chaqirilgan | Bitta chaqiruv chegaraviy holatlar haqida deyarli hech narsa demaydi |
Tarmoq bo‘yicha qamrov — kundalik ish uchun eng foydali metrika. U klassik bo‘shliqni ushlaydi: testlar yetib bormaydigan else tarmog‘i, xato ishlovchisi, erta return.
def discount(user):
if user.is_vip:
return 0.2
return 0.0
VIP foydalanuvchi bilan bitta test oxirgi satrni bajarilmagan holda qoldiradi va ikki tarmoqdan faqat bittasini qamrab oladi. Oddiy foydalanuvchi uchun test ikkala bo‘shliqni yopadi.
Ekotizimlar bo‘yicha vositalar
- Python — coverage.py.
coverage run --branch -m pytestni ishga tushiring, so‘ngcoverage reportyokicoverage html. pytest bilanpytest-covplaginipytest --cov=src --cov-branchni beradi. - JavaScript va TypeScript — Istanbul va c8. Istanbul (
nycorqali) kodni instrumentlaydi; c8 V8 dvigateliga o‘rnatilgan qamrovdan foydalanadi. Jest da o‘rnatilgan--coveragebor, Vitest esa V8 va Istanbul provayderlarini qo‘llab-quvvatlaydi. - Java va Kotlin — JaCoCo. Java-agent sifatida ishlaydi, Maven va Gradle ga ulanadi, satrlar, tarmoqlar va boshqa hisoblagichlarni sanaydi.
- Boshqalar. Go da
go test -coverbor, .NET da odatda Coverlet ishlatiladi, deyarli har bir tilda standart variant mavjud.
Ularning barchasi hisobotlarni keng tarqalgan formatlarda — Cobertura XML yoki LCOV da chiqara oladi, ularni CI servislari va kod-ryuvyu vositalari tushunadi.
Nega 100% qamrov chalg‘itadi
- Bajarish — tekshirish emas. Ma’noli assert siz testlar to‘liq qamrov beradi va hech narsani ushlamaydi.
- U yo‘q kodni ko‘rmaydi. Qamrov yozilgan narsani o‘lchaydi. Unutilgan validatsiya yoki ishlov berilmagan holatda qamrab olinadigan satrlar yo‘q.
- Kombinatsiyalar chetda qoladi. Har bir satr va tarmoqni qamrab olish mumkin, lekin kirish ma’lumotlarining aniq bir birikmasi baribir xato beradi.
- U ustuvorliklarni buzadi. Jamoa raqam uchun getterlar, generatsiya qilingan kod va oddiy o‘ramlarni test qila boshlaydi, murakkab mantiq esa yuzaki testlar oladi.
- Oxirida narx keskin oshadi. So‘nggi foizlar odatda chaqirish qiyin bo‘lgan xato yo‘llari bo‘lib, ularni ba’zan boshqa darajada tekshirgan ma’qul.
Yuqori qamrov — yaxshi testlarning tabiiy yon natijasi. O‘z-o‘zidan maqsad sifatida esa u noto‘g‘ri xatti-harakatni rag‘batlantiradi.
Oqilona chegaralar
Universal raqam yo‘q. Butun loyiha uchun bitta raqam o‘rniga qatlamlar bo‘yicha o‘ylang:
- Mo‘tadil umumiy chegara — yig‘ish undan pastga tushmasligi kerak, loyihaning hozirgi holatidan kelib chiqib tanlanadi. Ko‘p uchraydigan boshlang‘ich nuqta — taxminan 70–80%, loyihaga moslab.
- Muhim kod uchun yuqoriroq talablar: to‘lovlar, kirish huquqlari, ma’lumotlar migratsiyasi, biznes qoidalar.
- Bog‘lovchi kod uchun pastroq: konfiguratsiya, oddiy adapterlar, UI joylashuvi.
- Hisobga olinmasligi kerak bo‘lganini chiqarib tashlang: generatsiya qilingan fayllar, migratsiyalar, test yordamchilari. Istisnolar aniq bo‘lishi va ryuvyudan o‘tishi kerak.
- Asta-sekin ko‘taring. Qamrov o‘sgani sari chegarani oshiring, birdaniga katta maqsad qo‘ymang.
CI da qamrov
- Har bir pull request da testlarni qamrov bilan ishga tushiring va hisobotni yig‘ish artefakti sifatida saqlang.
- Chegaradan past bo‘lsa, yig‘ishni to‘xtating. coverage.py da
--fail-under, Jest dacoverageThreshold, c8 da--check-coverage, JaCoCo da qoidalar bilancheckmaqsadi bor. - O‘zgartirilgan kod qamrovini tekshiring. Eng amaliy qoida: yangi va o‘zgartirilgan satrlar qamrab olingan bo‘lishi kerak.
diff-coverkabi vositalar yoki kod-ryuvyu integratsiyalari buni to‘g‘ridan-to‘g‘ri pull request da ko‘rsatadi. - Foizga emas, qamrab olinmagan satrlarga qarang. Hisobotning haqiqiy qiymati — hech kim tekshirmagan tarmoqlarni ko‘rsatish.
- Boshqa signallar bilan birlashtiring. Mutatsion testlash, kod-ryuvyu va prodakshendagi xatolar testlar haqiqatan xatolarni ushlayaptimi, ko‘rsatadi.
# pyproject.toml
[tool.coverage.run]
branch = true
source = ["src"]
[tool.coverage.report]
fail_under = 75
show_missing = true