1. Gambaran keseluruhan
Liputan kod adalah metrik perisian yang digunakan untuk mengukur berapa banyak baris kod kami yang dilaksanakan semasa ujian automatik.
Dalam artikel ini kita akan menelusuri beberapa aspek praktikal menggunakan JaCoCo - penjana laporan liputan kod untuk projek Java.
2. Konfigurasi Maven
Untuk bangun dan berjalan dengan JaCoCo, kita perlu menyatakan plugin maven ini dalam fail pom.xml kami :
org.jacoco jacoco-maven-plugin 0.7.7.201606060606 prepare-agent report prepare-package report
Pautan yang disediakan di sini-sebelum ini akan selalu membawa anda ke versi terkini pemalam di repositori pusat maven.
3. Laporan Liputan Kod
Sebelum kita mula melihat keupayaan liputan kod JaCoCo, kita perlu mempunyai contoh kod. Berikut adalah fungsi Java ringkas yang memeriksa sama ada rentetan membaca sama ke belakang dan ke hadapan:
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 perlukan sekarang adalah ujian JUnit yang mudah :
@Test public void whenEmptyString_thenAccept() { Palindrome palindromeTester = new Palindrome(); assertTrue(palindromeTester.isPalindrome("")); }
Menjalankan ujian menggunakan JUnit secara automatik akan menggerakkan ejen JaCoCo, oleh itu, ia akan membuat laporan liputan dalam format binari dalam direktori sasaran - target / jacoco.exec.
Jelas kita tidak dapat menafsirkan output secara sendirian, tetapi alat dan plugin lain dapat - misalnya Sonar Qube .
Berita baiknya ialah kita dapat menggunakan tujuan laporan jacoco: untuk menghasilkan laporan liputan kod yang boleh dibaca dalam beberapa format - misalnya HTML, CSV, dan XML.
Kita sekarang dapat melihat contohnya di halaman target / site / jacoco / index.html untuk melihat seperti apa laporan yang dihasilkan:

Mengikuti pautan yang disediakan dalam laporan - Palindrome.java , kita dapat meneliti pandangan yang lebih terperinci untuk setiap kelas Java:

Perhatikan bahawa anda boleh mengurus liputan kod dengan mudah menggunakan JaCoCo di dalam Eclipse dengan konfigurasi sifar , terima kasih kepada plugin EclEmma Eclipse.
4. Analisis Laporan
Laporan kami menunjukkan liputan arahan 21%, liputan cawangan 17%, 3/5 untuk kerumitan siklomatik dan sebagainya.
38 petunjuk yang ditunjukkan oleh JaCoCo dalam laporan merujuk kepada arahan bytecode berbanding arahan kod Java biasa.
Laporan JaCoCo membantu anda menganalisis liputan kod secara visual dengan menggunakan berlian dengan warna untuk cabang dan warna latar untuk garis:
- Berlian merah bermaksud bahawa tidak ada cabang yang dijalankan selama fasa ujian.
- Berlian kuning menunjukkan bahawa kod tersebut dilindungi sebahagian - beberapa cawangan belum digunakan.
- Berlian hijau bermaksud semua cabang telah dijalankan semasa ujian.
Kod warna yang sama berlaku untuk warna latar belakang, tetapi untuk liputan garis.
JaCoCo menyediakan tiga metrik penting:
- Liputan garis mencerminkan jumlah kod yang telah dilaksanakan berdasarkan jumlah arahan kod bait Java yang dipanggil oleh ujian.
- Liputan cawangan menunjukkan peratus cawangan yang dilaksanakan dalam kod - biasanya berkaitan dengan pernyataan jika / lain dan beralih .
- Kerumitan sikomatik menggambarkan kerumitan kod dengan memberikan bilangan jalan yang diperlukan untuk merangkumi semua kemungkinan jalan dalam kod melalui kombinasi linear.
Untuk mengambil contoh remeh, jika tidak ada pernyataan jika atau beralih dalam kod, kerumitan siklomatik akan menjadi 1, kerana kita hanya memerlukan satu jalan pelaksanaan untuk menutup seluruh kod.
Secara amnya kerumitan siklomatik menggambarkan jumlah kes ujian yang perlu kita laksanakan untuk merangkumi keseluruhan kod.
5. Pecahan Konsep
JaCoCo berjalan sebagai ejen Java , ia bertanggungjawab untuk menginstruksikan bytecode semasa menjalankan ujian. JaCoCo melatih setiap arahan dan menunjukkan garis mana yang digunakan semasa setiap ujian.
Untuk mengumpulkan data liputan, JaCoCo menggunakan ASM untuk instrumen kod dengan cepat, menerima acara dari JVM Tool Interface dalam proses:

Anda juga boleh menjalankan ejen JaCoCo dalam mod pelayan, dalam hal ini, kita dapat menjalankan ujian dengan jacoco: dump sebagai tujuan, untuk memulakan permintaan pembuangan.
Anda boleh mengikuti pautan dokumentasi rasmi untuk perincian lebih mendalam mengenai reka bentuk JaCoCo.
6. Skor Perlindungan Kod
Setelah mengetahui sedikit tentang bagaimana JaCoCo berfungsi, mari tingkatkan skor liputan kod kami.
Untuk mencapai liputan kod 100%, kita perlu memperkenalkan ujian, yang merangkumi bahagian 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 boleh mengatakan bahawa kita mempunyai ujian yang cukup untuk merangkumi keseluruhan kod kita, tetapi untuk memastikannya, mari jalankan perintah Maven mvn jacoco: report untuk menerbitkan laporan liputan:

Seperti yang anda lihat semua baris / cabang / jalan dalam kod kami dilindungi sepenuhnya:

Dalam projek dunia nyata, dan seiring perkembangannya, kita perlu terus memantau skor liputan kod.
JaCoCo menawarkan cara mudah untuk menyatakan syarat minimum yang harus dipenuhi, jika tidak, binaannya akan gagal.
Kita boleh melakukannya dengan menambahkan tujuan pemeriksaan berikut dalam fail pom.xml kami :
jacoco-check check PACKAGE LINE COVEREDRATIO 0.50
Seperti yang anda boleh sangka, kami menghadkan di sini skor minimum untuk liputan garis hingga 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 boleh melihat contoh yang diberikan dalam artikel ini dalam projek GitHub yang dipautkan .