該插件提供了執行突變測試併計算帶有PIT的基於Gradle項目的突變覆蓋範圍的能力。
將gradle-pitest-plugin添加到build.gradle文件中的plugins配置:
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 "
}使用Pitest任務致電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 Block中進行自定義:
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開始,簡單屬性分配可用於配置插件(而不是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中的配置是真正的Groovy代碼,使所有作業都非常直觀。 PIT期望的所有值應作為相應類型傳遞。只有一個重要區別。對於PIT期望在Gradle配置中昏迷的字符串列表的參數,應使用字符串列表(請參見上面示例中的outputFormats )。
檢查PIT文檔中的所有可用命令行參數的列表。插件配置中的預期參數格式可以從PitestPluginextension中獲取。
為了使生活更容易taskClasspath ,該插件會自動設置mutableCodePaths , sourceDirs , reportDir ,詳細信息, verbosity和pitestVersion 。此外,用戶可以覆蓋sourceDirs reportDir , verbosity和pitestVersion 。
Gradle插件有一些特定的參數:
testSourceSets定義測試源集應由PIT使用的測試源集(默認情況下sourcesets.test,但允許添加位於不同源集中的集成測試)mainSourceSets定義了PIT應該使用的主要源集(默認來源)mainProcessJvmArgs -JVM參數在啟動主坑進程時將使用;請注意,PIT本身會啟動另一個Java進程以進行突變測試執行,通常應使用jvmArgs來增加最大的內存大小(請參閱#7);additionalMutableCodePaths突變的其他類(對於與不同模塊中的生產代碼集成測試有用 - 請參見#25)useClasspathFile啟用其他類Path作為文件內容(對具有很多類Path元素的Windows用戶有用,默認為禁用)fileExtensionsToFilter提供了從Pit Class Path過濾其他文件擴展的能力(請參閱#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在JVM中執行測試,獨立於Gradle用來執行測試的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 Idea所報導,顯示了有關在build.gradle中設置最終字段(懶惰配置)的警告。這不是一個真正的問題,因為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依賴項應添加到根項目中的構建單詞配置中,而插件必須在所有子標記中應用於應使用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來匯總多模塊項目的Pitest報告。 Root Project必須適當配置以使用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 Directory中。
可以突變位於不同子彈中的代碼。 Gradle在內部不依賴其他子標記的輸出目錄,而是構建JAR並使用其中的類。對於坑,這些是兩組不同的類文件集,因此為了使其起作用,要定義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相比的不同測試框架。
從此版本開始,將pit與Junit 5一起使用所需的配置已簡化為以下內容:
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 " )
}請注意。 PIT 1.9.0需要Pitest-Junit5-Plugin 1.0.0+。 Junit Jupiter 5.8(Junit Platform 1.8)需要Pitest-Junit5-Plugin 0.15+,而5.7(1.7)的要求為0.14。設置了項目中使用的junit 5版本的正確插件版本,以避免運行時錯誤(例如`nosuchmethoderror:'java.util.optional org.junit.junit.junit.platform.commons.util.annotitation.annotationutils.findannotils.findannotation(java.lang.class.class.class,java.lang.lang.lang.class,boolean))。
Junit 5的最小工作示例可在功能測試套件中提供。
對於將Junit 5與其他Pit插件混合在一起,您可以在我的博客文章中閱讀此部分。
要啟用PIT插件,足以將其添加到buildscript閉合中的Pitest配置中。例如:
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中,必須在root Project的buildscript範圍中創建pitest配置。請注意。從PIT 1.6.7開始,不再需要設置testPlugin配置參數。它在Gradle插件中也被棄用。
默認情況下,每個Gradle-pitest-Plugin版本都使用預定義的坑版本。通常,這是發布插件版本時可用的最新發布版本。可以通過在pitest配置閉合中使用pitestVersion參數來覆蓋它。
請注意,在某些情況下,使用非默認坑版本時可能存在一些問題。
如果沒有另行說明,Gradle-pitest-Plugin 1.9.x默認使用PIT 1.9.x,1.7.x使用PIT 1.7.X等。最小支持的PIT版本為1.7.1。
從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自動測試了當前版本。使用Java 11+的測試僅限於Gradle和Pit的兼容版本。
可以用1.7.0+測試Java 17的實驗支持。
從版本1.3.0開始生產的二進製文件需要Java 8(作為用於運行Gradle構建的JDK)。但是,擁有Java 17 LTS於2021年9月發布,從Gradle-Pitest-Plugin 1.9.0開始,對JDK <11的支持已被棄用(請參閱#299)。
有關插件本身更改的更詳細列表,請參見ChangElog文件。
Gradle不提供通過命令行覆蓋插件配置的內置方法,但是可以使用Gradle-oferride-Plugin來做到這一點。
在您的項目中應用了gradle-oferride-plugin後,可以按照以下操作:
./gradlew pitest -Doverride.pitest.reportDir=build/pitReport -Doverride.pitest.threads=8
筆記。該機制應適用於字符串和數字屬性,但在支持列表/集合/地圖和布爾值的情況下存在局限性。
有關更多信息,請參見項目網頁。
默認情況下,Gradle-Pitest-Plugin使用相應的坑版本(具有相同的數字)。插件僅在發生內部更改或需要適應新的PIT版本的更改時才會發布該插件。有一種專門的機制可以允許使用最新的PIT版本(例如,BugFix發行版)或在發生髮現的問題的情況下降級坑。要覆蓋默認版本,足以在pitest配置閉合中設置pitestVersion屬性。
pitest {
pitestVersion = ' 2.8.1-the.greatest.one '
}pitest {
pitestVersion.set( " 2.8.1-the.greatest.one " )
}如果檢測到插件的最新版本與較新的坑版本一起檢測到的錯誤,請提出問題。
可以將PIT報告直接放入${PROJECT_DIR}/build/reports/pitest可以使用timestampedReports配置屬性啟用:
pitest {
timestampedReports = false
}pitest {
timestampedReports.set( false )
}有時,調試Gradle-Pitest-Plugin執行或PIT執行本身(例如PIT中的NPE)以提供明智的錯誤報告可能很有用。
可以通過添加-Dorg.gradle.debug=true到命令行,可以遠程調試gradle-pitest-plugin執行。
但是,由於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應用程序之間的某些不兼容,該插件不支持以後。幸運的是,Karolwrótniak維護的插件的Android叉子提供了支持Android應用程序的修改版本(但另一方面,它與標準Java應用程序不起作用)。
Gradle-pitest插件1.5.0最終放鬆了(位置) pitest配置的方式(#62),這也在Gradle 6+中生成折舊警告。此更改不是向後兼容的,因此必須進行手動遷移 - 請參閱發行說明。這僅使用外部自定義插件影響項目。
重要的。由於PIT的Junit 5插件絕對是最受歡迎的,從1.4.7開始,有一種簡化的方法如何使用junit5PluginVersion進行配置(絕對建議使用)。請參閱我的博客文章以了解如何遷移(它也解決了1.5.0+的兼容性問題)。
verbosity選項) 可以使用gradle命令構建從存儲庫克隆的gradle-pitest-plugin:
./gradlew build
在另一個項目中可見的帶有本地更改的罐子的最簡單方法是將其安裝到本地Maven存儲庫中:
./gradlew install
也有使用星雲測試編寫的基本功能測試,可以運行:
./gradlew funcTest
MarcinZajączkowski在貢獻者的幫助下,Gradle-Pitest-Plugin是由MarcinZajączkowski撰寫的。可以直接通過電子郵件與作者聯繫:MSZPAK ATT WP DOTT PL。還有Marcin的博客可用:實心軟 - 工作代碼還不夠。
該插件肯定具有一些錯誤和缺少功能。可以使用問題跟踪器進行報告。但是,首先將問題發送到Pit郵件列表通常是一個更好的主意。
該插件已根據Apache許可證的條款獲得許可,版本2.0。