Asosiy kontentga o‘tish
Innovialabs

Kodni testlar bilan qamrab olish nima va u qanchalik kerak

Asoslar4 daq

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

TurNima hisoblanadiZaif joyi
Satr bo‘yicha (statement)Har bir bajarilgan satrif 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 yuborishShartlarning barcha kombinatsiyalarini tekshirmaydi
Funksiya bo‘yichaHar bir funksiya kamida bir marta chaqirilganBitta 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 pytest ni ishga tushiring, so‘ng coverage report yoki coverage html. pytest bilan pytest-cov plagini pytest --cov=src --cov-branch ni beradi.
  • JavaScript va TypeScript — Istanbul va c8. Istanbul (nyc orqali) kodni instrumentlaydi; c8 V8 dvigateliga o‘rnatilgan qamrovdan foydalanadi. Jest da o‘rnatilgan --coverage bor, 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 -cover bor, .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

  1. Har bir pull request da testlarni qamrov bilan ishga tushiring va hisobotni yig‘ish artefakti sifatida saqlang.
  2. Chegaradan past bo‘lsa, yig‘ishni to‘xtating. coverage.py da --fail-under, Jest da coverageThreshold, c8 da --check-coverage, JaCoCo da qoidalar bilan check maqsadi bor.
  3. O‘zgartirilgan kod qamrovini tekshiring. Eng amaliy qoida: yangi va o‘zgartirilgan satrlar qamrab olingan bo‘lishi kerak. diff-cover kabi vositalar yoki kod-ryuvyu integratsiyalari buni to‘g‘ridan-to‘g‘ri pull request da ko‘rsatadi.
  4. Foizga emas, qamrab olinmagan satrlarga qarang. Hisobotning haqiqiy qiymati — hech kim tekshirmagan tarmoqlarni ko‘rsatish.
  5. 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

Ko‘p beriladigan savollar

U qat’iyroq va foydaliroq. U satr bo‘yicha qamrov yashiradigan tekshirilmagan qaror yo‘llarini ko‘rsatadi va ko‘pchilik vositalarda bitta flag bilan yoqiladi.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.