Тестовое задание Gradle Задача testReport - устаревшие свойства в Gradle 2.3 / Java7 или Java8

Я пытаюсь изменить свой проект с java7 на java8. Поэтому я внес изменения в существующий скрипт gradle extra.commons-myp.gradle, который использовал для gradle 1.6.

Я внес изменение complie в JavaCompile, так как он устарел после 2.0. Я получаю ошибку при тестовом задании,

    testReportDir = file ("$ buildDir / reports / tests / UT")
    testResultsDir = file ("$ buildDir / test-results / UT")

Пожалуйста, предложите мне, что мне не хватает.,,

    все проекты {
       применить плагин: "Java" 
       применить плагин: 'Jacoco'

        tasks.withType (Compile) {
         options.debug = true
         options.compilerArgs = ["-g"]
       }

       sourceSets {
          главный {
             Джава {
                srcDir 'dont_change_me'
             }
             Ресурсы {
                srcDir 'dont_change_me'
             }
          }
          тестовое задание {
             Джава {
                srcDir 'dont_change_me'
             }
             Ресурсы {
                srcDir 'dont_change_me'
             }
          }
          grationTest {
             Джава {
                srcDir 'dont_change_me'
             }
             Ресурсы {
                srcDir 'dont_change_me'
             }
          }
          вступительный тест {
             Джава {
                srcDir 'dont_change_me'
             }
             Ресурсы {
                srcDir 'dont_change_me'
             }
          }

       }

       jacoco {
            toolVersion = "0.7.2.201409121644"
       }

       тестовое задание {
         maxParallelForks = 5
         forkEvery = 50
         ignoreFailures = true

         testReportDir = file ("$ buildDir / reports / tests / UT")
         testResultsDir = file ("$ buildDir / test-results / UT")

         }

         // Следующий раздел теста Jacoco требуется только в дополнительном общем файле экземпляра Jenkins
         jacoco {
            destinationFile = file("$buildDir/jacoco/UT/jacocoUT.exec")
            classDumpFile = file("$buildDir/jacoco/UT/classpathdumps")
         }
       }

       Task IntegrationTest(тип: Тест) {
         // Всегда запускаем тесты
         output.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")

         // Следующий раздел теста Jacoco требуется только в дополнительном общем файле экземпляра Jenkins
         jacoco {
            destinationFile = file("$buildDir/jacoco/IT/jacocoIT.exec")
            classDumpFile = file("$buildDir/jacoco/IT/classpathdumps")
         }
      }

       задача acceptTest (тип: Test) {
         // Всегда запускаем тесты
         output.upToDateWhen {false}
         ignoreFailures = true

         testClassesDir = sourceSets.integrationTest.output.classesDir
         classpath = sourceSets.integrationTest.runtimeClasspath

         testReportDir = file ("$ buildDir / reports / tests / AT")
         testResultsDir = file ("$ buildDir / test-results / AT")

         // Следующий раздел теста Jacoco требуется только в дополнительном общем файле экземпляра Jenkins
         jacoco {        
           destinationFile = file ("$ buildDir / jacoco / AT / jacocoAT.exec")
           classDumpFile = file ("$ buildDir / jacoco / AT / classpathdumps")
         }
      }

      jacocoTestReport {
          group = "Отчетность"
          description = "Генерация отчетов покрытия Jacoco после выполнения тестов."
          ignoreFailures = true
          executeData = fileTree(dir: 'build/jacoco', включая: '**/*.exec')

          отчеты {
                 XML {
                     включен истина
                     // Следующим значением является файл
                     назначение "${buildDir}/reports/jacoco/xml/jacoco.xml"
                 }
                 csv.enabled false
                 HTML {
                     включен истина
                     // Следующим значением является папка
                     назначение "${buildDir}/reports/jacoco/html"
                 }
          }     
          sourceDirectories = files('src/java')
          classDirectories =  files('build/classes/main')
      }
    }

Полученная ошибка похожа на следующее для любого из этих свойств:

No such property: testResultDirs for class: org.gradle.api.tasks.testing.Test_Decorated

1 ответ

