Pengantar JaCoCo

1. Ikhtisar

Cakupan kode adalah metrik perangkat lunak yang digunakan untuk mengukur berapa banyak baris kode kami yang dieksekusi selama pengujian otomatis.

Pada artikel ini kita akan membahas beberapa aspek praktis menggunakan JaCoCo - generator laporan cakupan kode untuk proyek Java.

2. Konfigurasi Maven

Untuk bangun dan menjalankan JaCoCo, kita perlu mendeklarasikan plugin maven ini di file pom.xml kita :

 org.jacoco jacoco-maven-plugin 0.7.7.201606060606    prepare-agent    report prepare-package  report     

Tautan yang disediakan di sini-sebelumnya akan selalu mengarahkan Anda ke versi terbaru plugin di repositori pusat maven.

3. Laporan Cakupan Kode

Sebelum kita mulai melihat kapabilitas cakupan kode JaCoCo, kita perlu memiliki contoh kode. Berikut adalah fungsi Java sederhana yang memeriksa apakah sebuah string membaca maju dan mundur yang sama:

public boolean isPalindrome(String inputString) { if (inputString.length() == 0) { return true; } else { char firstChar = inputString.charAt(0); char lastChar = inputString.charAt(inputString.length() - 1); String mid = inputString.substring(1, inputString.length() - 1); return (firstChar == lastChar) && isPalindrome(mid); } }

Yang kita butuhkan sekarang hanyalah tes JUnit sederhana :

@Test public void whenEmptyString_thenAccept() { Palindrome palindromeTester = new Palindrome(); assertTrue(palindromeTester.isPalindrome("")); }

Menjalankan pengujian menggunakan JUnit secara otomatis akan menggerakkan agen JaCoCo, sehingga akan membuat laporan cakupan dalam format biner di direktori target - target / jacoco.exec.

Jelas kami tidak dapat menafsirkan keluaran sendirian, tetapi alat dan plugin lain dapat - misalnya Sonar Qube .

Kabar baiknya adalah kita dapat menggunakan jacoco: report goal untuk menghasilkan laporan cakupan kode yang dapat dibaca dalam beberapa format - misalnya HTML, CSV, dan XML.

Sekarang kita dapat melihat misalnya di halaman target / site / jacoco / index.html untuk melihat seperti apa laporan yang dihasilkan:

Mengikuti tautan yang disediakan dalam laporan - Palindrome.java , kita dapat menelusuri tampilan yang lebih detail untuk setiap kelas Java:

Perhatikan bahwa Anda dapat langsung mengelola cakupan kode menggunakan JaCoCo di dalam Eclipse dengan konfigurasi nol , berkat plugin EclEmma Eclipse.

4. Analisis Laporan

Laporan kami menunjukkan cakupan instruksi 21%, cakupan cabang 17%, 3/5 untuk kompleksitas siklomatik dan sebagainya.

38 instruksi yang ditunjukkan oleh JaCoCo dalam laporan tersebut mengacu pada instruksi bytecode yang bertentangan dengan instruksi kode Java biasa.

Laporan JaCoCo membantu Anda menganalisis cakupan kode secara visual dengan menggunakan berlian dengan warna untuk cabang dan warna latar belakang untuk garis:

  • Berlian merah berarti tidak ada cabang yang dilakukan selama fase pengujian.
  • Berlian kuning menunjukkan bahwa kode tertutup sebagian - beberapa cabang belum digunakan.
  • Berlian hijau berarti semua cabang telah dilakukan selama pengujian.

Kode warna yang sama berlaku untuk warna latar belakang, tetapi untuk cakupan garis.

