#gradle
#gradle
Вопрос:
Я хочу использовать мои файлы исходного кода с openclover во время обычной компиляции, потому что я хочу использовать его в серверной среде. Идея состоит в том, чтобы запустить наши тесты selenium с инструментальным исходным кодом и таким образом получить покрытие кода. Также это можно использовать для воспроизведения стандартных сценариев использования и поиска горячих точек для оптимизации. Для этого стандартная сборка должна использовать файлы исходного кода.
Я создал build.gradle, подобный показанному здесь.
Фрагмент:
sourceSets {
clover {
java {
srcDir "$buildDir/sources-instr"
}
}
}
task cloverInstr() {
inputs.files sourceSets.main.allJava
outputs.dir "$buildDir/sources-instr"
doFirst {
[...]
com.atlassian.clover.CloverInstr.mainImpl(args)
}
}
cloverClasses.dependsOn cloverInstr
test {
def cloverClasspath = configurations.testRuntime configurations.cloverRuntime sourceSets.test.output sourceSets.clover.output
classpath = cloverClasspath
}
Это изменяет тестовую задачу, чтобы использовать классы из исходного набора clover вместо классов из основного исходного набора. Однако я хотел бы предварительно обработать классы в основном исходном наборе.
Итак, моя идея такова: main: instrument -> compile -> jar
, в то время как показанное решение использует два набора исходных текстов:
main: compile -> jar
clover: instrument -> compile -> test
Каким был бы наилучший способ обработать исходные файлы с помощью clover и передать их в компиляцию? В идеале у меня даже был бы переключатель, который включает инструментирование или отключает его.
Ответ №1:
Замена исходных наборов работает. При использовании -PwithClover
активируется следующий раздел. Это изменяет основной исходный набор на путь, по которому будет находиться инструментальный код. Затем задача компиляции получает зависимость, которая привязывает код к тому же пути.
Это немного халтурно, но это работает.
if (project.hasProperty("withClover")) {
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.openclover:clover:4.3.1'
}
}
configurations {
cloverRuntime
cloverRuntime.extendsFrom cloverCompile
}
//swap src dirs, main is now the instrumented and clover the actual srcs
sourceSets {
main {
java {
srcDirs = ["$buildDir/sources-instr"]
}
}
clover {
java {
srcDirs = ["src/main/java"]
}
}
}
dependencies {
//compile 'org.openclover:clover:4.3.1'
// make sure clover is available in the jar
embed 'org.openclover:clover:4.3.1'
}
//instrumentation task
task cloverInstr() {
inputs.files sourceSets.clover.allJava
outputs.dir "${buildDir}/sources-instr"
doFirst {
def argsList = ["--initstring", "${buildDir}/clover/clover.db",
"-d", "${buildDir}/sources-instr"]
argsList.addAll(inputs.files.files.collect({ file ->
file.absolutePath
}))
String[] args = argsList.toArray()
com.atlassian.clover.CloverInstr.mainImpl(args)
}
}
//create src files for main src set
compileJava.dependsOn "cloverInstr"
}