Я использую Gradle (Gradle 1.6 - до 1.9) для создания проекта Java. Пробовал как с Java 1.6, так и с 1.7.
src/java - contains Java source code
test/java - contains test java code
Проект успешно компилируется / строится. Во время сборки также успешно выполняются тесты Junit UNIT. У меня только один тест, и он использует библиотеку JMockit. ОБРАТИТЕ ВНИМАНИЕ. Этот же код jacoco отлично работает в любом другом проекте, в котором у меня нет теста, для которого требуется библиотека JMockit.
JMockit groupid: artifactid: версия:
jmockit:jmockit:1.1
Я хотел включить покрытие кода Jacoco. Версия Jacoco, которую я пробовал до сих пор, показана в приведенном ниже коде, этот код существует в моем скрипте сборки Gradle.
Я добавил следующие строки в файл build.gradle моего проекта.
apply plugin: 'jacoco'
jacoco {
//toolVersion = "0.6.2.201302030002"
toolVersion = "0.7.0.201403182114"
//toolVersion = "0.7.1.201404171759" --- trying to find how to make version this working.
// reportsDir = file("$buildDir/customJacocoReportDir")
}
test {
ignoreFailures = true
testReportDir = file("$buildDir/reports/tests/UT")
testResultsDir = file("$buildDir/test-results/UT")
// Uncomment the following if you need more detailed output.
//testLogging.showStandardStreams = true
//onOutput { descriptor, event ->
// logger.lifecycle("Test: " + descriptor + " produced standard out/err: " + event.message )
//}
//Following Jacoco test section is required only in Jenkins instance extra common file
jacoco {
//The following vars works ONLY with 1.6 of Gradle
destPath = file("$buildDir/jacoco/UT/jacocoUT.exec")
classDumpPath = file("$buildDir/jacoco/UT/classpathdumps")
//Following vars works only with versions >= 1.7 version of Gradle
//destinationFile = file("$buildDir/jacoco/UT/jacocoUT.exec")
// classDumpFile = file("$buildDir/jacoco/UT/classpathdumps")
}
}
task integrationTest( type: Test) {
//Always run tests
outputs.upToDateWhen { false }
ignoreFailures = true
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath
testReportDir = file("$buildDir/reports/tests/IT")
testResultsDir = file("$buildDir/test-results/IT")
//Following Jacoco test section is required only in Jenkins instance extra common file
jacoco {
//This works with 1.6
destPath = file("$buildDir/jacoco/IT/jacocoIT.exec")
classDumpPath = file("$buildDir/jacoco/IT/classpathdumps")
//Following works only with versions >= 1.7 version of Gradle
//destinationFile = file("$buildDir/jacoco/IT/jacocoIT.exec")
// classDumpFile = file("$buildDir/jacoco/IT/classpathdumps")
}
}
jacocoTestReport {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
ignoreFailures = true
executionData = fileTree(dir: 'build/jacoco', include: '**/*.exec')
reports {
xml{
enabled true
//Following value is a file
destination "${buildDir}/reports/jacoco/xml/jacoco.xml"
}
csv.enabled false
html{
enabled true
//Following value is a folder
destination "${buildDir}/reports/jacoco/html"
}
}
//sourceDirectories = files(sourceSets.main.allJava.srcDirs)
sourceDirectories = files('src/java')
classDirectories = files('build/classes/main')
//------------------------------------------
//additionalSourceDirs = files('test/java')
//additionalSourceDirs += files('src/java-test')
//additionalClassDirs = files('build/classes/test')
//additionalClassDirs += files('build/classes/integrationTest')
//additionalClassDirs += files('build/classes/acceptanceTest')
//------------------------------------------
}
Мои вопросы: 1. Когда я не использую «apply plugin: 'jacoco'», тогда: тестовая задача выполняется успешно (у меня только один тест). НО, когда я включаю Apply plugin: 'jacoco', то во время задачи: test я вижу следующую строку во время вывода сборки, и процесс просто зависает и сидит часами и не продолжается.
Starting process 'Gradle Worker 1'. Working directory: /production/jenkinsAKS/workspace/MyProjectSvc Command: /production/jdk1.6.0_03/bin/java -Djava.security.manager=jarjar.org.gradle.processinternal.child.BootstrapSecurityManager -javaagent:build/tmp/expandedArchives/org.jacoco.agent-0.7.0.201403182114.jar_2kiqpmj1hlqbuth11j0qnuarhs/jacocoagent.jar=destfile=build/jacoco/UT/jacocoUT.execappend=true,dumponexit=true,output=file,classdumpdir=build/jacoco/UT/classpathdumps,jmx=false -Dfile.encoding=UTF-8 -ea -cp /production/jenkins/.gradle/caches/1.6/workerMain/gradle-worker.jar jarjar.rg.gradle.process.internal.launcher.GradleWorkerMain
An attempt to initialize for well behaving parent process finished.
Successfully started process 'Gradle Worker 1'
Gradle Worker 1 executing tests.
> Building > :test
Я погуглил, и мне кажется, что в текущей последней версии есть некоторая несовместимость между библиотеками Jacoco и JMockit, и скоро появится исправление для решения этой проблемы. В новой версии Jacoco 0.7.1.xxxxx есть исправление, но я не знаю, когда оно будет доступно в репозитории Maven.
Любая идея, как я могу настроить javaagent, чтобы игнорировать файл тестового / тестового класса для JACOCO и по-прежнему применять плагин jacoco. В моем случае примените плагин: 'jacoco' позже будет существовать в глобальном файле, то есть внутри файла /init.d/global-common.gradle в разделе allProjects {....}.
Я пробовал следующее, но все же процесс сборки зависает: test, пока я не раскомментирую исключить ниже. Если я закомментирую весь подраздел jacoco в разделе test, процесс сборки по-прежнему зависает в: test task (похоже, как плагин apply: там 'jacoco').
Если я раскомментирую исключение, то я не вижу ошибки, но тогда никакие тесты не выполняются, т.е. index.html для отчетов о тестах не показывает, что ничего не выполнялось.
test {
include "**/*"
jacoco {
//exclude "**/util/Test*"
}
}
2. Как я могу использовать версию jacoco 0.7.1.xxxx (не выпускаемую, также известную как ночная версия, в которой есть исправление для этой проблемы) в моем файле build.gradle. Когда я использовал версию 0.7.1.xxx после того, как раскомментировал ее (как показано выше), она выдала ошибку: не могу найти зависимость jacoco: 0.7.1.xxxx
3 Чтобы избавиться от этой проблемы, я думаю, что могу установить параметр агента jacoco, т.е. когда он запускается, он будет игнорировать библиотеку JMOckit / JUnit .jar или что-то в этом роде. См. / Нашел следующие ссылки:
http://javaee.ch/2012/10/09/jmockit-with-maven-sonar-jacoco-and-jenkinshudson/
https://github.com/jacoco/jacoco/pull/35
В соотв. по второй ссылке:
Обходной путь, позволяющий избежать проблемы, - исключить классы JUnit из рассмотрения JaCoCo. В своем тестировании я использовал следующий параметр инициализации JVM, исключая классы JUnit и TestNG: -javaagent: /jacoco-0.7.1/lib/jacocoagent.jar=excludes=junit.: org.junit. : org.testng. Хорошая новость заключается в том, что исправление, описанное в моем предыдущем комментарии, также решает эту проблему взаимоблокировки, потому что тогда классы JUnit будут игнорироваться JaCoCo, поскольку они инструментированы JMockit.
Я пытаюсь найти, какую переменную в jacoco {...} или в test {...} я могу настроить на то же самое, пока не получу новую версию Jacoco или JMockit (в которой есть исправление).
Похоже, это в разделе test, т.е. test {..here jvmArgs '...' будет установлен. jacoco {...} ..} http://stevendick.github.io/blog/2012/01/22/jacoco-and-gradle/
4. Если я исключу файл тестового класса с помощью команды exclude com / xxx / yyy /a/b/c/util/Testname.class ", тогда он работает, и я не вижу ошибки, но затем я обнаружил, что из-за this exclude мой тест никогда не запускается !!! поэтому он не зависал. Что ж, я хочу запустить тест и не хочу, чтобы Жакоко его обрабатывал.
Просто имея применить плагин: 'jacoco' в build.gradle, сборка зависает в: тестовой задаче. Мне нужен jacoco, поскольку команда разработчиков также хотела бы увидеть детали покрытия кода.
В настоящее время я пытаюсь найти ответы на вышеперечисленные вопросы, ценим ваш вклад.