首页 文章

Gradle测试任务 - Gradle 1.6和Gradle 2.3或更高版本

提问于
浏览
1

我有一个Java项目 .

PS :在我的项目中,我在 src/test/java 中没有任何java程序/源代码 .

  • 此文件夹只包含blank.txt文件 .

我有两个不同的Gradle版本:

  • Gradle 1.6 with Java 7(因为Java 8与Gradle 1.6不兼容或任何版本<小于1.10版本,如果我是正确的) .

  • 另一个版本是:Gradle 2.3 with Java 8 .

使用上面提到的两个Gradle 1.6 Java7 OR Gradle 2.3 Java 8版本,我的项目成功构建 .

虽然,我注意到一件事:在运行构建时,它会自动调用“测试”任务(根据Gradle设计,测试任务免费运行);我在Gradle 1.6 Java7运行期间发现---我看到以下输出 .

:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources
:testClasses
:test
:check

当你'll notice, it says I don' t有任何测试源代码时(即src / test / java不包含任何源代码,或者Gradle这次编译没什么新东西,自上次gradle运行构建以来可能没什么变化)这就是为什么compileTestJava任务在它前面显示 UP-TO-DATE .

但是, :test 任务显示它已成功运行 . 我在test 任务中使用了jacoco(代码覆盖)部分,然后它实际上运行了那部分(因为在 test 任务之前没有UP-TO-DATE) . Jacoco部分未在我的项目中定义's build.gradle but actually it'来自顶级/ GRADLE_HOME / init.d / some-common-top-level.gradle文件(其中test {...有jacoco ..}部分在里面) .

正如我上面提到的, test 任务没有说UP-TO-DATE,因此,在Gradle构建过程完成后,我可以看到它在 build/tmp/expandedArchives/org.jacoco.... 文件夹中创建了以下文件夹/文件结构:

$ ls -ltr build/tmp/expandedArchives/
total 4
drwxr-xr-x+ 1 e020001 Domain Users 0 Jul  7 20:45 org.jacoco.agent-0.7.2.201409121644.jar_778m6tp3jrtvcetasufl59dmau

$ ls -ltr build/tmp/expandedArchives/org.jacoco.agent-0.7.2.201409121644.jar_778m6tp3jrtvcetasufl59dmau/
total 272
drwxr-xr-x+ 1 e020001 Domain Users      0 Jul  7 20:58 META-INF
-rwxr-xr-x  1 e020001 Domain Users   2652 Jul  7 20:58 about.html
-rwxr-xr-x  1 e020001 Domain Users 272311 Jul  7 20:58 jacocoagent.jar
drwxr-xr-x+ 1 e020001 Domain Users      0 Jul  7 20:58 org

当我运行Gradle 2.3和Java8时,不会发生同样的情况 .

构建成功但我没有得到包含jacocoagent.jar文件的build / tmp / expandedArchives / org.jacoco ....文件夹 .

任何想法,为什么Gradle 2.3没有创建这个特定于jacoco的.jar文件 .

使用Gradle 2.3 Java8,以下输出在 :compileTestJava:test 任务之前显示UP-TO-DATE(对于测试任务,Gradle 1.6不是这种情况) .

我跑了“ gradle clean build ” .

:compileTestJava UP-TO-DATE
:compileTestGroovy UP-TO-DATE
:processTestResources
:testClasses
:test UP-TO-DATE
:check

