Perbedaan antara cakupan Line dan Branch

94

Saya menggunakan plugin Cobertura Maven untuk salah satu proyek saya. Tapi saya punya pertanyaan tentang laporan yang dihasilkan:

Apa perbedaan antara cakupan jalur dan cabang?

Gillespie59
sumber

Jawaban:

168

Cakupan baris mengukur berapa banyak pernyataan yang Anda ambil (pernyataan biasanya berupa baris kode, tidak termasuk komentar, persyaratan, dll). Cakupan cabang memeriksa apakah Anda mengambil cabang benar dan salah untuk setiap bersyarat (jika, sementara, untuk). Anda akan memiliki cabang dua kali lebih banyak sebagai kondisional.

Kenapa kamu peduli Perhatikan contohnya:

public int getNameLength(boolean isCoolUser) {
    User user = null;
    if (isCoolUser) {
        user = new John(); 
    }
    return user.getName().length(); 
}

Jika Anda memanggil metode ini dengan isCoolUserset to true, Anda mendapatkan 100% cakupan pernyataan. Kedengarannya bagus? TIDAK, akan ada pointer nol jika Anda menelepon dengan false. Namun, Anda memiliki 50% cakupan cabang pada kasus pertama, sehingga Anda dapat melihat ada sesuatu yang hilang dalam pengujian Anda (dan seringkali, dalam kode Anda).

Kane
sumber
8
Jawaban yang bagus! Ini menunjukkan ketika cakupan garis memberikan perasaan salah memiliki kode yang baik!
MAGx2
bug apa yang mungkin Anda dapatkan karena jangkauan jalur atau jangkauan cabang?
Emna Ayadi
61

Ambil kode ini sebagai contoh yang disederhanakan:

if(cond) {
    line1();
    line2();
    line3();
    line4();
} else {
    line5();
}

Jika pengujian Anda hanya melatih condkebenaran dan tidak pernah menjalankan elsecabang yang Anda miliki:

  • 4 dari 5 baris tercakup
  • 1 dari 2 cabang tertutup

Juga laporan Cobertura itu sendiri memperkenalkan beberapa tooltips bantuan pop-up yang bagus saat header kolom diklik:

Cakupan Garis - Persentase garis yang dieksekusi oleh pengujian ini.

Cakupan Cabang - Persentase cabang yang dijalankan oleh uji coba ini.

Tomasz Nurkiewicz
sumber
Saya berharap untuk menulis jawaban ini, tetapi Anda mendahului saya (bertahun-tahun). Jawaban jelas. Terima kasih.
Soundararajan
3
if(cond){
    //branch 1
}else{  
    //branch 2
}

Anda perlu mengatasi semua lini adalah cabang 1 dan cabang 2 untuk mendapatkan cakupan 100% untuk LineCoverage dan BranchCoverage.

Jika Anda melewatkan hal lain, Anda akan mendapatkan setengah dari cakupan cabang. Jika Anda melewatkan sesuatu di # baris di if dan lainnya, Anda akan mendapatkan BranchCoverage 100% tetapi tidak 100% dengan cakupan baris.

Semoga ini membantu.

Balaji Boggaram Ramanarayan
sumber