JaCoCo menyediakan tiga metrik penting:

  • Cakupan garis mencerminkan jumlah kode yang telah dijalankan berdasarkan jumlah instruksi kode byte Java yang dipanggil oleh pengujian.
  • Cakupan cabang menunjukkan persentase cabang yang dijalankan dalam kode - biasanya terkait dengan pernyataan if / else dan switch .
  • Kompleksitas siklomatik mencerminkan kompleksitas kode dengan memberikan jumlah jalur yang diperlukan untuk mencakup semua jalur yang memungkinkan dalam suatu kode melalui kombinasi linier.

Untuk mengambil contoh sepele, jika tidak ada pernyataan if atau switch dalam kode, kompleksitas siklomatik akan menjadi 1, karena kita hanya memerlukan satu jalur eksekusi untuk mencakup seluruh kode.

Umumnya kompleksitas siklomatik mencerminkan jumlah kasus uji yang perlu kita terapkan untuk mencakup seluruh kode.

5. Perincian Konsep

JaCoCo berjalan sebagai agen Java , yang bertanggung jawab untuk melengkapi bytecode saat menjalankan pengujian. JaCoCo melatih setiap instruksi dan menunjukkan baris mana yang dilakukan selama setiap tes.

Untuk mengumpulkan data cakupan, JaCoCo menggunakan ASM untuk instrumentasi kode dengan cepat, menerima peristiwa dari Antarmuka Alat JVM dalam proses:

Juga dimungkinkan untuk menjalankan agen JaCoCo dalam mode server, dalam hal ini, kita dapat menjalankan pengujian kita dengan jacoco: dump sebagai tujuan, untuk memulai permintaan dump.

Anda dapat mengikuti tautan dokumentasi resmi untuk detail lebih mendalam tentang desain JaCoCo.

6. Skor Cakupan Kode

Sekarang setelah kita tahu sedikit tentang cara kerja JaCoCo, mari tingkatkan skor cakupan kode kita.

Untuk mencapai cakupan kode 100% kita perlu memperkenalkan tes, yang mencakup bagian yang hilang yang ditunjukkan dalam laporan awal:

@Test public void whenPalindrom_thenAccept() { Palindrome palindromeTester = new Palindrome(); assertTrue(palindromeTester.isPalindrome("noon")); } @Test public void whenNearPalindrom_thanReject(){ Palindrome palindromeTester = new Palindrome(); assertFalse(palindromeTester.isPalindrome("neon")); }

Sekarang kita dapat mengatakan bahwa kita memiliki cukup tes untuk mencakup seluruh kode kita, tetapi untuk memastikannya, mari kita jalankan perintah Maven mvn jacoco: report untuk mempublikasikan laporan cakupan:

Seperti yang Anda lihat, semua baris / cabang / jalur dalam kode kami sepenuhnya tertutup:

Dalam proyek dunia nyata, dan seiring perkembangannya, kita perlu melacak skor cakupan kode.

JaCoCo menawarkan cara sederhana untuk menyatakan persyaratan minimum yang harus dipenuhi, jika tidak, build akan gagal.

Kita dapat melakukannya dengan menambahkan tujuan pemeriksaan berikut di file pom.xml kita :

 jacoco-check  check     PACKAGE   LINE COVEREDRATIO 0.50      

Seperti yang mungkin bisa Anda tebak, di sini kami membatasi skor minimum untuk cakupan garis menjadi 50%.

The jacoco:check goal is bound to verify, so we can run the Maven command – mvn clean verify to check whether the rules are respected or not. The logs will show something like:

[ERROR] Failed to execute goal org.jacoco:jacoco-maven-plugin:0.7.7.201606060606:check (jacoco-check) on project mutation-testing: Coverage checks have not been met.

7. Conclusion

In this article we've seen how to make use of JaCoCo maven plugin to generate code coverage reports for Java projects.

Keep in mind though, 100% code coverage does not necessary reflects effective testing, as it only reflects the amount of code exercised during tests. In a previous article, we've talked about mutation testing as a more sophisticated way to track tests effectiveness compared to ordinary code coverage.

Anda dapat melihat contoh yang diberikan dalam artikel ini di proyek GitHub yang ditautkan .