Saya berpartisipasi dalam pengembangan proyek Apache Ignite open source, sambil mengerjakan proyek itu menjadi menarik bagi saya untuk mengevaluasi cakupan tes dan inilah yang terjadi.

Cakupan pengujian adalah metrik paling populer yang digunakan dalam menilai kualitas pengujian produk.
Ini adalah salah satu dari beberapa metrik yang memungkinkan Anda mengidentifikasi area yang memerlukan perhatian karena risiko kesalahan yang hilang, dan juga memprioritaskan pekerjaan pada modul atau komponen proyek.
Cara termudah untuk mendapatkan laporan lengkap tentang evaluasi cakupan uji proyek Java adalah dengan menggunakan pelari cakupan yang dibangun ke IntelliJ IDEA . Ini memungkinkan Anda untuk mengonfigurasi kumpulan metrik dalam beberapa klik dan menjalankan tes dengan pembuatan laporan selanjutnya.
Pengujian di Proyek Ignite Apache
Proyek Apache Ignite menggunakan kerangka uji sendiri untuk pengujian, diimplementasikan berdasarkan JUnit 3. Pada saat penulisan, modul proyek inti berisi ~ 82 ribu tes, yang sebagian besar adalah komponen dan memerlukan peningkatan cluster dari beberapa node, termasuk JVM yang berbeda. dengan persiapan lingkungan yang bersamaan.
Perlu dicatat bahwa memastikan pengoperasian basis regresi yang sedemikian besar bukanlah tugas yang mudah. Komunitas terus memantau status produk dan mengoreksi bug yang ditemukan sebagai bagian dari inisiatif Make Teamcity Green Again .
Fitur proyek yang ditunjukkan tidak memungkinkan untuk menjalankan semua tes sekaligus dalam satu JVM karena alasan berikut:
- kemungkinan kesalahan OutOfMemoryError;
- kemungkinan crash JVM;
- kemungkinan kebuntuan;
- ketidakmampuan untuk memulai tes karena simpul yang tidak terhenti dalam tes sebelumnya;
- proses akan memakan waktu tiga hari di satu komputer.
Semua ini membuatnya tidak mungkin untuk menggunakan IntelliJ IDEA untuk mendapatkan laporan tentang semua tes proyek dan memerlukan pendekatan khusus untuk menyelesaikan masalah.
Mempersiapkan dan melakukan penilaian cakupan tes
Berdasarkan pekerjaan yang dilakukan, pendekatan yang paling dapat diandalkan untuk menyelesaikan tugas dipilih, yang berisi langkah-langkah berikut:
- Mendefinisikan seperangkat kelas tes;
- Eksekusi untuk setiap kelas tes:
2.1. mulai dan jalankan serangkaian tes kelas dalam JVM terpisah dengan pengawas waktu yang akan mengakhiri utas jika terjadi pembekuan atau masalah dengan tes;
2.2. operasi untuk mendapatkan dan menyimpan metrik cakupan uji;
2.3. membersihkan lingkungan setelah menyelesaikan tes; - Gabungkan semua metrik yang diperoleh pada paragraf 2;
- Pembuatan laporan lengkap.
Ada banyak alat untuk mengevaluasi cakupan tes, yang paling populer adalah:
Saya tidak akan membahas perbedaan mereka, tabel visual yang membandingkan kemampuan alat untuk menilai cakupan tes disajikan di sini .
Untuk mengatasi masalah ini, perpustakaan JaCoCo dipilih untuk dapat menanamkan solusi pada TeamCity , di mana infrastruktur pengujian yang ada dari proyek Apache Ignite didasarkan. TeamCity dapat bekerja di luar kotak dengan JaCoCo .
Untuk mengotomatiskan algoritma yang dijelaskan, skrip bash dan Maven digunakan . Konfigurasi plugin Jacoco Maven diimplementasikan oleh profil Maven terpisah di pom.xml.
Profil konfigurasi plugin JaCoCo diberikan di bawah ini dan menyiratkan pemisahan menjadi 2 mulai terpisah:
- Jalankan tes dengan agen JaCoCo ( persiapan-agen ) yang terhubung untuk mengumpulkan metrik cakupan tes. Properti 'runDirectory' akan diteruskan oleh skrip saat startup, yang akan memungkinkan menyimpan hasil run secara terpisah;
- Gabungkan hasil pencarian ( gabungkan ) dan pembuatan laporan ( laporan ).
Konfigurasi Maven JaCoCo<profile> <id>coverage</id> <properties> <argLine> -ea \ -server \ -Xms1g \ -Xmx6g \ -XX:+HeapDumpOnOutOfMemoryError \ -XX:+AggressiveOpts \ -DIGNITE_UPDATE_NOTIFIER=false \ -DIGNITE_NO_DISCO_ORDER=true \ -DIGNITE_PERFORMANCE_SUGGESTIONS_DISABLED=true \ -DIGNITE_QUIET=false \ -Djava.net.preferIPv4Stack=true \ </argLine> <coverage.dataFile>${runDirectory}/coverage-reports/jacoco-ut.exec</coverage.dataFile> <coverage.outputDir>${runDirectory}/jacoco-ut</coverage.outputDir> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> </configuration> <executions> <execution> <id>default-test</id> <phase>test</phase> <goals> <goal>test</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.1</version> <executions> <execution> <id>default-prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> <configuration> <destFile>${coverage.dataFile}</destFile> </configuration> </execution> <execution> <id>post-merge</id> <phase>validate</phase> <goals> <goal>merge</goal> </goals> <configuration> <fileSets> <fileSet> <directory>${basedir}</directory> <includes> <include>results/*/coverage-reports/jacoco-ut.exec</include> </includes> </fileSet> </fileSets> <destFile>merged.exe</destFile> </configuration> </execution> <execution> <id>generate-report</id> <phase>validate</phase> <goals> <goal>report</goal> </goals> <configuration> <dataFile>${basedir}/merged.exe</dataFile> <outputDirectory>${basedir}/coverage-report</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile>
Di bawah ini adalah skrip yang mengimplementasikan langkah-langkah yang dijelaskan sebelumnya.
Menjalankan semua tes dengan penilaian cakupan memakan waktu ~ 50 jam pada server khusus: 4 vCPU, 8RAM, 50 SSD, Ubuntu x64 16.04 .
Pendekatan yang dijelaskan dapat dengan mudah diparalelkan dengan beberapa tegakan, jika sumber daya tersedia, yang secara signifikan akan mengurangi waktu yang diperlukan untuk menjalankan dan mendapatkan penilaian terhadap cakupan pengujian. Setelah menanamkan solusi ini pada TeamCity , waktu penilaian cakupan tes akan memakan waktu sekitar 2 jam.
Hasil
Menurut hasil laporan, cakupan instruksi proyek adalah ~ 61%.
Cakupan instruksi untuk komponen utama:
- Cache - 66%
- Penemuan - 57%
- Hitung - 60%
- Aliran - 51%
- Biner - 68%
- Transaksi - 71%
Setelah menganalisis hasilnya, menjadi jelas bahwa semua kode panas dibahas, serta kode untuk memperbaiki masalah yang khas. Memiliki toolkit seperti itu, akan mungkin untuk memperluas cakupan ke situasi yang jarang dan tidak lazim, membuat produk bahkan lebih dapat diandalkan.
PS Laporan lengkap untuk revisi .