Code Coverage mobil inkişafda: bu nədir, metrikalar və necə ölçülür

Müəllif: IT Sectr Dərc olunub: 2026-04-09 Oxuma vaxtı: 9 dəq

Code Coverage (kodun əhatə olunması) — test zamanı proqramın mənbə kodunun neçə faizinin icra edildiyini göstərən metrikadır. Testlərin keyfiyyətini müəyyən etməyə, yoxlanılmamış sahələri aşkar etməyə və yeni testlərin yazılmasına prioritet verməyə kömək edir. Atlassian, 2025 məlumatlarına görə, optimal əhatə səviyyəsi 70–80% təşkil edir — bu həddən yuxarı test xərcləri faydanı üstələməyə başlayır.

Əsas məqamlar

  • Code Coverage — testlər tərəfindən icra edilən kodun faizini ölçən metrika
  • Əhatə metrikaları sətir (line), budaq (branch), funksiya, şərt və yolları əhatə edir
  • Alətlər: Android üçün JaCoCo, iOS üçün XCCov, kod analizi üçün SonarQube
  • Hədəf əhatəsi 70–80% — keyfiyyət və test xərcləri arasında balans
  • CI/CD inteqrasiyası əhatənin hədddən aşağı düşdükdə yığmaları bloklamağa imkan verir

Code Coverage nədir

Code Coverage (kodun əhatə olunması) — testlər zamanı proqramın mənbə kodunun hansı hissəsinin icra edildiyini müəyyən edən kəmiyyət metrikasıdır. Faizlə ifadə olunur və icra edilən sətirlərin/budaqların sayının ümumi sayına nisbəti kimi hesablanır. Yüksək əhatə səhvlərin olmamasına zəmanət vermir, lakin buraxılmış xətalar riskini azaldır.

Əhatəni niyə ölçməli

Kodun əhatəsi komandaya kömək edir: kodun sınaqdan keçirilməmiş sahələrini tapmaq, test yazma prioritetləri haqqında qərarlar qəbul etmək, CI/CD-də test keyfiyyətinin dinamikasını izləmək. Mobil inkişafda əhatə xüsusilə biznes məntiqi, məlumat modelləri və depozitoriyalar üçün vacibdir — xəta ehtimalının ən yüksək olduğu təbəqələr.

Code Coverage haqqında miflər

Geniş yayılmış mif: “100% əhatə = ideal keyfiyyət”. Təcrübədə 100% əhatəyə olduqca nadir hallarda nail olunur və çox vaxt səthi testlər bahasına başa gəlir. Effektiv əhatə — faiz uğrunda yarış deyil, kritik yolların və sərhəd şərtlərinin strateji əhatəsidir. Əhatə testlərin keyfiyyəti haqqında heç nə demir: test keçə bilər, lakin nəticənin düzgünlüyünü yoxlamaya bilər.

Kodun əhatə metrikaları

Code Coverage-in bir neçə metrikası mövcuddur, hər biri testlərin müxtəlif aspektlərini ölçür. Line coverage (sətirlərin əhatəsi) — icra edilmiş kod sətirlərinin faizini göstərən ən sadə metrikadır. Branch coverage (budaqların əhatəsi) if-else və switch budaqlanmalarının hansının test edildiyini ölçür.

Xətti əhatə (Line Coverage)

Line coverage hər bir mənbə kod sətirini icra edilmiş və ya edilməmiş kimi hesablayır. Əgər sətirdə şərti operator və ya dövr varsa, sətir icra edilmiş sayılır, əgər idarəetmə ona çatıbsa, hətta bütün budaqlar işlənməsə belə. Bu ən az sərt metrikadır, lakin vizual qiymətləndirmə üçün ən anlaşıqlıdır.

Budaqların əhatəsi (Branch Coverage)

Branch coverage koddakı bütün mümkün budaqlanmaların test edilib-edilmədiyini qiymətləndirir. Hər bir if-else üçün hər iki budaq nəzərə alınır: true və false. Switch üçün — hər bir case. Branch coverage line coverage-dan daha sərt metrika hesab olunur və daha tez-tez yoxlanılmamış ssenariləri aşkar edir.

