Тестовое задание 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).
Итак, что изменить и как найти, что изменить.
См. Gradle docs для 2.3: https://docs.gradle.org/2.3/userguide/java_plugin.html (Здесь вы должны сначала увидеть и понять, что именно изменилось с Gradle 1.6 до 2.3 в тестовом задании и как отчеты будут генерироваться сейчас).
В документации НЕ есть все поля (которые 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.
Новая задача 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.