Plugin ini menyediakan kemampuan untuk melakukan pengujian mutasi dan menghitung cakupan mutasi proyek berbasis lulusan dengan PIT.
Tambahkan Gradle-Pitest-Plugin ke konfigurasi plugins di file build.gradle Anda:
plugins {
id ' java ' // or 'java-library' - depending on your needs
id ' info.solidsoft.pitest ' version ' 1.15.0 '
}plugins {
id( " java " ) // or "java-library" - depending on your needs
id( " info.solidsoft.pitest " ) version " 1.15.0 "
}Hubungi Gradle dengan Tugas Pitest:
gradle pitest
Setelah pengukuran, laporan yang dibuat oleh PIT akan ditempatkan di ${PROJECT_DIR}/build/reports/pitest .
Secara opsional membuatnya bergantung pada build:
build . dependsOn ' pitest 'tasks.build {
dependsOn( " pitest " )
} Perhatikan bahwa ketika membuat pitest bergantung pada tugas lain, itu harus dirujuk dengan nama. Kalau tidak, Gradle akan menyelesaikan pitest ke konfigurasi dan bukan tugas.
" plugins Way" memiliki beberapa keterbatasan. Karena repositori utama untuk plugin adalah repositori pusat (alias maven central), juga dimungkinkan untuk menambahkan plugin ke proyek Anda menggunakan "cara generik":
buildscript {
repositories {
mavenCentral()
// Needed only for SNAPSHOT versions
// maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
}
dependencies {
classpath ' info.solidsoft.gradle.pitest:gradle-pitest-plugin:1.15.0 '
}
}buildscript {
repositories {
mavenCentral()
// Needed only for SNAPSHOT versions
// maven {
// url = uri("https://oss.sonatype.org/content/repositories/snapshots/")
// }
}
dependencies {
classpath( " info.solidsoft.gradle.pitest:gradle-pitest-plugin:1.15.0 " )
}
}Terapkan plugin:
apply plugin : ' java ' // or 'java-library' - depending on your needs
apply plugin : ' info.solidsoft.pitest ' apply (plugin = " java " ) // or "java-library" - depending on your needs
apply (plugin = " info.solidsoft.pitest " ) Plugin Pitest tidak perlu dikonfigurasi juga jika Anda menggunakan JUnit 4. Kustomisasi dilakukan di blok pitest :
pitest {
targetClasses = [ ' our.base.package.* ' ] // by default "${project.group}.*"
pitestVersion = ' 1.15.0 ' // not needed when a default PIT version should be used
threads = 4
outputFormats = [ ' XML ' , ' HTML ' ]
timestampedReports = false
}Konfigurasi idiomatik dan lebih portabel:
pitest {
targetClasses.set( setOf ( " our.base.package.* " )) // by default "${project.group}.*"
pitestVersion.set( " 1.15.0 " ) // not needed when a default PIT version should be used
threads.set( 4 )
outputFormats.set( setOf ( " XML " , " HTML " ))
timestampedReports.set( false )
} Mulai dari Gradle 8.1 Penugasan Properti Sederhana dapat digunakan untuk mengonfigurasi plugin (bukan metode set() ):
pitest {
targetClasses = setOf ( " our.base.package.* " ) // by default "${project.group}.*"
pitestVersion = " 1.15.0 " // not needed when a default PIT version should be used
threads = 4
outputFormats = setOf ( " XML " , " HTML " )
timestampedReports = false
} Konfigurasi di Gradle adalah kode groovy nyata yang membuat semua penugasan sangat intuitif. Semua nilai yang diharapkan oleh PIT harus dilewati sebagai tipe yang sesuai. Hanya ada satu perbedaan penting. Untuk parameter di mana Pit mengharapkan daftar koma yang terpisah dalam konfigurasi lulusan, daftar string harus digunakan (lihat outputFormats dalam contoh di atas).
Periksa dokumentasi PIT untuk daftar semua parameter baris perintah yang tersedia. Format parameter yang diharapkan dalam konfigurasi plugin dapat diambil dari pitestpluginextension.
Untuk membuat hidup lebih mudah taskClasspath , mutableCodePaths , sourceDirs , reportDir , verbosity dan pitestVersion secara otomatis ditetapkan oleh plugin. Selain sourceDirs , reportDir , verbosity dan pitestVersion dapat ditimpa oleh pengguna.
Ada beberapa parameter khusus untuk plugin Gradle:
testSourceSets - Menentukan set sumber uji yang harus digunakan oleh PIT (secara default Sumber.Test, tetapi memungkinkan untuk menambahkan tes integrasi yang terletak di set sumber yang berbeda)mainSourceSets - mendefinisikan set sumber utama yang harus digunakan oleh PIT (secara default Sourcesets.main)mainProcessJvmArgs - Argumen JVM untuk digunakan saat meluncurkan proses PIT utama; Buat catatan bahwa Pit sendiri meluncurkan proses Java lain untuk eksekusi pengujian mutasi dan biasanya jvmArgs harus digunakan untuk misalnya meningkatkan ukuran memori maksimum (lihat #7);additionalMutableCodePaths - Kelas tambahan untuk bermutasi (berguna untuk tes integrasi dengan kode produksi dalam modul yang berbeda - lihat #25)useClasspathFile - Mengaktifkan melewati ClassPath tambahan sebagai konten file (berguna untuk pengguna Windows dengan banyak elemen ClassPath, dinonaktifkan secara default)fileExtensionsToFilter - Menyediakan kemampuan untuk memfilter ekstensi file tambahan dari Pit ClassPath (lihat #53)Misalnya:
pitest {
.. .
testSourceSets = [sourceSets . test, sourceSets . integrationTest]
mainSourceSets = [sourceSets . main, sourceSets . additionalMain]
jvmArgs = [ ' -Xmx1024m ' ]
useClasspathFile = true // useful with bigger projects on Windows
fileExtensionsToFilter . addAll( ' xml ' , ' orbit ' )
}pitest {
.. .
testSourceSets.set( listOf (sourceSets.test.get(), sourceSets.getByName( " integrationTest " )))
mainSourceSets.set( listOf (sourceSets.main.get(), sourceSets.getByName( " additionalMain " )))
jvmArgs.set( listOf ( " -Xmx1024m " ))
useClasspathFile.set( true ) // useful with bigger projects on Windows
fileExtensionsToFilter.addAll( " xml " , " orbit " )
}PIT mengeksekusi tes dalam JVM terlepas dari JVM yang digunakan oleh Gradle untuk menjalankan tes. Jika pengujian Anda memerlukan beberapa properti sistem, Anda harus meneruskannya karena plugin tidak akan melakukannya untuk Anda:
test {
systemProperty ' spring.test.constructor.autowire.mode ' , ' all '
}
pitest {
jvmArgs = [ ' -Dspring.test.constructor.autowire.mode=all ' ]
}tasks.test {
systemProperty( " spring.test.constructor.autowire.mode " , " all " )
}
pitest {
jvmArgs.set( listOf ( " -Dspring.test.constructor.autowire.mode=all " ))
} Seperti yang dilaporkan di #170 IntelliJ Idea menampilkan peringatan tentang pengaturan bidang akhir (konfigurasi malas) di build.gradle . Ini bukan masalah nyata karena Gradle secara internal mencegat panggilan tersebut dan menggunakan setter sebagai gantinya. Namun demikian, orang -orang yang lebih suka tidak memiliki (kurang) peringatan dengan biaya kode yang kurang dapat dibaca sebagai gantinya, misalnya:
testSourceSets . set([sourceSets . test, sourceSets . integrationTest])
mainSourceSets . set([sourceSets . main, sourceSets . additionalMain])
jvmArgs . set([ ' -Xmx1024m ' ])
useClasspathFile . set( true ) // useful with bigger projects on Windows
fileExtensionsToFilter . addAll( ' xml ' , ' orbit ' )Gradle-Pitest-plugin dapat digunakan dalam proyek multi-modul. Ketergantungan Gradle-Pitest-Plugin harus ditambahkan ke konfigurasi Buildscript di proyek root sementara plugin harus diterapkan di semua subproyek yang harus diproses dengan PIT. Cuplikan sampel dari build.gradle terletak untuk proyek root:
// in root project configuration
plugins {
id ' info.solidsoft.pitest ' version ' 1.15.0 ' apply false
}
subprojects {
apply plugin : ' java '
apply plugin : ' info.solidsoft.pitest '
pitest {
threads = 4
if (project . name in [ ' module-without-any-test ' ]) {
failWhenNoMutations = false
}
}
} // in root project configuration
plugins {
id( " info.solidsoft.pitest " ) version " 1.15.0 "
}
subprojects {
apply (plugin = " java " )
apply (plugin = " info.solidsoft.pitest " )
pitest {
threads.set( 4 )
if (project.name in setOf ( " module-without-any-test " )) {
failWhenNoMutations.set( false )
}
}
} Dimungkinkan untuk mengumpulkan laporan paling pitest untuk proyek multi-modul menggunakan info.solidsoft.pitest.aggregator plugin.solidsoft.pitest.aggregator dan tugas pitestReportAggregate . Proyek root harus dikonfigurasi dengan benar untuk menggunakan pitestReportAggregate :
// in root project configuration
plugins {
id ' info.solidsoft.pitest ' version ' 1.15.0 ' apply false
}
apply plugin : ' info.solidsoft.pitest.aggregator ' // to 'pitestReportAggregate' appear
subprojects {
apply plugin : ' java '
apply plugin : ' info.solidsoft.pitest '
pitest {
// export mutations.xml and line coverage for aggregation
outputFormats = [ " XML " ]
exportLineCoverage = true
timestampedReports = false
.. .
reportAggregator { // since 1.9.11 - extra results validation, if needed
testStrengthThreshold . set( 50 ) // simpler Groovy syntax (testStrengthThreshold = 50) does not seem to be supported for nested properties
mutationThreshold . set( 40 )
maxSurviving . set( 3 )
}
}
} // in root project configuration
plugins {
id( " info.solidsoft.pitest " ) version " 1.15.0 "
}
apply (plugin = " info.solidsoft.pitest.aggregator " )
subprojects {
apply (plugin = " java " )
apply (plugin = " info.solidsoft.pitest " )
pitest {
outputFormats.set( setOf ( " XML " ))
timestampedReports.set( false )
exportLineCoverage.set( true )
.. .
reportAggregator {
testStrengthThreshold.set( 50 )
mutationThreshold.set( 40 )
maxSurviving.set( 3 )
}
}
} Setelah eksekusi tugas pitest pitestReportAggregate , laporan agregat akan ditempatkan di direktori ${PROJECT_DIR}/build/reports/pitest .
Dimungkinkan untuk bermutasi kode yang terletak di subproyik yang berbeda. Gradle secara internal tidak mengandalkan direktori output dari subproyik lain, tetapi membuat toples dan menggunakan kelas -kelas darinya. Untuk pit itu adalah dua set file kelas yang berbeda, jadi untuk membuatnya berfungsi, diperlukan untuk mendefinisikan kedua mainSourceSets dan additionalMutableCodePaths . Misalnya:
configure(project( ' :itest ' )) {
apply plugin : ' info.solidsoft.pitest '
dependencies {
implementation project( ' :shared ' )
}
configurations { mutableCodeBase { transitive false } }
dependencies { mutableCodeBase project( ' :shared ' ) }
pitest {
mainSourceSets = [project . sourceSets . main, project( ' :shared ' ) . sourceSets . main]
additionalMutableCodePaths = [configurations . mutableCodeBase . singleFile]
}
}configure( listOf (project( " :itest " ))) {
apply (plugin = " info.solidsoft.pitest " )
dependencies {
implementation(project( " :shared " ))
}
val mutableCodeBase by configurations.creating { isTransitive = false }
dependencies { mutableCodeBase(project( " :shared " )) }
pitest {
mainSourceSets.set( listOf (project.sourceSets.main.get(), project( " :shared " ).sourceSets.main.get()))
additionalMutableCodePaths.set( listOf (mutableCodeBase.singleFile))
}
}Di atas adalah cara yang direkomendasikan oleh tim Gradle, tetapi dalam kasus tertentu solusi yang lebih sederhana juga harus berfungsi:
configure(project( ' :itest ' )) {
apply plugin : ' info.solidsoft.pitest '
dependencies {
implementation project( ' :shared ' )
}
pitest {
mainSourceSets = [project . sourceSets . main, project( ' :shared ' ) . sourceSets . main]
additionalMutableCodePaths = project( ' :shared ' ) . jar . outputs . files . getFiles()
}
}configure( listOf (project( " :itest " ))) {
apply (plugin = " info.solidsoft.pitest " )
dependencies {
implementation(project( " :shared " ))
}
pitest {
mainSourceSets.set( listOf (project.sourceSets.main.get(), project( " :shared " ).sourceSets.main.get()))
additionalMutableCodePaths.set(project( " :shared " ).task( " jar " ).outputs.files)
}
}Minimal Multi-Project Build minimal tersedia di suite tes fungsional.
Plugin uji digunakan untuk mendukung kerangka kerja uji yang berbeda dari Junit4.
Dimulai dengan rilis ini Konfigurasi yang diperlukan untuk menggunakan PIT dengan JUnit 5 telah disederhanakan untuk yang berikut:
plugins {
id ' java '
id ' info.solidsoft.pitest ' version ' 1.15.0 '
}
pitest {
// adds dependency to org.pitest:pitest-junit5-plugin and sets "testPlugin" to "junit5"
junit5PluginVersion = ' 1.0.0 ' // or 0.15 for PIT <1.9.0
// ...
}plugins {
id( " java " )
id( " info.solidsoft.pitest " ) version " 1.15.0 "
}
pitest {
// adds dependency to org.pitest:pitest-junit5-plugin and sets "testPlugin" to "junit5"
junit5PluginVersion.set( " 1.0.0 " )
}Harap dicatat . Pit 1.9.0 membutuhkan pitest-junit5-plugin 1.0.0+. Junit Jupiter 5.8 (Platform Junit 1.8) membutuhkan pitest-junit5-plugin 0,15+, sedangkan 5,7 (1,7) membutuhkan 0,14. Atur versi plugin yang tepat untuk versi JUnit 5 yang digunakan dalam proyek Anda untuk menghindari kesalahan runtime (seperti `nosuchmethoderror: 'java.util.optional org.junit.platform.commons.util.annotationutils.findannotation (java.Lang.class, java.Lang, loolan) (java).
Contoh kerja minimal untuk Junit 5 tersedia di suite tes fungsional.
Untuk mencampur Junit 5 dengan plugin pit lainnya, Anda dapat membaca bagian ini di posting blog saya.
Untuk mengaktifkan plugin pit, itu cukup untuk menambahkannya ke konfigurasi paling pucat di penutupan buildscript. Misalnya:
plugins {
id ' java '
id ' info.solidsoft.pitest ' version ' 1.15.0 '
}
repositories {
mavenCentral()
}
dependencies {
pitest ' org.example.pit.plugins:pitest-custom-plugin:0.42 '
}plugins {
id( " java " )
id( " info.solidsoft.pitest " ) version " 1.15.0 "
}
repositories {
mavenCentral()
}
dependencies {
pitest( " org.example.pit.plugins:pitest-custom-plugin:0.42 " )
}Contoh kerja minimal tersedia di suite tes fungsional.
Harap dicatat. Di Gradle-Pitest-Plugin <1.5.0 Konfigurasi pitest harus dibuat dalam ruang lingkup buildscript untuk proyek root. Harap dicatat. Dimulai dengan PIT 1.6.7 tidak lagi diperlukan untuk mengatur parameter konfigurasi testPlugin . Ini juga sudah usang di plugin Gradle.
Versi setiap lulusan-Pitest-plugin secara default menggunakan versi pit yang telah ditentukan. Biasanya ini versi terbaru dari PIT yang dirilis pada saat merilis versi plugin. Ini dapat ditimpa dengan menggunakan parameter pitestVersion dalam penutupan konfigurasi pitest .
Perlu diketahui bahwa dalam beberapa kasus mungkin ada beberapa masalah saat menggunakan versi pit non -default.
Jika tidak dinyatakan sebaliknya, gradle-pitest-plugin 1.9.x secara default menggunakan pit 1.9.x, 1.7.x menggunakan pit 1.7.x, dll. Versi pit yang didukung minimal adalah 1.7.1.
Dimulai dengan versi 1.7.0 gradle-pitest-plugin membutuhkan lulusan 6.4. Versi terbaru dengan dukungan Gradle 5.x (5.6+) adalah 1.6.0. Versi saat ini secara otomatis diuji dengan lulusan 6.4, 6.9.1 dan 7.4.2 di bawah tes Java 11. dengan Java 11+ terbatas pada versi gradle dan pit yang kompatibel.
Dukungan eksperimental untuk Java 17 dapat diuji dengan 1.7.0+.
Dimulai dengan versi 1.3.0 binari yang diproduksi membutuhkan Java 8 (sebagai JDK yang digunakan untuk menjalankan Build Gradle). Namun, setelah Java 17 LTS dirilis pada bulan September 2021, dimulai dengan Gradle-Pitest-Plugin 1.9.0, dukungan untuk JDK <11 sudah usang (lihat #299).
Lihat file Changelog untuk daftar perubahan yang lebih rinci dalam plugin itu sendiri.
Gradle tidak memberikan cara bawaan untuk mengganti konfigurasi plugin melalui baris perintah, tetapi lulusan-override-plugin dapat digunakan untuk melakukannya.
Setelah diterapkan lulusan-override-plugin dalam proyek Anda , dimungkinkan untuk dilakukan sebagai berikut:
./gradlew pitest -Doverride.pitest.reportDir=build/pitReport -Doverride.pitest.threads=8
Catatan. Mekanisme ini harus berfungsi dengan baik untuk sifat string dan numerik, tetapi ada batasan dengan dukungan dari daftar/set/peta dan nilai boolean.
Untuk informasi lebih lanjut, lihat halaman web proyek.
Gradle-Pitest-plugin secara default menggunakan versi pit yang sesuai (dengan nomor yang sama). Plugin dilepaskan hanya jika ada perubahan internal atau ada kebutuhan untuk menyesuaikan dengan perubahan dalam versi pit yang lebih baru. Ada mekanisme khusus untuk memungkinkan menggunakan versi pit terbaru (misalnya, rilis Bugfix) atau untuk menurunkan peringkat jika terjadi masalah yang terdeteksi. Untuk mengganti versi default, itu cukup untuk mengatur properti pitestVersion di penutupan konfigurasi pitest .
pitest {
pitestVersion = ' 2.8.1-the.greatest.one '
}pitest {
pitestVersion.set( " 2.8.1-the.greatest.one " )
}Dalam hal kesalahan terdeteksi ketika versi terbaru dari plugin digunakan dengan versi pit yang lebih baru, silakan angkat masalah.
Menempatkan Laporan Pit secara langsung di ${PROJECT_DIR}/build/reports/pitest dapat diaktifkan dengan Properti Konfigurasi timestampedReports :
pitest {
timestampedReports = false
}pitest {
timestampedReports.set( false )
}Kadang-kadang, mungkin berguna untuk men-debug eksekusi gradle-pitest-plugin atau eksekusi pit itu sendiri (misalnya NPE di pit) untuk memberikan laporan kesalahan yang masuk akal.
Eksekusi Gradle-Pitest-Plugin dapat debugged dari jarak jauh -Dorg.gradle.debug=true ke baris perintah.
Namun, karena Pit dimulai sebagai proses terpisah untuk men -debug eksekusi, argumen berikut perlu ditambahkan ke konfigurasi plugin:
pitest {
mainProcessJvmArgs = [ ' -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 ' ]
}pitest {
mainProcessJvmArgs.set( listOf ( " -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 " ))
}Jawaban singkatnya adalah: tidak secara langsung. Karena beberapa ketidakcocokan antara aplikasi Java "standar" dan aplikasi Android Java di Gradle, plugin tidak mendukung nanti. Untungnya, ada garpu Android dari plugin yang dikelola oleh Karol Wrótniak yang menyediakan versi yang dimodifikasi yang mendukung aplikasi Android (tetapi di sisi lain itu tidak berfungsi dengan aplikasi Java standar).
Plugin Gradle-Pitest 1.5.0 akhirnya melonggarkan cara (di mana) konfigurasi pitest telah ditempatkan (#62) yang juga menghasilkan peringatan penyusutan di Gradle 6+. Perubahan ini tidak kompatibel ke belakang dan sebagai hasilnya migrasi manual harus dilakukan - lihat catatan rilis. Ini hanya mempengaruhi proyek dengan plugin khusus eksternal.
Penting . Karena plugin Junit 5 untuk PIT jelas yang paling populer, dimulai dengan 1.4.7 ada cara yang disederhanakan bagaimana hal itu dapat dikonfigurasi dengan junit5PluginVersion (yang pasti direkomendasikan ). Lihat posting blog saya untuk mengetahui cara bermigrasi (itu juga memecahkan masalah kompatibilitas dengan 1.5.0+).
verbosity diperkenalkan dengan pit 1.7.1) Gradle-Pitest-Plugin yang dikloning dari repositori dapat dibangun menggunakan perintah gradle:
./gradlew build
Cara termudah untuk membuat toples dengan perubahan lokal yang terlihat di proyek lain adalah dengan menginstalnya ke repositori Maven lokal:
./gradlew install
Ada juga tes fungsional dasar yang ditulis menggunakan nebula-test yang dapat dijalankan dengan:
./gradlew funcTest
Gradle-Pitest-Plugin telah ditulis oleh Marcin Zajączkowski dengan bantuan dari kontributor. Penulis dapat dihubungi langsung melalui email: MSZPAK ATT WP DOTT PL. Ada juga blog Marcin yang tersedia: Solid Soft - Kode Kerja tidak cukup.
Plugin ini pasti memiliki beberapa bug dan fitur yang hilang. Mereka dapat dilaporkan menggunakan pelacak masalah. Namun, seringkali merupakan ide yang lebih baik untuk mengirim pertanyaan ke milis pit terlebih dahulu.
Plugin ini dilisensikan berdasarkan ketentuan lisensi Apache, versi 2.0.