MetrikaNə ölçürƏldə etmə çətinliyi
Lineİcra edilmiş kod sətirlərinin faiziAşağı
Branchİcra edilmiş budaqlanmaların faizi (if/else, switch)Orta
FunctionÇağrılmış funksiya və metodların faiziAşağı
ConditionMəntiqi altifadələrin faizi (&&, ||)Yüksək

Yolların əhatəsi (Path Coverage)

Path coverage — funksiyadakı bütün mümkün budaqlanma kombinasiyalarının yoxlanılmasını tələb edən ən sərt metrikadır. Təcrübədə path coverage nadir hallarda istifadə olunur, çünki kombinasiyaların sayı eksponent olaraq artır: 10 budaqlanması olan funksiyanın 1024 mümkün yolu var.

Əhatənin ölçülməsi alətləri

Mobil inkişafda platformadan asılı olaraq Code Coverage-i ölçmək üçün müxtəlif alətlər istifadə olunur. Android üçün standart JaCoCo (Java Code Coverage)-dur, Gradle ilə inteqrasiya olunur və həm vahid testləri, həm də instrumental testləri dəstəkləyir. iOS üçün Xcode-a daxil olan XCCov istifadə olunur.

Android üçün JaCoCo

JaCoCo HTML, XML və CSV formatlarında hesabatlar yaradır. HTML hesabat sətirləri vizual olaraq vurğulayır: yaşıl — icra edilmiş, qırmızı — buraxılmış, sarı — qismən icra edilmiş. XML hesabatı SonarQube və digər kod analiz sistemləri ilə uyğundur. JaCoCo sinif filtrləməni dəstəkləyir: generated-kod, databinding, BuildConfig istisna edilə bilər.

groovy
// build.gradle — JaCoCo qurulması
android {
    buildTypes {
        debug {
            testCoverageEnabled = true
        }
    }
}

// JaCoCo hesabatının yaradılması
task jacocoTestReport(type: JacocoReport) {
    dependsOn 'testDebugUnitTest'
    reports {
        xml.enabled = true
        html.enabled = true
    }
}

iOS üçün XCCov

XCCov — kodun əhatəsinin ölçülməsi üçün Xcode daxili alətidir. Test sxemində Gather coverage data vasitəsilə aktivləşdirilir. XCCov Swift və Objective-C üçün əhatəni dəstəkləyir, .xccovreport formatında hesabatlar yaradır və CI ilə xcodebuild -enableCodeCoverage YES vasitəsilə inteqrasiya olunur. Məlumatlar konsolda göstərilir və JSON-a ixrac edilə bilər.

SonarQube və Codecov

Mərkəzləşdirilmiş əhatə monitorinqi üçün platformalardan istifadə olunur: SonarQube (kod keyfiyyəti analizi + əhatə), Codecov və Coveralls. Bu xidmətlər JaCoCo və XCCov-dan məlumatları toplayır, trendləri, Quality Gate-i və GitHub/GitLab ilə PR şərhləri vasitəsilə inteqrasiyanı göstərir.

Kodun əhatəsini necə yaxşılaşdırmaq olar

Code Coverage-in artırılması sistematik yanaşma tələb edir: faizi “döymək” deyil, riskləri bağlamaq. İlk addım JaCoCo və ya XCCov hesabatını təhlil etməkdir — qırmızı (əhatə olunmamış) sinifləri müəyyən etmək. Prioritet: biznes məntiqi → depozitoriyalar → ViewModel → UI komponentləri.

TDD strategiyası

Test-Driven Development (TDD) avtomatik olaraq yüksək əhatə təmin edir, çünki testlər tətbiqdən əvvəl yazılır. Proses: qırmızı (uğursuz test yaz) → yaşıl (minimal kod yaz) → refaktorinq. TDD proqramçıları intizamlandırır, sərhəd halları və çox vaxt testsiz qalan istisna vəziyyətləri əhatə etməyə məcbur edir.

Parametrləşdirilmiş testlər

Bir parametrləşdirilmiş test onlarla adi testi əvəz edir. JUnit və XCTest parametrləşdirməni dəstəkləyir: JUnit 5-də @ParameterizedTest, XCTest-də XCTestCase ilə testPerformanceExample. Parametrləşdirmə kod təkrarlanmadan çoxsaylı giriş məlumatlarını yoxlamağa imkan verir ki, bu da budaq və şərt əhatəsini əhəmiyyətli dərəcədə genişləndirir.

