Покрытие Jacoco Unit and Integration Tests - индивидуальное и общее [закрыто]
У меня есть проект (ProjectA), который содержит несколько юнит-тестов и интеграционных тестов.
Ниже приводится структура.
ProjectA - src / java (исходный код Java)
- test / java (юнит-тесты Junit)
- test / resources (ресурсы, необходимые для юнит-тестов Junit)
- src / java-test (интеграционные тесты)
- conf (содержит XML-файлы, необходимые для сборки / тестирования / компиляции)
Я запускаю следующие команды - Все они работают, но у меня есть сомнения в том, как конфигурации, которые у меня есть в файлах build.gradle / GRADLE_HOME / init.d / *. Gradle, влияют на то, что я 'Я получаю.
Кажется, яЯ что-то упускаю и не получаю, где я хочу, что
Команды:
- gradle чистой сборки - работает нормально
Gradle чистой сборки JacocoTestReport - он работает нормально.
- gradle clean buildgrationTest jacocoTestReport - он работает нормально (если у меня запущен экземпляр tomcat и запущен в другом окне замазки для того же ProjectA).
После 3-й операции пули я вижу дополнительную папку "строить» и его подпапки (кроме того, что 's извлечены из источника / контроля версий) в моей рабочей области Jenkins рабочих мест.
то есть под - JenkinsWorkspace /
Build-
классы (содержит файлы .class для следующих, которые упоминаются как один из раздела sourceSets)
---- интеграцияТест
---- главный
---- тестовое задание-
Ресурсы (это содержит все файлы .properties / .xml, которые были в разделе "конф» папка в системе контроля версий.
отчеты (содержит файлы .xml / .html для PMD / CheckStyle / Findbugs и результаты тестов для модульных или ИТ-тестов, но НЕ для обоих). ---- контрольный стиль
---- findbugs
---- вечера
---- Якоко
---- тесты (Заметкаэто множественное число, т.е.нетестовое задание" который определяется как одна запись в sourceSets) -
jacoco (Это содержит 2 .exec-файла, т.е. i.e. test.exec иgrationTest.exec имеют разный размер файла)
---- test.exec
---- IntegrationTest.exec-
jacocoHtml (Эта папка содержит много папок (содержащих файлы .html) и в основном "index.html» под ним.
---- Somexxxfolders
---- ---- Somexxfolder 'файлы s.html
---- index.html
---- другие etc файлы / папки-
результаты теста (Он содержит некоторые XML-файлы, НО только для юнит-тестов или интеграционных тестов - ноне для обоих типов испытаний в данный момент).
т.е. если я бегуGradle чистой сборки ", затем вы'Посмотрю XML-файлы, связанные с модульным тестом, и если я запустлю "Gradle Clean Build Integration », затем XML-файлы модульного теста перезаписываются, и я вижу, что XML-файлы относятся только к / генерируются задачей интеграции.
Ниже приведен один из самых распространенных вариантов (файл GRADLE_HOME / init.d / some.common.gradle)
//
//Extra file can hold global Gradle settings so that these dont have to be inserted in project
//specific build.gradle file.
//Filename: extraN.common.gradle
allprojects {
apply plugin: 'java'
apply plugin: 'pmd'
apply plugin: 'findbugs'
apply plugin: 'checkstyle'
apply plugin: 'jacoco'
apply plugin: 'sonar-runner'
tasks.withType(Compile) {
options.debug = true
options.compilerArgs = ["-g"]
}
sourceSets {
main {
java {
// MOTE: If your project's build.gradle specify the sourceSet section, the following
// values will be overwritten by what project's build.gradle will set.
//
// If you project's sourceSet structure if different in each project, then in this
// global common .gradle file, you can define srcDir for main or other sections like
// test, integrationTest etc as shown below -- commented out. If that's the case,
// then uncomment the below line and comment out using // -- srcDir 'src/java' line
// for sourceSets.main.java section. This rule applies to other sections as well.
// srcDir 'no_src_dir_set_yet'
srcDir 'src/java'
}
resources {
srcDir 'conf'
}
}
test {
java {
srcDir 'test/java'
}
resources {
srcDir 'test/resources'
srcDir 'conf'
}
}
integrationTest {
java {
srcDir 'src/java-test'
}
resources {
srcDir 'conf'
}
}
}
def sonarServerUrl = "dev.sandbox.server.com"
sonarRunner {
sonarProperties {
property "sonar.host.url", "http://$sonarServerUrl:9000"
property "sonar.jdbc.url", "jdbc:h2:tcp://$sonarServerUrl:9092/sonar"
property "sonar.jdbc.driverClassName", "org.h2.Driver"
property "sonar.jdbc.username", "sonar"
property "sonar.jdbc.password", "sonar"
properties ["sonar.sources"] += sourceSets.main.allSource.srcDirs
//properties ["sonar.tests"] += sourceSets.test.java.srcDirs
properties ["sonar.tests"] += sourceSets.integrationTest.allSource.srcDirs
}
}
checkstyle {
configFile = new File(rootDir, "config/checkstyle.xml")
ignoreFailures = true
//sourceSets = [sourceSets.main, sourceSets.test, sourceSets.integrationTest]
sourceSets = [sourceSets.main]
}
findbugs {
ignoreFailures = true
sourceSets = [sourceSets.main]
}
pmd {
ruleSets = ["basic", "braces", "design"]
ignoreFailures = true
}
jacoco {
toolVersion = "0.6.2.201302030002"
reportsDir = file("$buildDir/customJacocoReportDir")
}
task testReport(type: TestReport) {
destinationDir = file("$buildDir/reports/allTests")
}
test {
jacoco {
//destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
destinationFile = file("$buildDir/jacoco/test.exec")
//classDumpFile = file("$buildDir/jacoco/classpathdumps")
classDumpFile = file("$buildDir/build/classes/test")
}
}
jacocoTestReport {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
reports {
xml{
enabled true
destination "${buildDir}/reports/jacoco/jacoco.xml"
}
csv.enabled false
html{
enabled true
destination "${buildDir}/jacocoHtml"
}
}
additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
//additionalSourceDirs = files([sourceSets.main.allJava.srcDirs, xxxx, 'xxxxyyyy' ])
}
}
build.gradle файл выглядит так:
import com.tr.ids.gradle.CustomFileUtil
apply plugin: 'CustomSetup'
apply plugin: 'java'
apply plugin: 'customJarService'
apply plugin: 'customWarService'
sourceSets {
main {
java {
srcDir 'src/java'
}
}
test {
java {
srcDir 'test/java'
}
resources {
srcDir 'test/resources'
srcDir 'conf'
}
}
integrationTest {
java {
srcDir 'src/java-test'
}
}
}
// Read dependency lists from external files. Our custom plugin reads a dep-xxx.txt file for compile/test/war related .jar file entries
// where each entry is like: groupid:artifactid:x.x.x
// and these artifact jars are available in Artifactory
List depListCompile = customFileUtil.readIntoList( "$projectDir/dep-compile.txt" )
List depListTest = customFileUtil.readIntoList( "$projectDir/dep-testArtifacts.txt" )
List depListWar = customFileUtil.readIntoList( "$projectDir/dep-war.txt" )
// Define dependencies
dependencies {
// Compilation
compile depListCompile
// Unit Tests
testCompile depListTest
// Integration tests
// Everything from compile and testCompile targets
integrationTestCompile configurations.compile
integrationTestCompile configurations.testCompile
// Output of compiling "main" files
integrationTestCompile sourceSets.main.output
// Additional dependencies from war and others
integrationTestCompile depListTest, depListWar
// All configuration files
integrationTestRuntime files( 'conf' )
}
task deployTomcat( type: Copy, dependsOn: [ jar, compileIntegrationTestJava, warService ] ) {
from "$buildDir/customWar/${project.name}.war"
into "$projectDir/tomcat/webapps"
}
build {
dependsOn deployTomcat
}
task integrationTest( type: Test, dependsOn: cleanTest ) {
jacoco {
//destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
destinationFile = file("$buildDir/jacoco/integrationTest.exec")
//classDumpFile = file("$buildDir/jacoco/classpathdumps")
classDumpFile = file("$buildDir/classes/integrationTest")
}
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath
}
apply plugin: 'eclipse'
eclipse.classpath {
// Define output directory so Eclipse does not accidentally clobber /bin
defaultOutputDir = file( 'out/classes' )
// Add integration test
plusConfigurations += configurations.integrationTestCompile
// Remove unnecessary files
file.whenMerged { classpath ->
classpath.entries.removeAll { entry -> ( entry.path.indexOf( '/build/classes/main' ) > 0 ) }
classpath.entries.removeAll { entry -> ( entry.path.indexOf( '/build/resources/main' ) > 0 ) }
}
}
Мои вопросы:
1) ПочемуGradle Clean Build Integration » - который успешно работает, перезаписывает результаты тестов в папках build / reports / tests и build / test-results.
2) Это неНезависимо от того, какое имя я даю для файла .exec в общем файле gradle для теста и в build.gradle для задачи интеграции с тестом для jacoco, он всегда создает файл test.exec иgrationTest.exec, но результирующая папка сборки / jacocoHtml файла index.html не делает 't показать покрытие / файлы, относящиеся к обоим модульным / интеграционным тестам. Чтобы доказать это, если я побегуgradle чистая сборка интеграцииTest jacocoTestReport sonarRunner "Я вижу рабочее место для работы, теперь содержит ".sonar» Папка и папка build / reports / sonar, которая содержит другой файл с именем "общая-xxx.exec» некоторый файл, но этот размер файла не близко к "сумма» модуля test.exec и размер файла ITgrationTest.exec. Хотя его размер больше, чем test.exec размер файла на несколько байтов.
3) Какую конфигурацию я могу установить, чтобы иметь общее покрытие как для модульных, так и для ИТ-тестов, то есть в целом ... исполняемый файл получает хороший размер (после запуска задачи sonarRunner). Во время задачи sonarRunner я вижу задачу SonarRunner "jacocoSensor step " действительно видит как файлы UT и IT .exec, так и общий файл .exec автоматически (хорошая функция от Sonar).