ХОРОШО.

В Gradle 1.6 или до 1.10 (я думаю), следующие свойства были доступны для тестирования задачи.

testReportDir = file("$buildDir/reports/tests/UT")
testResultsDir = file("$buildDir/test-results/UT")

Как видите, первый создает пользовательскую папку отчетов (где будет размещен файл HTML index.html, т.е. вместо использования папки по умолчанию build / reports / tests, мы хотели поместить index.html/ с другими файлами, расположенными рядом с этот файл находится в папке build/reports/tests/UT), а второе свойство создает пользовательскую папку результатов теста (т. е. вместо использования папки build / test-results для помещения результата модульных тестов *.xml файлов / папок, он фактически будет поместите все эти данные в папку build/test-results/UT).

Идея заключалась в следующем: в Gradle 1.6 Gradle создавал результаты тестов (.xml и т. Д.) / Файлы отчетов (.html и т. Д.), Когда вы только что запустили: gradle clean build (как тестовое задание, выполнялось бесплатно, т.е. Юнит-тесты без явного вызова пользователем тестового задания).

Теперь, когда вы использовали Java7 с Gradle 1.6 < 1.9/10, все было хорошо, но как только вы начали использовать Java8, вы можете увидеть проблемы, которые Gradle 1.6 НЕ СОВМЕСТИМЫ с Java8 (из-за библиотек ASM и других проблем времени компиляции, которые поставляется с Java8, если есть), поэтому вы перешли с версии Gradle 1.6 на версию Gradle 2.3.

PS: Gradle 2.4 - последняя версия, но она потребует дополнительных настроек в глобальном (grad.d level) файле Gradle. Я бы сказал, придерживайтесь Gradle 2.3 сейчас.

Теперь к вашим файлам - Как получить пользовательскую папку с результатами теста и отчетами (создана папка build/test-results/UT и build/reports/tests/UT).

В настоящее время вы используете Java8 с Gradle 2.3 (или с Java7). Все, что имеет значение, теперь у вас есть Gradle 2.3 (вместо 1.6).

Итак, что изменить и как найти, что изменить.

  1. См. Gradle docs для 2.3: https://docs.gradle.org/2.3/userguide/java_plugin.html (Здесь вы должны сначала увидеть и понять, что именно изменилось с Gradle 1.6 до 2.3 в тестовом задании и как отчеты будут генерироваться сейчас).

  2. В документации НЕ есть все поля (которые Gradle может иметь / использовать), определенные на их сайте. Не знаю почему, но, к счастью, мы можем найти все те переменные, которые вы определили в задании test или testReport (это новое задание, которое не было доступно в Gradle 1.6).

    Например: https://docs.gradle.org/2.3/dsl/org.gradle.api.tasks.testing.Test.html показывает только основные свойства или переменные, которые можно установить в тестовом задании.

    К счастью, теперь в тестовом задании больше нет свойств testReportDir или testResultsDir (в версии 2.3).

    Чтобы увидеть то, что могут видеть все Gradle. Посмотреть или запустить: свойства gradle

    Приведенная выше команда выведет список всех переменных / свойств со значениями, которые может видеть данная версия Gradle xy.

  3. Новая задача testReport или в Gradle 2.3 имеет концепцию, согласно которой теперь, когда Gradle будет запускать сборку / тестирование во время сборки и генерировать файлы.xml или.html и т. Д., Вы можете совместно сгенерировать отчет HTML, используя отчеты (часть html) в конце после того, как вы вызовите задачу testReport явно. Это помогает в основном, когда у вас есть многомодульная настройка проекта и где каждый подпроект / модули имеют тесты. Если вы запустите gradle clean build testReport, он будет генерировать отчеты.xml и.html в расположении по умолчанию (пока вы не укажете переменные свойств destinationDir, testResultDirs и reportsOn в задаче testReport вместо задачи теста).