kotlin
// Kotlin ilə JUnit 5-də parametrləşdirilmiş 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)
}

Code Coverage ilə işdə səhvlər

Ən çox yayılmış səhv — test keyfiyyətini təhlil etmədən faiz uğrunda qaçışdır. Komanda testlər üçün test yazmağa başlayır: getter və setter-ləri yoxlayır, müxtəlif səviyyələrdə əhatəni təkrarlayır, trivial metodları test edir. Bu yüksək faiz verir, lakin real keyfiyyəti artırmır.

Yalançı təhlükəsizlik hissi

Yüksək Code Coverage proqramın yaxşı test edildiyi barədə yalançı təəssürat yarada bilər. Test kod sətrini icra edə bilər, lakin nəticənin düzgünlüyünü yoxlamaya bilər. Məsələn: test endirim hesablama metodunu çağırır, lakin məbləği yoxlamır — sətir icra edilib, əhatə artır, lakin xəta tapılmır.

Sərhəd hallarının nəzərə alınmaması

Tipik səhv — yalnız “xoşbəxt yol” (happy path) test etmək və sərhəd hallarını nəzərə almamaq: boş siyahılar, null dəyərlər, maksimum ədədlər, səhv formatlar. Səhvlərin əksəriyyəti məhz sərhədlərdə və istisnalarda baş verir. Branch coverage buraxılmış budaqları aşkar etməyə kömək edir, lakin sərhəd dəyərlərinin yoxlanılmasına zəmanət vermir.

Mutation Testing — test keyfiyyətinin yoxlanılması

Mutation Testing — mənbə koduna mutasiyalar (süni xətalar) daxil edilən və testlərin uğursuz olub-olmayacağını yoxlayan test keyfiyyətinin qiymətləndirilməsi üsuludur. Pitest — Java və Kotlin üçün məşhur mutation testing alətidir. Testlər mutasiyada uğursuz olmadısa — bu, onların həmin şərti yoxlamadığı deməkdir.

Pitest-in iş prinsipi

Pitest mutantlar yaradır — mənbə kodunun dəyişdirilmiş nüsxələri, məsələn >-ın >= ilə, true-nun false ilə əvəz edildiyi və ya metod çağırışının silindiyi. Sonra hər bir mutant üçün testlər işə salınır. Testlər keçərsə — mutant sağ qaldı, yəni testlər bu ssenarini əhatə etmir. Testlər uğursuz olarsa — mutant öldürüldü, test düzgündür.

groovy
// build.gradle — Pitest qurulması
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
}

Mutasiya növləri

Pitest çoxsaylı mutasiya növlərini dəstəkləyir: şərt operatorlarının dəyişdirilməsi (== → !=, < → <=), metod çağırışlarının silinməsi, qaytarılan dəyərlərin dəyişdirilməsi (true → false), arifmetik əməliyyatların dəyişdirilməsi (+ → -), inkrementasiya mutasiyası (i++ → i--). Testlər tərəfindən nə qədər çox mutasiya növü öldürülərsə, test dəsti bir o qədər etibarlıdır.

Mutation Score Hədəfi

Hədəf mutation skoru — 80% və daha yüksək. Bu, süni xətaların 80%-nin testlər tərəfindən aşkarlandığı deməkdir. Kodun əhatəsi (Code Coverage) 90% səviyyəsində testlərin xəta tapmasına zəmanət vermir — mutation testing daha obyektiv qiymətləndirmə verir. Pitest CI-da Quality Gate kimi inteqrasiya oluna bilər, mutation skoru hədddən aşağı düşdükdə yığmanı bloklayır.

Code Coverage-in CI/CD-yə inteqrasiyası

CI/CD-də Code Coverage-in avtomatik nəzarəti üçün Quality Gates — hədd dəyərlər istifadə olunur, pozulduqda yığma qeyri-sabit və ya rədd edilmiş kimi qeyd olunur. SonarQube metrikalar kombinasiyası əsasında Quality Gate konfiqurasiya etməyə imkan verir: əhatə (≥80%), xətaların sayı, zəifliklər və dublikat kod.

GitHub Actions-da Quality Gate-in qurulması

