Плагин обеспечивает возможность выполнять тестирование на мутации и рассчитать охват мутаций проектов на основе градл с ямой.
Добавьте Gradle-Pitest-Plugin в конфигурацию plugins в вашем файле build.gradle :
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 pitest
После измерений отчет, созданный PIT, будет размещен в ${PROJECT_DIR}/build/reports/pitest Directory.
При желании сделать это зависеть от сборки:
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. Простой назначение свойств может использоваться для настройки плагина (вместо метода 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 Code, который делает все задания очень интуитивно понятными. Все значения, ожидаемые PIT, должны передаваться в виде соответствующих типов. Есть только одно важное отличие. Для параметров, где PIT ожидает комы, разделенного списка строк в конфигурации Gradle, следует использовать список строк (см. outputFormats в примере выше).
Проверьте документацию по яме для списка всех доступных параметров командной строки. Ожидаемый формат параметров в конфигурации плагина может быть взят из PitestPluginextension.
Чтобы сделать жизнь проще taskClasspath , mutableCodePaths , sourceDirs , reportDir , verbosity и pitestVersion автоматически устанавливаются плагином. Кроме того, sourceDirs , reportDir , verbosity и pitestVersion могут быть переопределены пользователем.
Есть несколько параметров, специфичных для плагина Gradle:
testSourceSets - определяет исходные наборы тестирования, которые следует использовать PIT (по умолчанию источников.mainSourceSets - определяет основные исходные наборы, которые должны использоваться PIT (по умолчанию источников. Main)mainProcessJvmArgs - JVM -аргументы, которые будут использоваться при запуске основного процесса ямы; Запишите, что сама яма запускает еще один Java -процессы для выполнения тестирования на мутации, и обычно следует использовать jvmArgs , например, для увеличения максимального размера памяти (см. #7);additionalMutableCodePaths - Дополнительные классы для MITTET (полезны для интеграционных тестов с производственным кодом в другом модуле - см. #25)useClasspathFile - позволяет передавать дополнительную часть ClassPath в качестве содержимого файла (полезно для пользователей Windows с множеством элементов ClassPath, отключенных по умолчанию)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 выполняет тесты в JVM, независимо от JVM, используемого Gradle для выполнения тестов. Если ваши тесты требуют некоторых свойств системы, вы должны передать их, так как плагин не сделает этого для вас:
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 . Это не реальная проблема, поскольку Градл внутренне перехватывает эти вызовы и вместо этого использует сеттер. Тем не менее, люди, которые предпочитают не иметь (меньше) предупреждений за стоимость менее читаемого кода, могут вместо этого использовать сеттеры, например:
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 в корневом проекте, в то время как плагин должен быть применен во всех подпроектах, которые следует обрабатывать с помощью ямы. Образец фрагмента от 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 и задачи 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 и использует из него классы. Для ямы это два разных набора файлов классов, поэтому для того, чтобы она работала, это необходимо для определения как 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))
}
}Выше приведено способ, рекомендованный командой Градл, но в конкретных случаях также должно работать более простое решение:
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)
}
}Минимальная работающая многопроектная сборка доступна в Suite Funcation Tests.
Тестовые плагины используются для поддержки различных тестовых каркасов, чем Junit4.
Начиная с этого выпуска, конфигурация, необходимая для использования ямы с 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 " )
}Пожалуйста, обрати внимание . Яма 1.9.0 Требуется Pitest-Junit5-Plugin 1.0.0+. Junit Jupiter 5.8 (платформа Junit 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, boolean)).
Минимальный рабочий пример для JUNIT 5 доступен в комплекте функциональных тестов.
Для смешивания Junit 5 с другими плагинами ямы вы можете прочитать этот раздел в моем блоге.
Чтобы включить плагины PIT, этого достаточно, чтобы добавить его в самую конфигурацию в закрытии 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 самая pitest конфигурация должна была быть создана в области buildscript для корневого проекта. Пожалуйста, обрати внимание. Начиная с ямы 1.6.7, ему больше не нужно устанавливать параметр конфигурации testPlugin . Это также устарело в плагина Gradle.
В каждой версии Gradle-Pitest-Plugin по умолчанию используется предопределенная версия для ямы. Обычно это последняя выпущенная версия PIT, доступную во время выпуска версии плагина. Он может быть переопределен с использованием параметра pitestVersion в самой pitest закрытии конфигурации.
Пожалуйста, имейте в виду, что в некоторых случаях могут возникнуть некоторые проблемы при использовании версий без по умолчанию.
Если не указано иное, Gradle-Pitest-Plugin 1.9.x По умолчанию использует яму 1.9.x, 1.7.x использует яму 1.7.x и т. Д. Минимальная поддерживаемая версия ямы составляет 1.7.1.
Начиная с версии 1.7.0 Gradle-Pitest-Plugin требует Gradle 6.4. Последняя версия с поддержкой Gradle 5.x (5.6+) составляет 1,6,0. Текущая версия была автоматически протестирована с дымом с Gradle 6.4, 6.9.1 и 7.4.2 под Java 11. Тесты с Java 11+ ограничены совместимыми версиями Gradle и Pit.
Экспериментальная поддержка Java 17 может быть проверена с 1,7,0+.
Начиная с версии 1.3.0, производственные двоичные файлы требуют Java 8 (как JDK, используемый для запуска сборки Gradle). Однако, выпущенная Java 17 LTS в сентябре 2021 года, начиная с 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
Примечание. Механизм должен работать нормально для строковых и числовых свойств, но существуют ограничения при поддержке списков/наборов/карт и логических значений.
Для получения дополнительной информации см. Проектную веб -страницу.
Gradle-Pitest-Plugin по умолчанию использует соответствующую версию PIT (с тем же номером). Плагин выпускается только в том случае, если существуют внутренние изменения или необходимо настраивать изменения в более новой версии ямы. Существует выделенный механизм, позволяющий использовать последнюю версию PIT (например, выпуск Bugfix) или для понижения ямы в случае обнаруженных проблем. Чтобы переопределить версию по умолчанию, этого достаточно, чтобы установить свойство pitestVersion в закрытии pitest Configuration.
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 или само выполнение ямы (например, NPE в яме) для предоставления разумного отчета об ошибках.
Выполнение Gradle-Pitest-Plugin может быть отлажено удаленным с добавлением -Dorg.gradle.debug=true в командную строку.
Однако, поскольку яма запускается как отдельный процесс для отладки выполнения. Следующие аргументы должны быть добавлены в конфигурацию плагина:
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 и приложениями Android Java в Gradle, плагин не поддерживает позже. К счастью, существует вилка Android с плагином, поддерживаемая Karol Wrotniak, которая предоставляет модифицированную версию, поддерживающую приложения Android (но с другой стороны, он не работает со стандартными приложениями Java).
Плагин Gradle-Pitest 1.5.0, наконец, расслабился так, как (где) была размещена самая pitest конфигурация (#62), которая также генерировала предупреждения об ископке в Градле 6+. Это изменение не является обратным совместимым, и в результате должна быть сделана ручная миграция - см. Примечания к выпуску. Это влияет только на проект только с внешними пользовательскими плагинами.
Важный . Поскольку плагин JUNIT 5 для PIT, безусловно, самый популярный, начиная с 1.4.7, существует упрощенный способ, как его можно настроить с помощью junit5PluginVersion (что определенно рекомендуется ). Смотрите мой пост в блоге, чтобы узнать, как мигрировать (он также решает проблему совместимости с 1.5.0+).
verbosity , представленная с ямой 1.7.1) Gradle-Pitest-Plugin, клонированный из репозитория, может быть построена с помощью команды Gradle:
./gradlew build
Самый простой способ сделать банку с локальными изменениями, видимыми в другом проекте, - это установить ее в местный репозиторий Maven:
./gradlew install
Существуют также основные функциональные тесты, написанные с использованием тестирования туманности, которые можно запустить:
./gradlew funcTest
Gradle-Pitest-Plugin был написан Марцином Зайчковски с помощью участников. С автором можно связаться непосредственно по электронной почте: MSZPAK ATT WP Dott PL. Существует также блог Марцина: Сплошного мягкого - рабочего кода недостаточно.
Плагин, безусловно, имеет некоторые ошибки и отсутствующие функции. Их можно сообщить, используя трекер проблемы. Тем не менее, часто бывает лучшей идеей, чтобы сначала отправить вопросы в список рассылки пит.
Плагин лицензирован в соответствии с условиями лицензии Apache, версия 2.0.