Saya berada dalam situasi yang sama dengan Anda, setengah jawaban yang tersebar di seluruh Internet cukup menjengkelkan, karena tampaknya banyak orang memiliki masalah yang sama, tetapi tidak ada yang dapat peduli untuk menjelaskan sepenuhnya bagaimana mereka menyelesaikannya.
Dokumen Sonar merujuk ke proyek GitHub dengan contoh-contoh yang berguna. Apa yang saya lakukan untuk menyelesaikan ini adalah menerapkan logika tes integrasi ke tes unit biasa (meskipun tes unit yang tepat harus spesifik submodule, ini tidak selalu terjadi).
Di pom.xml induk, tambahkan properti ini:
<properties>
<!-- Sonar -->
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
<sonar.language>java</sonar.language>
</properties>
Ini akan membuat Sonar mengambil laporan pengujian unit untuk semua submodul di tempat yang sama (folder target di proyek induk). Ini juga memberi tahu Sonar untuk menggunakan kembali laporan yang dijalankan secara manual alih-alih menggulirkannya sendiri. Kita hanya perlu membuat jacoco-maven-plugin berjalan untuk semua submodul dengan menempatkan ini di pom induk, di dalam build / plugins:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.6.0.201210061924</version>
<configuration>
<destFile>${sonar.jacoco.reportPath}</destFile>
<append>true</append>
</configuration>
<executions>
<execution>
<id>agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
destFile
menempatkan file laporan di tempat Sonar akan mencarinya dan append
membuatnya ditambahkan ke file daripada menimpanya. Ini akan menggabungkan semua laporan JaCoCo untuk semua submodul dalam file yang sama.
Sonar akan melihat file itu untuk setiap submodule, karena itulah yang kami tunjukkan di atas, memberi kami hasil pengujian unit gabungan untuk file multi modul di Sonar.
mvn package
sebelum menjalankanmvn sonar:sonar
untuk mendapatkan jalur laporan baru yang dibuat.FAQ
Pertanyaan dari atas kepala saya sejak saat itu saya menjadi gila dengan jacoco.
Server aplikasi saya (jBoss, Glassfish ..) berlokasi di Irak, Suriah, apa saja .. Apakah mungkin mendapatkan cakupan multi-modul saat menjalankan uji integrasi? Jenkins dan Sonar juga berada di server yang berbeda.
Iya. Anda harus menggunakan agen jacoco yang berjalan dalam mode
output=tcpserver
, jacoco ant lib. Pada dasarnya duajar
s. Ini akan memberi Anda 99% kesuksesan.Bagaimana cara kerja agen jacoco?
Anda menambahkan string
ke server aplikasi Anda JAVA_OPTS dan mulai ulang. Dalam string ini saja
[your_path]
perlu diganti dengan jalur ke jacocoagent.jar, disimpan (simpan!) Di VM Anda tempat server aplikasi berjalan. Sejak saat itu Anda memulai server aplikasi, semua aplikasi yang diterapkan akan dipantau secara dinamis dan aktivitasnya (yang berarti penggunaan kode) akan siap untuk Anda dapatkan dalam format jacocos .exec oleh permintaan tcl.Bisakah saya mengatur ulang agen jacoco untuk mulai mengumpulkan data eksekusi hanya sejak pengujian saya dimulai?
Ya, untuk itu Anda membutuhkan skrip jacocoant.jar dan ant build yang terletak di ruang kerja jenkins Anda.
Jadi pada dasarnya yang saya butuhkan dari http://www.eclemma.org/jacoco/ adalah jacocoant.jar terletak di ruang kerja jenkins saya, dan jacocoagent.jar ada di VM server aplikasi saya?
Betul sekali.
Saya tidak ingin menggunakan semut, saya pernah mendengar bahwa plugin jacoco maven dapat melakukan semua hal juga.
Itu tidak benar, plugin jacoco maven dapat mengumpulkan data pengujian unit dan beberapa data pengujian integrasi (lihat Arquillian Jacoco ), tetapi jika Anda misalnya memiliki pengujian terjamin sebagai build terpisah di jenkins, dan ingin menunjukkan cakupan multi-modul, saya bisa Saya tidak melihat bagaimana plugin maven dapat membantu Anda.
Apa sebenarnya yang diproduksi oleh agen jacoco?
Hanya data cakupan dalam
.exec
format. Sonar kemudian bisa membacanya.Apakah jacoco perlu tahu di mana lokasi kelas java saya?
Tidak, sonar melakukannya, tapi tidak jacoco. Saat kamu melakukan
mvn sonar:sonar
jalur ke kelas mulai berlaku.Lalu bagaimana dengan skrip semut?
Itu harus disajikan di ruang kerja jenkins Anda. Skrip semut saya, saya menyebutnya
jacoco.xml
terlihat seperti itu:Dua parameter wajib yang harus Anda lewati saat menjalankan skrip ini,
-Dworkspace=$WORKSPACE
gunakan untuk mengarahkan ke ruang kerja jenkins dan-Djacoco.host=yourappserver.com
tanpa hosthttp://
Juga perhatikan bahwa saya meletakkan saya
jacocoant.jar
ke $ {workspace} /tools/jacoco/jacocoant.jarApa yang harus saya lakukan selanjutnya?
Apakah Anda memulai server aplikasi Anda dengan jacocoagent.jar?
Apakah Anda meletakkan skrip semut dan jacocoant.jar di ruang kerja jenkins Anda?
Jika ya, langkah terakhir adalah mengkonfigurasi build jenkins. Berikut strateginya:
jacocoReset
untuk mengatur ulang semua data yang dikumpulkan sebelumnya.jacocoReport
untuk mendapatkan laporanJika semuanya benar, Anda akan lihat
it-jacoco.exec
di ruang kerja build Anda.Lihat tangkapan layar, saya juga telah
ant
menginstal di ruang kerja saya di$WORKSPACE/tools/ant
dir, tetapi Anda dapat menggunakan yang diinstal di jenkins Anda.Bagaimana cara mendorong laporan ini di sonar?
Maven
sonar:sonar
akan melakukan pekerjaan itu (jangan lupa untuk mengkonfigurasinya), arahkan ke pom.xml utama sehingga akan dijalankan melalui semua modul. Gunakansonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.exec
parameter untuk memberi tahu sonar di mana laporan pengujian integrasi Anda berada. Setiap kali akan menganalisis kelas modul baru, ia akan mencari informasi tentang cakupan diit-jacoco.exec
.Saya sudah memiliki jacoco.exec di direktori `target` saya,` mvn sonar: sonar` mengabaikan / menghapusnya
Secara default
mvn sonar:sonar
tidakclean
dan menghapus direktori target Anda, gunakansonar.dynamicAnalysis=reuseReports
untuk menghindarinya.sumber
CARA BARU SEJAK VERSI 0.7.7
Sejak Versi 0.7.7, ada cara baru untuk membuat laporan gabungan:
Anda membuat proyek 'laporan' terpisah yang mengumpulkan semua laporan yang diperlukan (Sasaran apa pun dalam proyek agregator dijalankan sebelum modulnya sehingga tidak dapat digunakan).
The akar pom terlihat seperti ini (jangan lupa untuk menambahkan modul laporan baru di bawah modul):
Pom dari setiap sub modul tidak perlu diubah sama sekali. Pom dari modul laporan terlihat seperti ini:
Contoh lengkap dapat ditemukan di sini .
sumber
Saya akan memposting solusi saya karena sedikit berbeda dari yang lain dan juga membutuhkan waktu seharian untuk melakukannya dengan benar, dengan bantuan jawaban yang ada.
Untuk proyek Maven multi-modul:
Jika
WAR
proyek adalah aplikasi web utama,LIB
1 dan 2 adalah modul tambahan yangWAR
bergantung pada danTEST
tempat uji integrasi dijalankan.TEST
memutar instance Tomcat yang disematkan (bukan melalui plugin Tomcat) dan menjalankanWAR
proyek dan mengujinya melalui serangkaian pengujian JUnit. TheWAR
danLIB
keduanya memiliki pengujian unitnya sendiri.Hasil dari semua ini adalah integrasi dan cakupan pengujian unit dipisahkan dan dapat dibedakan di SonarQube.
ROOT pom.xml
WAR
,LIB
danTEST
pom.xml
akan mewarisi eksekusi plugin JaCoCo.TEST pom.xml
Saya juga menemukan posting blog Petri Kainulainens 'Membuat Laporan Cakupan Kode untuk Tes Unit dan Integrasi Dengan Plugin JaCoCo Maven' menjadi berharga untuk sisi pengaturan JaCoCo.
sumber
agent-for-it
hanya diperlukan saat menjalankan pengujian dalamTEST
modul tetapi konfigurasi saat ini menjalankannya untuk setiap modul lainnya, yang tidak memiliki nilai. Perbaikan akanagent-for-ut
berjalan di semua modul lain danagent-for-it
hanya berjalan diTEST
.Ada cara untuk mencapai ini. Keajaibannya adalah membuat file jacoco.exec gabungan. Dan dengan maven 3.3.1 ada cara mudah untuk mendapatkannya. Berikut profil saya:
Jika Anda menambahkan profil ini ke pom dan panggilan orang tua Anda
mvn clean install sonar:sonar -DrunSonar
Anda mendapatkan cakupan lengkap.Keajaiban di sini
maven.multiModuleProjectDirectory
. Folder ini selalu merupakan folder tempat Anda memulai pembuatan maven.sumber
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.0.905:sonar -DrunSonar
karenaA required class was missing while executing org.sonarsource.scanner.maven:sonar-maven-plugin:3.0.1:sonar: org/sonar/batch/bootstrapper/IssueListener
kesalahan.Konfigurasi yang saya gunakan di pom level induk tempat saya memiliki fase pengujian unit dan integrasi yang terpisah.
Saya mengkonfigurasi properti berikut di Properti POM induk
Saya menempatkan definisi plugin di bawah manajemen plugin.
Perhatikan bahwa saya mendefinisikan properti untuk argumen surefire (surefireArgLine) dan failafe (failafeArgLine) untuk memungkinkan jacoco mengkonfigurasi javaagent agar berjalan dengan setiap pengujian.
Di bawah pluginManagement
Dan di bagian build
Dan di bagian pelaporan
sumber
<append>true</append>
konfigurasi di bawahprepare-agent
bagian ...Saya menemukan solusi lain untuk versi Sonar baru di mana format laporan biner JaCoCo (* .exec) tidak digunakan lagi dan format yang disukai adalah XML (SonarJava 5.12 dan lebih tinggi). Solusinya sangat sederhana dan mirip dengan solusi sebelumnya dengan laporan * .exec di direktori induk dari topik ini: https://stackoverflow.com/a/15535970/4448263 .
Dengan asumsi bahwa struktur proyek kami adalah:
Anda perlu mengikuti konfigurasi plugin build maven di pom proyek agregat:
Kemudian bangun proyek dengan maven:
Dan untuk Sonar Anda harus mengatur properti di GUI administrasi:
atau menggunakan baris perintah:
Deskripsi
Hal ini menciptakan laporan biner untuk setiap modul di direktori default:
target/jacoco.exec
. Kemudian menciptakan laporan XML untuk setiap modul di direktori default:target/site/jacoco/jacoco.xml
. Kemudian membuat laporan agregat untuk setiap modul dalam direktori kustom${project.basedir}/../target/site/jacoco-aggregate/
yang berhubungan dengan direktori induk untuk setiap modul. Untuk moduleA dan moduleB ini akan menjadi jalur umummoduleC/target/site/jacoco-aggregate/
.Karena moduleB bergantung pada moduleA, moduleB akan dibuat terakhir dan laporannya akan digunakan sebagai laporan cakupan gabungan di Sonar untuk kedua modul A dan B.
Selain laporan gabungan, kami memerlukan laporan modul normal karena laporan gabungan JaCoCo berisi data cakupan hanya untuk dependensi.
Bersama-sama, kedua jenis laporan ini menyediakan data cakupan penuh untuk Sonar.
Ada satu batasan kecil: Anda harus dapat menulis laporan di direktori induk proyek (harus memiliki izin). Atau Anda dapat menyetel properti
jacoco.skip=true
di pom.xml (moduleC) proyek root danjacoco.skip=false
di modul dengan kelas dan pengujian (moduleA dan moduleB).sumber
sumber
Sebagai Sonar
sonar.jacoco.reportPath
,sonar.jacoco.itReportPath
dansonar.jacoco.reportPaths
semuanya sudah usang , Anda harus menggunakansonar.coverage.jacoco.xmlReportPaths
sekarang. Ini juga berdampak jika Anda ingin mengonfigurasi proyek maven multi modul dengan Sonar dan Jacoco.Seperti yang @Lonzak tunjukkan , sejak Sonar 0.7.7, Anda dapat menggunakan tujuan aggragasi laporan Sonar. Masukkan saja Anda orang tua pom ketergantungan berikut:
Karena versi terbaru dari jacoco-maven-plugin kompatibel dengan xml-reports, ini akan membuat untuk setiap modul di folder targetnya sendiri folder situs / jacoco-aggregate yang berisi
jacoco.xml
file.Untuk membiarkan Sonar menggabungkan semua modul, gunakan perintah berikut:
Untuk menjaga jawaban saya singkat dan tepat, saya tidak menyebutkan dependensi
maven-surefire-plugin
danmaven-failsafe-plugin
. Anda bisa menambahkannya tanpa konfigurasi lain:sumber
Anda dapat memanggil tugas semut yang disebut merge on maven, untuk menempatkan semua file cakupan (* .exec) bersama-sama dalam file yang sama.
Jika Anda menjalankan pengujian unit, gunakan fase persiapan-paket , jika Anda menjalankan pengujian integrasi, gunakan uji pasca-integrasi .
Situs ini memiliki contoh bagaimana memanggil tugas semut jacoco di proyek maven
Anda dapat menggunakan file gabungan ini di sonar.
sumber
untuk melakukan pengujian unit DAN pengujian integrasi, Anda dapat menggunakan maven-surefire-plugin dan maven-failafe-plugin dengan penyertaan / pengecualian terbatas. Saya bermain dengan CDI saat berhubungan dengan sonar / jacoco, jadi saya berakhir di proyek ini:
https://github.com/FibreFoX/cdi-sessionscoped-login/
Mungkin itu sedikit membantu Anda. di pom.xml saya, saya menggunakan "-javaagent" secara implisit dengan mengatur opsi-argLine di bagian-konfigurasi dari plugin-pengujian yang ditentukan. Secara eksplisit menggunakan ANT dalam proyek MAVEN adalah sesuatu yang tidak akan saya coba, bagi saya itu terlalu banyak mencampurkan dua dunia.
Saya hanya memiliki proyek maven modul tunggal, tetapi mungkin ini membantu Anda menyesuaikan milik Anda untuk bekerja.
catatan: mungkin tidak semua maven-plugin up2date, mungkin beberapa masalah diperbaiki di versi yang lebih baru
sumber
Sampel ini bekerja dengan sangat baik untuk saya:
sumber