Code Coverage (kod qamrovi) — testlash vaqtida dasturning manba kodining necha foizi bajarilishini koʻre Satadigan koʻre Satkichdir. Testlar sifatini aniqlashga, tekshirilmagan hududlarni topishga va yangi testlar yozish ustuvorligini belgilashga yordam beradi. Atlassian, 2025 maʻlumotlariga koʻre, optimal qamrov darajasi 70–80% ni tashkil qiladi — bu chegaradan yuqori test xarajatlari foydadan oshib keta boshlaydi.
Asosiy maʻlumotlar
Code Coverage (kod qamrovi) — testlar davomida dastur manba kodining qaysi qismi bajarilganligini aniqlaydigan miqdoriy koʻre Satkichdir. Foizlarda ifodalanadi va bajarilgan qatorlar/shaxobchalar sonining umumiy songa nisbati sifatida hisoblanadi. Yuqori qamrov xatolarning yoʻqligini kafolatlamaydi, lekin oʻrtkazib yuborilgan xatolar xavfini kamaytiradi.
Kod qamrovi jamoaga yordam beradi: kodning sinovdan oʻrtmagan qismlarini topish, test yozish ustuvorligi haqida qaror qabul qilish, CI/CDda test sifati dinamikasini kuzatish. Mobil ishlab chiqishda qamrov, ayniqsa, biznes mantigʻi, maʻlumot modellari va depozitariylar uchun muhimdir — xatolik ehtimoli eng yuqori boʻlgan qatlamlar.
Keng tarqalgan afsona: “100% qamrov = ideal sifat”. Amalda 100% qamrovga juda kam erishiladi va koʻpincha yuzaki testlar evaziga. Samarali qamrov — foiz uchun poyga emas, balki muhim yoʻre llar va chegara shartlarining strategik qamrovidir. Qamrov testlarning sifati haqida hech narsa demaydi: test oʻtishi mumkin, ammo natijaning toʻgʻriligini tekshirmasligi mumkin.
Code Coverage-ning bir nechta koʻre Satkichlari mavjud, ularning har biri testlashning turli jihatlarini ölchaydi. Line coverage (qator qamrovi) — bajarilgan kod qatorlari foizini koʻre Satadigan eng sodda koʻre Satkich. Branch coverage (shaxobcha qamrovi) if-else va switch shaxobchalarining qaysi biri test qilinganligini ölchaydi.
Line coverage har bir manba kod qatorini bajarilgan yoki bajarilmagan deb hisoblaydi. Agar qatorda shartli operator yoki sikl boʻlsa, qator bajarilgan deb hisoblanadi, agar boshqaruv unga etib kelgan boʻlsa, hatto barcha shaxobchalar ishlanmagan boʻlsa ham. Bu eng kam qattiq koʻre Satkich, ammo vizual baholash uchun eng tushunarli.
Branch coverage koddagi barcha mumkin boʻlgan shaxobchalarning test qilinganligini baholaydi. Har bir if-else uchun ikkala shaxobcha hisobga olinadi: true va false. Switch uchun — har bir case. Branch coverage line coverage-dan qattiqroq koʻre Satkich hisoblanadi va koʻpincha tekshirilmagan stsenariylarni aniqlaydi.
| Koʻre Satkich | Nimani ölchaydi | Erishish qiyinligi |
|---|---|---|
| Line | Bajarilgan kod qatorlari foizi | Past |
| Branch | Bajarilgan shaxobchalar foizi (if/else, switch) | Oʻrrta |
| Function | Chaqirilgan funksiya va metodlar foizi | Past |
| Condition | Mantiqiy ostli ifodalar foizi (&&, ||) | Yuqori |
Path coverage — funksiyadagi barcha mumkin boʻlgan shaxobcha kombinatsiyalarini tekshirishni talab qiladigan eng qattiq koʻre Satkichdir. Amalda path coverage kamdan-kam qoʻllaniladi, chunki kombinatsiyalar soni eksponensial ravishda oʻsadi: 10 shaxobchali funksiyaning 1024 mumkin boʻlgan yoʻre li bor.
Mobil ishlab chiqishda platformaga qarab Code Coverage-ni ölchash uchun turli vositalar qoʻllaniladi. Android uchun standart JaCoCo (Java Code Coverage) hisoblanadi, u Gradle bilan integratsiyalanadi va ham birlik testlarini, ham instrumental testlarni qoʻllab-quvvatlaydi. iOS uchun Xcode-ga oʻrnatilgan XCCov ishlatiladi.
JaCoCo HTML, XML va CSV formatlarida hisobotlar yaratadi. HTML hisobot qatorlarni vizual ravishda ajratib koʻre Satadi: yashil — bajarilgan, qizil — oʻrtkazib yuborilgan, sariq — qisman bajarilgan. XML hisoboti SonarQube va boshqa kod tahlil tizimlari bilan mos keladi. JaCoCo sinflarni filtrlashni qoʻllab-quvvatlaydi: generated-kod, databinding, BuildConfig chiqarib tashlanishi mumkin.
// build.gradle — JaCoCo sozlamasi
android {
buildTypes {
debug {
testCoverageEnabled = true
}
}
}
// JaCoCo hisobotini yaratish
task jacocoTestReport(type: JacocoReport) {
dependsOn 'testDebugUnitTest'
reports {
xml.enabled = true
html.enabled = true
}
}
XCCov — kod qamrovini ölchash uchun Xcode-ning oʻrnatilgan vositasi. Test sxemasidagi Gather coverage data orqali faollashtiriladi. XCCov Swift va Objective-C uchun qamrovni qoʻllab-quvvatlaydi, .xccovreport formatida hisobotlar yaratadi va CI bilan xcodebuild -enableCodeCoverage YES orqali integratsiyalanadi. Maʻlumotlar konsolda koʻre Satiladi va JSON-ga eksport qilinishi mumkin.
Markazlashtirilgan qamrov monitoringi uchun platformalardan foydalaniladi: SonarQube (kod sifati tahlili + qamrov), Codecov va Coveralls. Ushbu xizmatlar JaCoCo va XCCov-dan maʻlumotlarni toʻplaydi, trendlarni, Quality Gate-ni va GitHub/GitLab bilan PR sharhlari orqali integratsiyani koʻre Satadi.
Code Coverage-ni oshirish tizimli yondashuvni talab qiladi: foizni “urish” emas, balki xatarlarni yopish. Birinchi qadam JaCoCo yoki XCCov hisobotini tahlil qilish — qizil (qamrab olinmagan) sinflarni aniqlash. Ustuvorlik: biznes mantigʻi → depozitariylar → ViewModel → UI komponentlari.
Test-Driven Development (TDD) avtomatik ravishda yuqori qamrovni taʻminlaydi, chunki testlar amalga oshirishdan oldin yoziladi. Jarayon: qizil (muvaffaqiyatsiz test yozish) → yashil (minimal kod yozish) → refaktorlash. TDD dasturchilarni intizomga soladi, chegara holatlari va koʻpincha testsiz qoladigan istisno vaziyatlarni qamrab olishga majbur qiladi.
Bitta parametrlashtirilgan test oʻnlab oddiy testlarni almashtiradi. JUnit va XCTest parametrlashni qoʻllab-quvvatlaydi: JUnit 5 da @ParameterizedTest, XCTest da XCTestCase bilan testPerformanceExample. Parametrlash kod takrorlanmasdan koʻplab kirish maʻlumotlarini tekshirish imkonini beradi, bu esa shaxobcha va shart qamrovini sezilarli darajada kengaytiradi.
// Kotlin bilan JUnit 5 da parametrlashtirilgan test
@ParameterizedTest
@ValueSource(strings = ["user@test.com", "admin@test.com", "test@example.com"])
fun `validate email returns true for valid addresses`(email: String) {
val result = EmailValidator.isValid(email)
Assertions.assertTrue(result)
}
Eng keng tarqalgan xato — test sifatini tahlil qilmasdan foiz uchun poyga. Jamoa testlar uchun test yozishni boshlaydi: getter va setterlarni tekshiradi, turli darajalarda qamrovni takrorlaydi, ahamiyatsiz metodlarni test qiladi. Bu yuqori foiz beradi, ammo haqiqiy sifatni oshirmaydi.
Yuqori Code Coverage dastur yaxshi test qilingan degan yolgʻon taassurot yaratishi mumkin. Test kod qatorini bajarishi mumkin, ammo natijaning toʻgʻriligini tekshirmasligi mumkin. Masalan: test chegirma hisoblash metodini chaqiradi, ammo miqdorni tekshirmaydi — qator bajarilgan, qamrov oʻsadi, ammo xato topilmagan.
Odatiy xato — faqat “omadli yoʻre l” (happy path) ni test qilish va chegara holatlarini eʻtiborsiz qoldirish: boʻsh roʻyxatlar, null qiymatlar, maksimal sonlar, notoʻgʻri formatlar. Xatolarning aksariyati aynan chegaralarda va istisnolarda yuz beradi. Branch coverage oʻrtkazib yuborilgan shaxobchalarni aniqlashga yordam beradi, ammo chegara qiymatlarini tekshirishni kafolatlamaydi.
Mutation Testing — manba kodiga mutatsiyalar (sunʻiy xatolar) kiritiladigan va testlarning muvaffaqiyatsiz boʻlishi tekshiriladigan test sifatini baholash usulidir. Pitest — Java va Kotlin uchun mashhur mutation testing vositasi. Agar testlar mutatsiyada muvaffaqiyatsiz boʻlmasa — bu ular ushbu shartni tekshirmayotganligini anglatadi.
Pitest mutantlar yaratadi — manba kodining oʻzgartirilgan nusxalari, bunda, masalan, > >= bilan, true false bilan almashtirilgan yoki metod chaqiruvi oʻchirilgan. Keyin har bir mutant uchun testlar ishga tushiriladi. Agar testlar oʻtsa — mutant tirik qoldi, yaʻni testlar ushbu stsenariyni qamrab olmaydi. Agar testlar muvaffaqiyatsiz boʻlsa — mutant oʻldirilgan, test toʻgʻri.
// build.gradle — Pitest sozlamasi
plugins {
id 'info.solidsoft.pitest' version '1.15.0'
}
pitest {
targetClasses = ['com.example.app.*']
targetTests = ['com.example.app.*Test']
threads = 4
outputFormats = ['HTML', 'XML']
mutationThreshold = 80
coverageThreshold = 85
}
Pitest koʻplab mutatsiya turlarini qoʻllab-quvvatlaydi: shartli operatorlarni oʻzgartirish (== → !=, < → <=), metod chaqiruvlarini olib tashlash, qaytariladigan qiymatlarni almashtirish (true → false), arifmetik amallarni oʻzgartirish (+ → -), inkrementatsiya mutatsiyasi (i++ → i--). Qanchalik koʻp mutatsiya turlari testlar tomonidan oʻldirilsa, test toʻplami shunchalik ishonchli.
Maqsadli mutation score — 80% va undan yuqori. Bu sunʻiy xatolarning 80% testlar tomonidan aniqlanganligini anglatadi. Kod qamrovi (Code Coverage) 90% testlarning xatolarni topishini kafolatlamaydi — mutation testing obʻektivroq baho beradi. Pitest CI-ga Quality Gate sifatida integratsiyalanishi mumkin, mutation score chegaradan pastga tushganda yigʻmani bloklaydi.
CI/CD da Code Coverage-ni avtomatik nazorat qilish uchun Quality Gates — chegara qiymatlar qoʻllaniladi, buzilganda yigʻma beqaror deb belgilanadi yoki rad etiladi. SonarQube koʻre Satkichlar kombinatsiyasi asosida Quality Gate-ni sozlash imkonini beradi: qamrov (≥80%), xatolar soni, zaifliklar va takrorlangan kod.
GitHub Actions-da Code Coverage action qadamlari orqali integratsiyalanadi: qamrov bilan testlarni ishga tushirish → hisobotni Codecov-ga yuklash → chegarani tekshirish. Codecov avtomatik ravishda PR-ni qamrov diffi bilan sharhlaydi, qaysi qatorlar oʻzgarganini va bu umumiy foizga qanday taʻsir qilganini koʻre Satadi. Agar qamrov tushib ketgan boʻsa — qoʻshimcha testlar yozilgunga qadar PR bloklanadi.
# GitHub Actions — qamrovni Codecov-ga yuklash
- name: Run Tests with Coverage
run: ./gradlew testDebugUnitTest jacocoTestReport
- name: Upload to Codecov
uses: codecov/codecov-action@v4
with:
files: ./app/build/reports/jacoco/jacocoTestReport.xml
flags: unittests
fail_ci_if_error: true
- name: Check Coverage Threshold
run: |
coverage=$(grep -oP 'branchCoverage="\K[0-9.]+' report.xml)
if (( $(echo "$coverage < 80" | bc -l) )); then
echo "Coverage $coverage% is below 80% threshold"
exit 1
fi
JaCoCo va XCCov-ning HTML hisobotlari qamrovning vizual ajratilishini oʻrz ichiga oladi: yashil — bajarilgan qatorlar, qizil — bajarilmagan. SonarQube qoʻshimcha ravishda fayl, sinf, metod va qator darajasida qamrovni, shuningdek sprintlar boʻyicha qamrov oʻzgarishlari tarixini koʻre Satadi. Bu refaktorlash va test qoʻshish haqida qaror qabul qilishga yordam beradi.
Tez-tez beriladigan savollar
Mobil loyihalar uchun biznes mantigʻi uchun 70–80%, UI komponentlari uchun 50–60% qamrov yaxshi hisoblanadi. 80% dan yuqori test xarajatlari foydadan oshib keta boshlaydi. Foiz maqsad emas, balki koʻre Satkich ekanligini va turli modullar turli maqsadli darajalarga ega boʻlishi mumkinligini yodda tutish muhim.
Line Coverage nechta kod qatori bajarilganligini koʻre Satadi. Branch Coverage — nechta shaxobcha (if-else, switch) test qilinganligini. If qatori bajarilishi mumkin, ammo true shaxobchasi test qilingan, false esa — yoʻq. Branch Coverage qattiqroq va koʻproq oʻrtkazib yuborilgan stsenariylarni aniqlaydi.
CI/CD da qamrov Quality Gate orqali integratsiyalanadi: qamrov chegaradan past boʻlsa, yigʻma bloklanadi. Android uchun JaCoCo + SonarQube, iOS uchun xcodebuild -enableCodeCoverage bilan .xccovreport-ni pars qilish ishlatiladi. GitHub Actions Codecov uchun tayyor action-larga ega.
Ha, JaCoCo Jetpack Compose-ni JVM qamrovining standart mexanizmi orqali qoʻllab-quvvatlaydi. Biroq, Compose kodi JaCoCo toʻliq qamrab ololmaydigan koʻplab yaratilgan lambda ifodalarini oʻrz ichiga oladi. Yaratilgan compose kodini filtrlar orqali hisobotdan chiqarib tashlash tavsiya etiladi.
Soxta qamrov test kodni bajarganida, ammo natijani tekshirmaganda yuzaga keladi. Yechim: har bir muhim stsenariy uchun assert tekshiruvlari yozish, test sifatini tekshirish uchun mutation testing (Pitest) dan foydalanish, nafaqat foizni, balki qaysi shaxobchalar qamrab olinganligini ham tahlil qilish.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.