Теперь можно сказать, что если я вызову gradle clean build testReport в командной строке при настройке многомодульного проекта, вы можете сгенерировать.xmls и.htmls в заданном месте для каждого подпроекта / модуля. Да, это правильно. Если мы не хотим, тогда мы должны использовать следующее свойство в тестовой задаче (вместо задачи testReport), чтобы отключить создание отчетов html для каждого подпроекта, как, очевидно, в конце мы вызовем задачу testReport (или используя test.finalizedBy testReport) для генерации отчетов по всем тестам (как указано в документации Gradle 2.3).

 test {
 ...
 .....
 reports.html.enabled = false
 ...
 .
 }

См. Этот пример: https://docs.gradle.org/2.3/userguide/java_plugin.html, см. Раздел 23.13.7 и пример: 23.14.

subprojects {
    apply plugin: 'java'

    // Disable the test report for the individual test task
    test {
        reports.html.enabled = false
    }
}

task testReport(type: TestReport) {
    destinationDir = file("$buildDir/reports/allTests")
    // Include the results from the `test` task in all subprojects
    reportOn subprojects*.test
}

Приведенный выше пример показывает, что он будет создавать отчеты о тестировании (HTML) после чтения результатов теста (информация.xml/etc) из всех подпроектов в структуре многомодульного проекта и будет создавать результирующие отчеты. в папке build/tests/allTests.

Теперь у нас нет многомодульной структуры, поэтому мы должны сделать следующее:

1. Добавьте новую задачу testReport в файл Gradle уровня extra1... init.d.

task testReport(type: TestReport) {
    destinationDir = file("$buildDir/reports/tests/UT")
    testResultDirs = fileTree("$buildDir/test-results/UT")
    reportOn test
}

2. Изменить тестовое задание, т.е.

test {
     maxParallelForks = 5
     forkEvery = 50
     ignoreFailures = true
     //The following two properties DONT work in Gradle 2.3
     //testReportDir = file("$buildDir/reports/tests/UT")
     //testResultsDir = file("$buildDir/test-results/UT")

     //With Gradle 2.3 we now need the following line to disable HTML report creation during test run per project/sub-project as we'll take care of generating those reports by testReport task which is available in Gradle 2.3.
     reports.html.enabled = false

     //OK - it took some time, but finally I can change the test-results
     //folder which Gradle generates and uses it to put the .xml/tests results files and etc folders.
     //As there is NO way to set a property in Gradle 2.3 to change the result directory property/variable, 
     //the only way we can do it by adding the following line.
     testResultsDirName = "test-results/UT"

     //The following commented out lines are optional. Un-comment if you need to.
     //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 {
        //Following two properties/variables works ONLY with 1.6 of Gradle
        //destPath = file("$buildDir/jacoco/UT/jacocoUT.exec")
        //classDumpPath = file("$buildDir/jacoco/UT/classpathdumps")


        //Following two properties/variable works only with versions >= 1.7 version of Gradle
        destinationFile = file("$buildDir/jacoco/UT/jacocoUT.exec")
        //  classDumpFile = file("$buildDir/jacoco/UT/classpathdumps")
     }

     //Usually one should call testReport at command line while calling gradle clean build 
     // i.e. gradle clean build testReport
     // But using Gradle 2.3 finalizedBy feature, you can call testReport as soon as test task is run by Gradle during gradle clean build.
     // PS: This will bring confusion if you have a multi-module project structure as there, you should call testReport task explicitly at command line. So, comment or uncomment acc. to your use.
     finalizedBy testReport
   }

Если вы заметили, есть переменные, которые изменились с Gradle 1.6 на Gradle 2.3 от одной задачи к другой задаче, и имя этих переменных / свойств тоже немного изменилось (например, от dir testResults до testResultDirs), и testReportDir нет свойство в тестовой задаче больше, но теперь есть целевая папка в тестовой задаче.

Кроме того, я вызываю задачу testReport после ее завершения (как test.finalizedBy testReport), чтобы автоматически вызывать задачу testReport (вместо того, чтобы требовать от пользователя явного вызова этой задачи).

ДРУГОЙ ВРЕМЕННОЕ РЕШЕНИЕ: ЕСЛИ вам не нужно вносить вышеуказанные изменения (чтобы получить то, что вы пытаетесь достичь), а также не хотите запускать задачу testReport для запуска отчетов в конце, вы также можете сделать следующее. Внимательно следите за тем, что не комментируется / комментируется на этот раз.

