플러그인은 돌연변이 테스트를 수행하고 PIT로 Gradle 기반 프로젝트의 돌연변이 범위를 계산할 수있는 능력을 제공합니다.
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 "
}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 블록에서 수행됩니다.
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의 구성은 모든 과제를 매우 직관적으로 만드는 실제 그루비 코드입니다. PIT에 의해 예상되는 모든 값은 해당 유형으로 전달되어야합니다. 중요한 차이점은 하나뿐입니다. PIT가 Gradle 구성에서 COMA 분리 문자열 목록을 기대하는 매개 변수의 경우 문자열 목록을 사용해야합니다 (위의 예에서 outputFormats 참조).
사용 가능한 모든 명령 줄 매개 변수 목록에 대한 PIT 문서를 확인하십시오. 플러그인 구성의 예상 매개 변수 형식은 PitestPluginextension에서 가져올 수 있습니다.
인생을 더 쉽게하기 위해 taskClasspath , mutableCodePaths , sourceDirs , reportDir , verbosity 및 pitestVersion 플러그인에 의해 자동으로 설정합니다. 또한 sourceDirs , reportDir , verbosity 및 pitestVersion 사용자가 재정의 할 수 있습니다.
Gradle 플러그인에 대한 몇 가지 매개 변수가 있습니다.
testSourceSets PIT에서 사용해야하는 테스트 소스 세트를 정의합니다 (기본적으로 Sourcensets.Test. 그러나 다른 소스 세트에 위치한 통합 테스트를 추가 할 수 있음)mainSourceSets PIT에서 사용해야하는 기본 소스 세트를 정의합니다 (기본적으로 sourcesets.main)mainProcessJvmArgs 주 피트 프로세스를 시작할 때 사용되는 JVM 인수; PIT 자체는 돌연변이 테스트 실행을위한 또 다른 Java 프로세스를 시작하고 일반적으로 jvmArgs 예를 들어 최대 메모리 크기를 늘리는 데 사용해야합니다 ( #7 참조).additionalMutableCodePaths mutableCodePaths- 돌연변이에 대한 추가 클래스 (다른 모듈의 생산 코드와 통합 테스트에 유용합니다 - #25 참조)useClasspathFile 추가 클래스 경로를 파일 컨텐츠로 전달할 수 있습니다 (기본적으로 비활성화 된 클래스 경로 요소가 많은 Windows 사용자에게 유용합니다)fileExtensionsToFilter PIT ClassPath에서 추가 파일 확장을 필터링 할 수있는 기능을 제공합니다 ( #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에서 테스트를 실행합니다. 테스트에 일부 시스템 속성이 필요한 경우 플러그인이 수행하지 않으므로 시스템 속성을 전달해야합니다.
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 의존성은 루트 프로젝트의 BuildScript 구성에 추가되어야하며 플러그인은 PIT로 처리 해야하는 모든 하위 프로젝트에 적용되어야합니다. Root 프로젝트에 위치한 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 보고서를 집계 할 수 있습니다. 루트 프로젝트를 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을 작성하고 클래스를 사용합니다. 구덩이의 경우 두 가지 다른 클래스 파일 세트이므로 작동하려면 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 " )
}참고하십시오 . 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.platform.commons.util.annotationutils.findannotation (java.lang.class, java.lang.class, bolean))).
Junit 5의 최소 작업 예는 기능 테스트 스위트에서 사용할 수 있습니다.
Junit 5를 다른 Pit 플러그인과 혼합하려면 내 블로그 게시물 에서이 섹션을 읽을 수 있습니다.
핏 플러그인을 활성화하기 위해서는 빌드 스크립트 폐쇄에서 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에서는 루트 프로젝트의 buildscript 범위에서 pitest 구성을 만들어야했습니다. 참고하십시오. PIT 1.6.7부터 더 이상 testPlugin 구성 매개 변수를 설정할 필요가 없습니다. 또한 Gradle 플러그인에서도 더 이상 사용되지 않습니다.
기본적으로 모든 Gradle-Pitest-Plugin 버전은 사전 정의 된 PIT 버전을 사용합니다. 일반적으로 플러그인 버전을 공개 할 때 사용 가능한 최신 버전의 PIT 버전입니다. pitestVersion 매개 변수를 pitest 구성 클로저에서 사용하여 재정의 할 수 있습니다.
비 기본 핏 버전을 사용할 때 일부 문제가있을 수 있습니다.
달리 명시되지 않으면 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의 호환 버전으로 제한됩니다.
Java 17에 대한 실험 지원은 1.7.0+로 테스트 할 수 있습니다.
버전 1.3.0부터 생산 된 바이너리에는 Java 8이 필요합니다 (Gradle 빌드를 실행하는 데 사용되는 JDK). 그러나 Gradle-Pitest-Plugin 1.9.0으로 시작하여 2021 년 9 월에 Java 17 LT가 출시되면 JDK <11에 대한 지원은 더 이상 사용되지 않습니다 ( #299 참조).
플러그인 자체의 변경 사항에 대한 자세한 내용은 Changelog 파일을 참조하십시오.
Gradle은 명령 줄을 통해 플러그인 구성을 재정의하는 내장 방법을 제공하지 않지만 Gradle-Override-Plugin을 사용하여이를 수행 할 수 있습니다.
프로젝트 에서 Gradle-Override-Plugin을 적용한 후 다음을 수행 할 수 있습니다.
./gradlew pitest -Doverride.pitest.reportDir=build/pitReport -Doverride.pitest.threads=8
메모. 메커니즘은 문자열 및 숫자 특성에 대해 잘 작동해야하지만 목록/세트/맵 및 부울 값을 지원하는 제한 사항이 있습니다.
자세한 내용은 프로젝트 웹 페이지를 참조하십시오.
Gradle-Pitest-Plugin은 기본적으로 해당 PIT 버전 (동일한 숫자)을 사용합니다. 플러그인은 내부 변경 사항이 있거나 새로운 PIT 버전의 변경 사항에 맞게 조정 해야하는 경우에만 해제됩니다. 최신 피트 버전 (예 : 버그 픽스 릴리스)을 사용할 수있는 전용 메커니즘이 있습니다. 기본 버전을 무시하기 위해서는 pitestVersion 속성을 pitest Configuration Closure에서 설정하는 것으로 충분합니다.
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 직접 배치 할 수 있습니다.
pitest {
timestampedReports = false
}pitest {
timestampedReports.set( false )
}때로는 현명한 오류 보고서를 제공하기 위해 Gradle-Pitest-Plugin 실행 (예 : 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 응용 프로그램 간의 비 호환성으로 인해 플러그인은 나중에 지원하지 않습니다. 운 좋게도, Karol Wrótniak가 관리하는 플러그인의 안드로이드 포크가있어 Android 애플리케이션을 지원하는 수정 된 버전을 제공하지만 반면에 표준 Java 응용 프로그램에서는 작동하지 않습니다).
Gradle-Pitest 플러그인 1.5.0은 최종적으로 6 개 이상의 감가 상각 경고를 생성하는 pitest 구성 (#62)이 어떻게 (#62) 배치 된 방법을 완화했습니다. 이 변경은 후진적 인 호환되지 않으며 결과적으로 수동 마이그레이션을해야합니다. 릴리스 노트를 참조하십시오. 이는 외부 사용자 정의 플러그인의 프로젝트에만 영향을 미칩니다.
중요한 . Junit 5 플러그인 용 플러그인이 확실히 가장 인기가 있기 때문에 1.4.7로 시작하여 junit5PluginVersion 으로 구성 할 수있는 방법이 단순화 된 방법이 있습니다 (확실히 권장 ). 마이그레이션 방법을 찾으려면 내 블로그 게시물을 참조하십시오 (또한 1.5.0+로 호환성 문제를 해결).
verbosity 옵션 참조) 저장소에서 클로닝 된 Gradle-Pitest-Plugin은 Gradle 명령을 사용하여 구축 할 수 있습니다.
./gradlew build
다른 프로젝트에서 로컬 변경 사항이있는 항아리를 만드는 가장 쉬운 방법은 로컬 Maven 저장소에 설치하는 것입니다.
./gradlew install
또한 Nebula-test를 사용하여 작성된 기본 기능 테스트도 다음과 같이 실행할 수 있습니다.
./gradlew funcTest
Gradle-Pitest-Plugin은 Marcin Zajączkowski가 기고자들의 도움으로 작성했습니다. 저자는 이메일을 통해 직접 연락 할 수 있습니다 : MSZPAK ATT WP DOTT PL. Marcin의 블로그도 있습니다. Solid Soft -Working Code로는 충분하지 않습니다.
플러그인에는 확실히 몇 가지 버그와 누락 된 기능이 있습니다. 문제 추적기를 사용하여보고 할 수 있습니다. 그러나 먼저 피트 메일 링리스트에 질문을 보내는 것이 종종 더 나은 아이디어입니다.
플러그인은 Apache 라이센스의 조건 인 버전 2.0에 따라 라이센스가 부여됩니다.