我需要Gradle 2.3在build / tmp / expandedArchives / org.jacoco .....文件夹下生成这个jacocoagent.jar,以便我可以在下游Jenkins作业(运行非单元测试)中使用它,因为这个项目确实有一些集成测试,我从下游作业中的父主构建作业(它运行gradle clean build,包括测试任务)中获取jacocoagent.jar,这样我就可以在启动Tomcat时将它传递给TOMCAT JVM(这样我就可以获得jacocoIT IT测试的.exec代码覆盖率 . 但是,在我切换到Gradle 2.3之后,所有我没有src / test / java的项目...现在jacocoagent.jar没有被创建,并且复制工件插件在尝试从父作业复制.jar文件时失败 .

One more point
使用Gradle 1.6 Java7,如果我运行 gradle clean build ,它会在build / tmp / expandedArchives / org.jacoco .....文件夹中成功创建jacocoagent.jar,但只有当我运行 gradle clean build 或“ gradle clean; gradle test ”时它才会这样工作 .

如果我运行gradle clean build,然后删除build / tmp文件夹,现在只运行: gradle test ,它会在 :compileTestJava:test 任务前面显示UP-TO-DATE并且不会创建build / tmp / expandedArchives / org .jacoco ....包含jacocoagent.jar文件的文件夹 .

有关更多信息,我正在为Gradle 1.6 java 7运行 gradle test 任务时附加配置文件运行(即使用 --profile 选项) .

我看到,在配置文件 html 文件中,当运行 test 任务时,它首先按照Gradle进程逻辑调用compileJava,然后测试任务,它还调用依赖关系--- :jacocoAgent (根据依赖关系解析选项卡):
enter image description here

But

使用Gradle 2.3 Java8时,依赖性解析/顺序和任务执行步骤与生成或显示对jacocoAgent依赖关系的任何引用不同(或者与Gradle 1.6相比的顺序),因为它甚至没有调用它 .
enter image description here

使用 -i (或 --info )选项运行 Gradle1.6 +Java7 测试任务会显示为什么它运行测试任务,即使我没有测试源代码,请查看原因:

Note: Recompile with -Xlint:unchecked for details.
:processResources
Skipping task ':processResources' as it has no source files.
:processResources UP-TO-DATE
:classes
Skipping task ':classes' as it has no actions.
:compileTestJava
Skipping task ':compileTestJava' as it has no source files.
:compileTestJava UP-TO-DATE
:processTestResources
Executing task ':processTestResources' due to:
  No history is available.
:testClasses
Skipping task ':testClasses' as it has no actions.
:test
file or directory '/my/workspace/project/build/classes/test', not found
Executing task ':test' due to:
  No history is available.
file or directory '/my/workspace/project/build/classes/test', not found
Finished generating test XML results (0.001 secs)
Generating HTML test report...
Finished generating test html results (0.012 secs)

BUILD SUCCESSFUL

2 回答

  • 0

    无论输入和输出的状态如何,您都可以强制执行测试任务:

    test{
        outputs.upToDateWhen{false}
    }
    

    对于早期的gradle版本,您可以确保类目录存在

    task createTestClassesDir << {sourceSets.test.output.classesDir.mkdirs()}
    test.dependsOn createTestClassesDir
    
  • 0

    摘要:

    使用Gradle 2.3,如果没有有效的.java / .groovy(或等)测试代码,然后 test 任务赢了't even run and thus there' ll是没有在build / tmp / exapandedArchives / org.jacoco.xxx ....文件夹深处创建的jacocoagent.jar .

    解决方案是在allprojects 部分中包含以下内容(在顶级$ GRADLE_HOME / init.d / some-global-file.gradle中) . 我们所做的只是,如果src / test / java(标准)或任何遗留文件夹结构(如果您的项目结构是这样的src / java)没有任何有效的测试源代码,那么我们可以添加一个虚拟测试文件(DummyTestXYZ.java或groovy)让测试任务运行,它将生成jacocoagent.jar(我们可以在Tomcat选项中使用/ tie来为非单元aka集成测试生成jacoco报告) . 这样,如果您的主构建作业调用下游/子作业来运行您的IT测试,它将不会失败,因为它可以获取jacocoagent.jar(来自主构建作业的工作区),因为测试任务将在构建/中创建jacocoagent.jar tmp / expandedArchives / org.jacoco.xx.x.xx..x文件夹(您可以使用Jenkins中的Copy Artifact插件获得) .

    PS :更改 if 语句逻辑acc . 到您自己的文件夹设置,即您要在哪个文件夹中创建DummyTestXYZ.java文件 . 在我们的例子中,所有新项目都使用src / test / java(根据Maven / Gradle标准的标准文件夹结构),并且在新项目创建期间,我们将向源控件添加有效的样本单元测试 . 因此,在下面的逻辑中,我们实际上忽略了在src / test / java存在的情况下创建这个DummyTestXYZ.java并且仅当src / test / java文件夹不存在时才创建此文件然后首先创建它然后创建虚拟文件 . 我知道,我们可以在Jenkins服务器上的某个位置上传jacocoagent.jar,并在启动Tomcat时使用该文件获取IT测试的代码覆盖率 . 我们添加的虚拟测试文件需要junit:junit:4.10或4.11库版本,以便:compileTestJava任务成功 .

    compileJava {
        doLast {
            def dirName = "${projectDir}/test/java"
    
            if(!file( "${projectDir}/src/test/java" ).exists()) 
                if(!file( dirName ).exists()) 
                    new File( dirName ).mkdirs()
    
            if(file( dirName ).exists()) {
                def javaCnt = new FileNameByRegexFinder().getFileNames(dirName, /.*\.java/).size()
                if(javaCnt == 0) {
                    def f = new File( dirName , 'DummyTestXYZ.java' )
                    def w = f.newPrintWriter()
                    w.println('import org.junit.Test;')
                    w.println('')
                    w.println('public class DummyTestXYZ {')
                    w.println('@Test' )
                    w.println('public void test() {')
                    w.println('}')
                    w.println('}')
                    w.close()
                }
            }
        }
       }
    
       test {
         doFirst {
                  testResultsDirName = "test-results/UT"
                  testReportDirName = "tests/UT"
         }         
         maxParallelForks = 5
         forkEvery = 50
         //ignoreFailures = true
    
         // Following Jacoco section is required only in Jenkins
         // But a developer can uncomment them if they want this feature to work for their 
         // Desktop local Gradle builds.
         jacoco {
                //Following vars works only with versions >= 1.7 version of Gradle
                destinationFile = file("$buildDir/jacoco/UT/jacocoUT.exec")
         }
    
         doLast {
            if (file("${projectDir}/test/java/DummyTestXYZ.java").exists()) {
                println "++"
                println "++"
                println "++"
                println "======================================================="
                println "DEV Team – Please add valid Unit tests in this project."
                println "======================================================="
                println "++"
                println "++"
                println "++"
                sleep(30 * 1000)
                new File("${projectDir}/build/classes/test").deleteDir()
                new File("${buildDir}/jacoco/UT").deleteDir()
                new File("${buildDir}/test-results/UT").deleteDir()
                delete "${projectDir}/test/java/DummyTestXYZ.java"
             }
    
    
         }
       }
       //Do the same (as above test code) for any other similar test tasks like integartionTest, acceptanceTest etc..
    
      jacocoTestReport {
         //cleaning any compile time generated (for ex: JiBx classes files) so that jacoco task won't fail for not finding the actual source files (.java/.groovy for the compile time generated .class files)
         doFirst {
             delete fileTree (dir: "${buildDir}/classes", include: "**/JiBX_*.class")
         }
    
         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','src/main/java', 'src/main/groovy'])
         classDirectories =  files('build/classes/main')
    
         doLast {
            if (file("${projectDir}/test/java/DummyTestXYZ.java").exists()) {
                delete "${projectDir}/test/java/DummyTestXYZ.java"
             }
         }
       }
    

相关问题