//task testReport(type: TestReport) {
//    destinationDir = file("$buildDir/reports/tests/UT")
//    testResultDirs = fileTree("$buildDir/test-results/UT")
//    reportOn test
//}

test {
     maxParallelForks = 5
     forkEvery = 50
     ignoreFailures = true
     //The following two properties DONT work in Gradle 2.3
     //testReportDir = file("$buildDir/reports/tests/UT")
     //testResultsDir = file("$buildDir/test-results/UT")

     //With Gradle 2.3 we now need the following line to disable HTML report creation during test run per project/sub-project as we'll take care of generating those reports by testReport task which is available in Gradle 2.3.
     //This time you need to comment the following line, so that it'll actually create the reports/html file during test run.
     //reports.html.enabled = false

     doFirst {   
     //OK - it took some time, but finally I can change the test-results
     //folder which Gradle generates and uses it to put the .xml/tests results files and etc folders.
     //As there is NO way to set a property in Gradle 2.3 to change the result directory property/variable, 
     //the only way we can do it by adding the following line.
     testResultsDirName = "test-results/UT"

     //Add the following if reports.html.enable = false line is commented out OR it's not commented but value is set to "true".
     //The following line will change the default build/reports/tests folder to build/reports/tests/UT for creating html reports for Unit tests.
     testReportDirName = "tests/UT"
     }

     //The following commented out lines are optional. Un-comment if you need to.
     //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 {
        //Following two properties/variables works ONLY with 1.6 of Gradle
        //destPath = file("$buildDir/jacoco/UT/jacocoUT.exec")
        //classDumpPath = file("$buildDir/jacoco/UT/classpathdumps")


        //Following two properties/variable works only with versions >= 1.7 version of Gradle
        destinationFile = file("$buildDir/jacoco/UT/jacocoUT.exec")
        //  classDumpFile = file("$buildDir/jacoco/UT/classpathdumps")
     }

     //Usually one should call testReport at command line while calling gradle clean build 
     // i.e. gradle clean build testReport
     // But using Gradle 2.3 finalizedBy feature, you can call testReport as soon as test task is run by Gradle during gradle clean build.
     // PS: This will bring confusion if you have a multi-module project structure as there, you should call testReport task explicitly at command line. So, comment or uncomment acc. to your use.

    //Now we don't need to call "gradle clean build testReport" anymore. 
    //finalizedBy testReport
   }

Как вы заметили в приведенном выше коде, что: 1. Теперь мой глобальный файл Gradle уровня init.d даже не имеет задачи testReport. 2. Я закомментировал эту строку:

//reports.html.enabled = false

3. Я добавил еще одно свойство: testReportDirName = "tests / UT".

testReportDirName = "tests/UTnew"

PS: Важно добавить testReportDirName и testResultsDirName в раздел / оболочку doFirst { .. } (в противном случае, если вы сделаете аналогичные изменения для интеграционного теста или любой тестовой задачи интеграции, ваша папка UT будет создана в папке build/tests-results/IT как папку build/tests-results/IT/tests-results/UT, когда вы будете запускать сборку gradle clean, тестирование интеграции gradle (при условии, что Tomcat запущен / работает) и снова сборка gradle clean.

4. Никакой информации об использовании или установке двух вышеупомянутых переменных: testReportDirName и testResultsDirName в тестовом задании нигде в документации Gradle. Единственный способ найти это - запустить: свойства gradle в командной строке.

ХОРОШО. Подсказка - Подсказка - Как вы измените это для того, чтобы сделать то же самое (создание файла результатов / отчетов для ИТ (задача Integration Test, так называемая задача IntegrationTest) или задачи AcceptTest и т. Д. Я оставлю это для вас, чтобы узнать.

Я протестировал оба подхода, описанных выше... и теперь он успешно генерирует файлы.xml в папке build/test-results/UT и файлы reports / html в папке build/reports/tests/UT.

Другие вопросы по тегам