Тестовая задача Gradle testReport task - свойства, объявленные устаревшими в Gradle 2.3 / Java7 или Java8

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

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


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

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


    allprojects {
       apply plugin: 'java' 
       apply plugin: 'jacoco'

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

       sourceSets {
          main {
             java {
                srcDir 'dont_change_me'
             }
             resources {
                srcDir 'dont_change_me'
             }
          }
          test {
             java {
                srcDir 'dont_change_me'
             }
             resources {
                srcDir 'dont_change_me'
             }
          }
          integrationTest {
             java {
                srcDir 'dont_change_me'
             }
             resources {
                srcDir 'dont_change_me'
             }
          }
          acceptanceTest {
             java {
                srcDir 'dont_change_me'
             }
             resources {
                srcDir 'dont_change_me'
             }
          }

       }

       jacoco {
            toolVersion = "0.7.2.201409121644"
       }

       test {
         maxParallelForks = 5
         forkEvery = 50
         ignoreFailures = true

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

         }

         //Following Jacoco test section is required only in Jenkins instance extra common file
         jacoco {
            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 {
            destinationFile = file("$buildDir/jacoco/IT/jacocoIT.exec")
            classDumpFile = file("$buildDir/jacoco/IT/classpathdumps")
         }
      }

       task acceptanceTest ( type: Test) {
         //Always run tests
         outputs.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")

         //Following Jacoco test section is required only in Jenkins instance extra common file
         jacoco {        
           destinationFile = file("$buildDir/jacoco/AT/jacocoAT.exec")
           classDumpFile = file("$buildDir/jacoco/AT/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('src/java')
          classDirectories =  files('build/classes/main')
      }
    }

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

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

person Srivignesh    schedule 23.06.2015    source источник


Ответы (1)


OK.

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

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

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

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

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

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

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

  1. См. Документацию Gradle для 2.3: https://docs.gradle.org/2.3/userguide/java_plugin.html#sec:java_test (Здесь вы должны сначала увидеть и понять, что именно изменилось с 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 показывает только основные свойства или переменные, которые вы можете установить в тестовой задаче.

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

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

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

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

Теперь можно сказать, что если я вызываю 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#sec:java_test см. раздел 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 / информация и т. Д.) Из всех подпроектов в многомодульной структуре проекта, и он создаст результирующие отчеты. в папке 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, т. Е.

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 от одной задачи к другой задаче, и имя этих переменных / свойств также было немного изменено (например: testResult s Dir to testResultDir s), и в тестовой задаче больше нет свойства testReportDir, но теперь есть destinationDir в задаче testReport.

Кроме того, я вызываю задачу 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 {..} важно (в противном случае, если вы сделаете аналогичные изменения для integrationTest или любой задачи тестирования интеграции, тогда ваша папка UT будет создана внутри папки build / tests-results / IT как build / tests-results / IT / tests-results / папка UT, всякий раз, когда вы запускаете чистую сборку gradle; gradle integrationTest (при условии, что у вас установлен Tomcat) и снова чистая сборка gradle.

4. В документации Gradle нет информации об использовании или настройке двух вышеуказанных переменных: testReportDirName и testResultsDirName в задаче test. Единственный способ найти это можно сделать, выполнив: свойства gradle в командной строке.

OK. Подсказка - Подсказка - Как вы измените это, чтобы сделать то же самое (создание файла результатов / отчетов для ИТ (Integration Test, или задача integrationTest) или задачу acceptTest и т. Д. Я оставлю это вам, чтобы узнать.

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

person AKS    schedule 23.06.2015
comment
Java plugin довольно четко документирует выходные каталоги. Все, что нужно, - это поместить в файл сборки следующее. Вы потратили столько недвижимости на разговоры о несвязанных вещах, что суть вопроса потерялась. testResultsDirName = "reports/junit" testReportDirName = "junit" - person Abhijit Sarkar; 10.06.2016