このプラグインは、突然変異テストを実行し、PITを使用したグラードベースのプロジェクトの突然変異カバレッジを計算する機能を提供します。
build.gradleファイルのplugins構成にgradle-pitest-pluginを追加します。
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 "
}ピットタスクでgradleを呼び出します:
gradle pitest
測定後、PITによって作成されたレポート${PROJECT_DIR}/build/reports/pitestディレクトリに配置されます。
オプションでは、ビルドに依存します。
build . dependsOn ' pitest 'tasks.build {
dependsOn( " pitest " )
} pitestを作成する場合、別のタスクに依存する場合、名前で参照する必要があることに注意してください。それ以外の場合、Gradleはタスクではなく構成に対してpitestを解決します。
「 pluginsウェイ」にはいくつかの制限があります。プラグインの主要なリポジトリは中央リポジトリ(別名Maven Central)であるため、「一般的な方法」を使用してプロジェクトにプラグインを追加することもできます。
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 " )
}
}プラグインを適用します:
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 " )Junit 4を使用している場合、最もピットプラグインをさらに構成する必要はありません。カスタマイズは、 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
}慣用的でポータブルな構成:
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 )
} Gradle 8.1から開始します。単純なプロパティ割り当ては、Pluginの構成に使用できます( 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
} Gradleの構成は、すべての割り当てを非常に直感的にする本当のグルーヴィーなコードです。 PITで予想されるすべての値は、対応するタイプとして渡す必要があります。重要な違いは1つだけです。 PITがグラードル構成内の文字列のcom睡状態のリストを期待するパラメーターについては、文字列のリストを使用する必要があります(上記の例のoutputFormatsを参照)。
利用可能なすべてのコマンドラインパラメーターのリストについては、PITドキュメントを確認してください。プラグイン構成の予想されるパラメーター形式は、pitestpluginextensionから取得できます。
ライフをより楽にするために、 taskClasspath 、 mutableCodePaths 、 sourceDirs 、 reportDir 、 verbosity 、およびpitestVersionがプラグインによって自動的に設定されます。さらに、 sourceDirs 、 reportDir 、 verbosity 、およびpitestVersion 、ユーザーがオーバーライドできます。
Gradleプラグインに固有のパラメーターがいくつかあります。
testSourceSets PITで使用する必要のあるテストソースセットを定義します(デフォルトではSourceSets.Testで、別のソースセットにある統合テストを追加できます)mainSourceSets PITで使用する必要があるメインソースセットを定義します(デフォルトではSourceSet.main)mainProcessJvmArgs -Main Pit Processを起動するときに使用するJVM引数。 PIT自体が突然変異テストの実行のために別のJavaプロセスを起動することに注意してください。通常、 jvmArgs最大メモリサイズを増やすために使用する必要があります(#7を参照)。additionalMutableCodePaths -Mutateの追加クラス(別のモジュールでの生産コードとの統合テストに役立つ - #25を参照)useClasspathFile追加のクラスパスをファイルコンテンツとして渡すことを有効にします(デフォルトで無効になっているクラスパス要素がたくさんあるWindowsユーザーに役立ちます)fileExtensionsToFilterピットクラスパスから追加ファイル拡張子をフィルタリングする機能を提供します(#53を参照)例えば:
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は、Gradleがテストを実行するために使用するJVMとは無関係にJVMでテストを実行します。あなたのテストがいくつかのシステムプロパティを必要とする場合、プラグインがあなたのためにそれをしないので、あなたはそれらをPITに渡す必要があります:
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 " ))
} #170で報告されているように、Intellijのアイデアは、 build.gradleの(怠zyな構成の)最終フィールドの設定に関する警告を表示します。 Gradleは内部的にそれらの呼び出しを傍受し、代わりにセッターを使用するため、それは本当の問題ではありません。それにもかかわらず、読みやすいコードの犠牲を払って(以下の)警告を持たないことを好む人は、代わりにセッターを使用できます。
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は、マルチモジュールプロジェクトで使用できます。 Gradle-Pitest-Plugin依存関係は、ルートプロジェクトのBuildScript構成に追加する必要がありますが、プラグインをPITで処理する必要があるすべてのサブプロジェクトに適用する必要があります。ルートプロジェクト用にあるbuild.gradleのサンプルスニペット:
// 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 )
}
}
}プラグインinfo.solidsoft.pitest.aggregatorおよびtask pitestReportAggregate 。ルートプロジェクトは、 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 )
}
}
} pitest pitestReportAggregateタスクの実行の後、集約レポートは${PROJECT_DIR}/build/reports/pitestディレクトリに配置されます。
異なるサブプロジェクトにあるコードを変異させることができます。 Gradleは内部的に他のサブプロジェクトからの出力ディレクトリに依存せず、JARを構築し、そこからクラスを使用します。ピットの場合、これらはクラスファイルの2つの異なるセットであるため、それを機能させるには、 mainSourceSetsとadditionalMutableCodePaths両方を定義する必要があります。例えば:
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))
}
}上記は、Gradleチームが推奨する方法ですが、特定の場合には、より単純なソリューションも機能する必要があります。
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)
}
}機能テストスイートでは、最小限の作業マルチプロジェクトビルドを利用できます。
テストプラグインは、JUNIT4とは異なるテストフレームワークをサポートするために使用されます。
このリリースから始めて、Junit 5でPITを使用するために必要な構成は、次のように簡素化されています。
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 " )
}ご注意ください。ピット1.9.0には、Pit-Junit5-Plugin 1.0.0+が必要です。 Junit Jupiter 5.8(Junit Platform 1.8)では、Pitest-Junit5-Plugin 0.15+が必要であり、5.7(1.7)には0.14が必要です。ランタイムエラー( `nosuchmethoderror: 'java.util.optional org.junit.platform.commons.util.annotationutil.findannotation(java.lang.class、java.lang.lang.class'))などを回避するためにプロジェクトで使用されるJunit 5バージョンの右プラグインバージョンを設定します。
Junit 5の最小限の作業例は、機能テストスイートで利用できます。
Junit 5と他のピットプラグインを混ぜると、このセクションをブログ投稿で読むことができます。
ピットプラグインを有効にするには、BuildScriptの閉鎖で最もピット構成に追加するだけで十分です。例えば:
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 " )
}最小限の作業例は、機能テストスイートで利用できます。
ご注意ください。 Gradle-Pitest-Plugin <1.5.0では、ルートプロジェクトのbuildscriptスコープでpitest構成を作成する必要がありました。ご注意ください。 PIT 1.6.7から始めて、 testPlugin構成パラメーターを設定する必要はなくなりました。また、Gradleプラグインでは非推奨です。
デフォルトでは、すべてのGradle-Pitest-Pluginバージョンでは、事前定義されたピットバージョンを使用しています。通常、これはプラグインバージョンのリリース時に利用可能なPITの最新バージョンです。 pitest構成の閉鎖でpitestVersionパラメーターを使用することにより、オーバーライドできます。
非デフォルトのピットバージョンを使用する場合、場合によってはいくつかの問題が発生する可能性があることに注意してください。
特に記載されていない場合、Gradle-Pitest-Plugin 1.9.xはデフォルトでピット1.9.xを使用します。1.7.xはピット1.7.xなどを使用します。
バージョン1.7.0 Gradle-Pitest-Pluginから始めるには、Gradle 6.4が必要です。 Gradle 5.x(5.6+)サポートを備えた最新バージョンは1.6.0です。現在のバージョンは、Java 11の下でGradle 6.4、6.9.1、および7.4.2で自動的に煙検定されました。Java11+のテストは、互換性のあるバージョンのGradleとPITに限定されています。
Java 17の実験的サポートは、1.7.0+でテストできます。
バージョン1.3.0から始めて、生産されたバイナリにはJava 8が必要です(Gradleビルドの実行に使用されるJDKとして)。ただし、2021年9月にJava 17 LTSがリリースされ、Gradle-Pitest-Plugin 1.9.0からリリースされて、JDK <11のサポートは非推奨です(#299を参照)。
プラグイン自体の変更の詳細なリストについては、Changelogファイルを参照してください。
Gradleは、コマンドラインを介してプラグイン構成をオーバーライドする組み込みの方法を提供しませんが、Gradle-override-Pluginを使用してそれを行うことができます。
プロジェクトにGradle-override-Pluginを適用した後、次のことを行うことができます。
./gradlew pitest -Doverride.pitest.reportDir=build/pitReport -Doverride.pitest.threads=8
注記。メカニズムは、文字列と数値の特性に対して正常に機能するはずですが、リスト/セット/マップとブール値をサポートするには制限があります。
詳細については、プロジェクトWebページを参照してください。
Gradle-Pitest-Pluginは、デフォルトで対応するピットバージョン(同じ数字で)を使用します。プラグインは、内部変更がある場合のみ、または新しいピットバージョンの変更に合わせて調整する必要がある場合にのみリリースされます。最新のPITバージョン(例えば、Bugfixリリース)を使用したり、検出された問題の場合にPITをダウングレードできる専用のメカニズムがあります。デフォルトのバージョンをオーバーライドするには、 pitest構成の閉鎖にpitestVersionプロパティを設定するのに十分です。
pitest {
pitestVersion = ' 2.8.1-the.greatest.one '
}pitest {
pitestVersion.set( " 2.8.1-the.greatest.one " )
}プラグインの最新バージョンが新しいPITバージョンで使用されているときにエラーが検出された場合、問題を提起してください。
PITレポートを${PROJECT_DIR}/build/reports/pitestに直接配置すると、 timestampedReports Configurationプロパティで有効にできます。
pitest {
timestampedReports = false
}pitest {
timestampedReports.set( false )
}場合によっては、Gradle-Pitest-Pluginの実行またはPITの実行自体(PITのNPEなど)をデバッグして、賢明なエラーレポートを提供することが役立つ場合があります。
Gradle-Pitest-Pluginの実行は-Dorg.gradle.debug=true追加することで、リモートでデバッグできます。
ただし、PITが実行の別のプロセスとして開始されるため、次の引数をプラグイン構成に追加する必要があります。
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 " ))
}短い答えは次のとおりです。直接ではありません。 「標準」JavaアプリケーションとGradleのAndroid Javaアプリケーションとの間にいくつかの非互換性があるため、プラグインは後のものをサポートしません。幸いなことに、Androidアプリケーションをサポートする修正バージョンを提供するKarolWrótniakが維持したプラグインのAndroidフォークがあります(ただし、標準のJavaアプリケーションでは機能しません)。
Gradle-Pitestプラグイン1.5.0は、Gradle 6+で非推奨警告を生成していた最も(#62)の(# pitest )の方法(#62)の方法を最終的にリラックスさせました。この変更は後方互換性がなく、その結果、手動の移行を行う必要があります。リリースノートを参照してください。これは、外部カスタムプラグインを使用したプロジェクトのみに影響します。
重要。ピット用のJunit 5プラグインは間違いなく最も人気があるため、1.4.7から始まることは、 junit5PluginVersionで構成する方法が簡素化されています(これは間違いなく推奨されます)。私のブログ投稿を参照して、移行方法を調べます(1.5.0+の互換性の問題も解決します)。
verbosityオプションも参照) リポジトリからクローニングされたGradle-Pitest-Pluginは、Gradleコマンドを使用して構築できます。
./gradlew build
別のプロジェクトでローカル変更を表示した瓶を作成する最も簡単な方法は、ローカルMavenリポジトリにインストールすることです。
./gradlew install
また、次のように実行できる星雲テストを使用して書かれた基本的な機能テストもあります。
./gradlew funcTest
Gradle-Pitest-Pluginは、貢献者の助けを借りてMarcinZajączkowskiによって書かれています。著者は、電子メールで直接連絡できます:mszpak att wp dott pl。 Marcinのブログもあります:Solid Soft-作業コードでは十分ではありません。
プラグインには、確かにいくつかのバグと機能がありません。問題トラッカーを使用して報告できます。ただし、最初にピットメーリングリストに質問を送信する方が良いアイデアです。
プラグインは、Apacheライセンスバージョン2.0の条件に基づいてライセンスされています。