GitHub Actions-da Code Coverage action addımları vasitəsilə inteqrasiya olunur: əhatə ilə testlərin işə salınması → hesabatın Codecov-a yüklənməsi → həddin yoxlanılması. Codecov avtomatik olaraq PR-i əhatə diff-i ilə şərh edir, hansı sətirlərin dəyişdiyini və bunun ümumi faizə necə təsir etdiyini göstərir. Əhatə düşərsə — əlavə testlər yazılana qədər PR bloklanır.

yaml
# GitHub Actions — Codecov-a əhatənin yüklənməsi
- 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

Hesabat və vizuallaşdırma

JaCoCo və XCCov-un HTML hesabatları əhatənin vizual vurğulanmasını ehtiva edir: yaşıl — icra edilmiş sətirlər, qırmızı — icra edilməmiş. SonarQube əlavə olaraq fayl, sinif, metod və sətir səviyyəsində əhatəni, həmçinin sprintlər üzrə əhatə dəyişiklikləri tarixçəsini göstərir. Bu, refaktorinq və testlərin əlavə edilməsi barədə qərarlar qəbul etməyə kömək edir.

Tez-tez verilən suallar

Code Coverage-in neçə faizi yaxşı hesab olunur?

Mobil layihələr üçün biznes məntiqi üçün 70–80%, UI komponentləri üçün 50–60% əhatə yaxşı hesab olunur. 80%-dən yuxarı test xərcləri faydanı üstələməyə başlayır. Xatırlamaq vacibdir ki, faiz məqsəd deyil, göstəricidir və müxtəlif modulların fərqli hədəf səviyyələri ola bilər.

Line və Branch Coverage arasında nə fərq var?

Line Coverage nə qədər kod sətirinin icra edildiyini göstərir. Branch Coverage — nə qədər budaqlanmanın (if-else, switch) test edildiyini. if olan sətir icra edilə bilər, lakin true budağı test edilmiş, false isə edilməmiş ola bilər. Branch Coverage daha sərtdir və daha çox buraxılmış ssenariləri aşkar edir.

Code Coverage-i CI/CD-yə necə inteqrasiya etmək olar?

CI/CD-də əhatə Quality Gate vasitəsilə inteqrasiya olunur: əhatə həddən aşağı olarsa, yığma bloklanır. Android üçün JaCoCo + SonarQube, iOS üçün xcodebuild -enableCodeCoverage ilə .xccovreport-un pars edilməsi istifadə olunur. GitHub Actions Codecov üçün hazır action-lara malikdir.

Jetpack Compose üçün əhatəni ölçmək olarmı?

Bəli, JaCoCo Jetpack Compose-u JVM əhatəsinin standart mexanizmi vasitəsilə dəstəkləyir. Lakin Compose kodu JaCoCo-nun tam əhatə edə bilmədiyi çoxlu sayda yaradılmış lambda ifadələri ehtiva edir. Yaradılmış compose kodunun filtrlər vasitəsilə hesabatdan xaric edilməsi tövsiyə olunur.

Yalançı əhatədən necə qaçınmaq olar?

Yalançı əhatə test kod icra etdikdə, lakin nəticəni yoxlamadıqda yaranır. Həll yolu: hər bir vacib ssenari üçün assert yoxlamaları yazmaq, test keyfiyyətini yoxlamaq üçün mutation testing (Pitest) istifadə etmək, təkcə faizi deyil, hansı budaqların əhatə olunduğunu da təhlil etmək.

Nəticə

  • Code Coverage — testlər tərəfindən icra edilən kodun faizini göstərən, lakin xətaların olmamasına zəmanət verməyən metrika
  • Line və Branch coverage — əsas metrikalar; Branch daha sərtdir və yoxlanılmamış budaqlanmaları aşkar edir
  • JaCoCo — Android üçün standart alət, XCCov — iOS üçün, hər ikisi Gradle və Xcode ilə inteqrasiya olunur
  • Hədəf əhatə biznes məntiqi üçün 70–80% — keyfiyyət və xərc arasında optimal balans
  • TDD və parametrləşdirmə — test təkrarlanmadan əhatəni artırmağın effektiv üsulları
  • SonarQube və Codecov — CI/CD-də mərkəzləşdirilmiş monitorinq və Quality Gate üçün platformalar
  • Əsas qayda: faiz uğrunda qaçmamaq, kritik riskləri və sərhəd hallarını əhatə etmək

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun