Gradle - Jacoco - JMockit - Тесты зависают не прогрессируют

Я использую 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, поскольку команда разработчиков также хотела бы увидеть детали покрытия кода.

В настоящее время я пытаюсь найти ответы на вышеперечисленные вопросы, ценим ваш вклад.


person AKS    schedule 28.04.2014    source источник


Ответы (3)


Окончательный ответ:

И Jmockit, и Jacoco обрабатывают файлы классов. Jmockit делает это сначала во время процесса сборки, и когда jacoco пытается сделать то же самое (позже в процессе), он говорит: «о, о, не могу инструментировать уже инструментированный файл класса». Эта проблема возникла со старыми версиями jacoco и jmockit. Чтобы увидеть эту ошибку, включите параметр --stacktrace во время сборки Gradle или --debug.

Теперь, используя последние версии jacoco и jmockit, мы можем легко решить эту проблему.

Если вы используете жакоко:

toolVersion="0.7.1.201405082137"

or

toolVersion="0.7.2.201409121644"

См. Это: изменения, внесенные в версию 0.7.1 http://www.eclemma.org/jacoco/trunk/doc/changes.html

Для JMockit необходимо использовать версию jmockit: не менее 1.8 или новее (от 1.9 до 1.13).

org.jmockit:jmockit:1.8

См. Это: изменения, внесенные в версию 1.8: http://jmockit.github.io/changes.html

person AKS    schedule 29.09.2014

Ответ 1: Установка в подразделе jacoco (в тестовом разделе) - разрешенного поля значения «ложь» сработала. Я не получаю покрытие кода (с которым я могу жить, пока не получу новые версии для JMockit / Jacoco), но теперь я вижу действительный файл отчета о тестировании index.html (т.е. тест прошел успешно) и все еще применяю плагин: ' jacoco 'может оставаться эффективным в файле /init.d/global-common.gradle ...

test {
     jacoco {
        enabled false
     }
}

По ответу 2: Пока НЕ ​​нашел, поделюсь.

Ответ 3: Не удалось устранить ошибку, но способ ее настройки указан по ссылке: http://stevendick.github.io/blog/2012/01/22/jacoco-and-gradle./

Я пробовала давать, может быть неправильно использовала. jvmArgs '....:, ....: .., ....: ...., exclude = "com. : org.gradle.; jmockit. : mockit.: junit. * "

Ответ 4: Достаточно ответа 1.

person AKS    schedule 28.04.2014

Я не слишком знаком с gradle, поэтому не уверен, что могу помочь с вопросами 1, 3 или 4 ...

Но вопрос 2, я могу помочь - строка версии для JaCoCo 0.7.1 не 0.7.1.201404171759, а скорее 0.7.1.201405082137. Эта версия официально выпущена, если вы не заметили.

Если вам нужна последняя ночная сборка, по соглашению просто указывайте 0.7.2-SNAPSHOT (убедитесь, что вы указываете на репозиторий снимков по адресу https://oss.sonatype.org/content/repositories/snapshots/).

person dcsohl    schedule 20.05.2014
comment
Ага, видел. Спасибо dcsohl за подсказку -SNAPSHOT. - person AKS; 29.05.2014