从gradle项目目录创建jacoco exec文件

时间:2015-01-20 06:26:31

标签: gradle jacoco gradle-plugin

如何从自定义gradle插件更改jacoco exec文件的位置,使其超出项目目录。我的插件中有以下代码:

project.afterEvaluate {
    def testTasks = project.tasks.withType(Test)
    testTasks.each { task ->
        task.jacoco.destinationFile = file("/home/skgupta/jacoco/${task.name}.exec")
    }
}

但是当我运行测试时,会在.exec

下生成<projectDir>/jacoco/<taskName>.exec文件

当我在destinationFile中更改build.gradle目录的值时,它的效果非常好。

我在这里缺少什么?

编辑:这里是插件的完整代码

class TestInfraPlugin implements Plugin<Project> {

    Project project

    void apply(Project target) {
        this.project = target
        logger = target.logger
        configureConfigurations(target)
        configureTestNG()
        configureCodeCoverage(target)
    }

    public void configureTestNG() {
        logger.debug "Configuring the EMTest task with default values."
        project.afterEvaluate {
            project.ext.testClassesDir = new File(project.properties['emdi.T_WORK'] + '/testClasses')
            /* Create one task of type ExtractConfiguration, to extract the lrgConfig configuration to $T_WORK/testClasses
             * The extraction of the test jar before the tests are run is mandatory because the 'Test' task 
             * ONLY works on the files in directory and NOT on the jars. Thus we extract the jar and point the testClasses 
             * property to the location where the jar is extracted.
             *  
             * NOTE: 
             *  1. This is only one task per gradle. 
             *  2. All the jars in the lrgConfig are extracted before any testblock is run.
             *  3. The LRG will not run if user uses other configuration than 'lrgConfig'
             *     (which applies without cutover to 'Test' task also.)
             */
            def testTasks = project.tasks.withType(EMTest)
            /* Silently log and return if there are no EMTest tasks. 
             * This case would be hit :
             *     a) When testinfraPlugin is applied to build.gradle
             *     b) (in Future)if <lrg>.gradle has test-blocks of non-Java types.
             */
            if (testTasks != null && testTasks.size() == 0) {
                logger.info "There are no tasks of type EMTest."
                return
            }

            def extractTask = project.tasks.findByPath('extractTestClasses') ?:
                    project.task('extractTestClasses', type: ExtractConfiguration) {
                        configuration = project.configurations.testConfig
                        to = project.testClassesDir
                    }
            /* 
             * 1. Adding the 'extractTask' to all EMTest, to ensure that 'extractTask' is run before any 'EMTest'.
             * 2. For lazy evaluation of lrgConfig, we are NOT running the task here, but just adding as dependent task.
             */
            testTasks.each { task ->
                logger.debug "Adding dependsOn extractTask for task: ${task.name}"
                task.dependsOn extractTask
                /* TODO: The code below is to change the location of the jacoco file, but it is not working
                 * When the same is tried directly from build.gradle (tried as fresh project), it works.
                 * I have opened SO question as: http://stackoverflow.com/questions/28039011/create-jacoco-exec-file-out-of-gradle-project-dir
                 * If we have solution for this, we can get-away with the workaround we applied in the TestResultsHandler.groovy
                 *
                 * NOTE: I tried with beforeEvaluate, and it really does not work because EMTest tasks are not evaluated by then.
                 * I also tried with 'java.io.File', etc other options. Nothing works.
                 *
                 */
                task.jacoco.destinationFile = task.project.file( '/scratch/skgupta/git_storage/emdi/work/jacocobuild/' + task.name + '.exec')
                println "Value of destinationFile in jacoco extension is "+ task.jacoco.getDestinationFile()
            }
        }

       logger.debug "Applying plugins implicitly."
        applyPlugin('java')
    /* Apply jacoco plugin */
        applyPlugin('jacoco')

    }

    /**
     * Apply plugin with given name.
     * 
     * @param pluginName - The name of the plugin to apply.
     * 
     */
    protected void applyPlugin(String pluginName) {
        logger.debug "Checking if the plugin, ${pluginName} is already applied."
        if (project.plugins.hasPlugin(pluginName)) {
            logger.debug "Plugin is already applied."
            return
        }
        logger.debug "Applying plugin, ${pluginName}"
        project.apply plugin: pluginName

        logger.debug "Verifying if the plugin is applied."
        if (project.plugins.hasPlugin(pluginName)) {
            logger.debug "Successfully applied plugin, ${pluginName}"
        }
        else {
            logger.error "Failed to apply plugin, ${pluginName}"
        }
    }

    /**
     * Add the configuration, lrgConfig, to the current project.
     *
     * The configuration lrgConfig defines the dependencies for the tools like testng, restassured, etc.
     * @param project - the project to which the config will be added.
     */
    protected void configureConfigurations(Project project) {
        logger.debug "Creating the configurations to hold tools GAV"
        project.configurations {
            /* This will be empty configuration, and will be populated by lrg owner with gav of the lrg jar */
            testConfig

            /* This will be empty configuration, and will be populated by lrg owner during test jar build */
            lrgConfig

            /* Configuration to hold the gav of the testng jar(s) */
            testNG

            /* Configuration to hold the GAV of the webdriver jar(s) */
            webdriver

            /* Configuration to hold the GAV of the restAssured jar(s) */
            restAssured
        }
        project.dependencies {
            /* 
             * Currently adding opensource testng jar path here. This will be replaced by
             * GAV of the tools testng only jar once they decouple it.
             * Bug 19276096 - SPLIT OUT TESTNG JAR FROM EM-QATOOL-UIFWK-WEBDRIVER.JAR| 
             */
            testNG group: 'com.mycomp.myprod.emdi', name: 'em-qatool-uifwk-webdriver',version: '1.0.0', transitive: false

            /*
             * webdriver config would contain reference to the tools webdriver jar, which currently
             * also has testng fwk in it. This will be replaced by gav of the webdriver only jar once
             * it is decoupled
             * Bug 19276096 - SPLIT OUT TESTNG JAR FROM EM-QATOOL-UIFWK-WEBDRIVER.JAR| 
             */
            webdriver group: 'com.mycomp.myprod.emdi', name: 'em-qatool-uifwk-webdriver',version: '1.0.0', transitive: false

            /* Add rest-assured libraries */
            restAssured group: 'org.codehaus.groovy', name:'groovy-all', version:'2.2.1'
            restAssured group: 'com.jayway.restassured', name:'json-path', version:'1.8.1'
            restAssured group: 'org.apache.commons', name:'commons-lang3', version:'3.1'
            restAssured group: 'org.hamcrest', name:'hamcrest-core', version: '1.3'
            restAssured group: 'org.apache.httpcomponents', name:'httpclient', version:'4.3.1'
            restAssured group: 'org.apache.httpcomponents', name:'httpcore', version:'4.3'
            restAssured group: 'org.apache.httpcomponents', name:'httpmime', version:'4.3.1'
            restAssured group: 'com.jayway.restassured', name:'xml-path', version:'1.9.0'
            restAssured group: 'com.jayway.restassured', name:'rest-assured-common', version:'2.3.1'
            restAssured group: 'com.jayway.restassured', name:'rest-assured', version:'2.3.1'
        }
        /* 
         * Currently the QA's build.gradle use lrgConfig for compilation. 
         * Hence setting lrgConfig as well with the testng gav for backward compatibility
         * TODO: This must be removed in future versions of testinfra 
         * 
         */
        project.configurations.lrgConfig.extendsFrom(project.configurations.testNG, project.configurations.restAssured)
    }
}

1 个答案:

答案 0 :(得分:1)

根据Gradle版本,您可能必须使用不同的参数。

看看以下&#34;测试&#34; (以及它的jacoco)部分有帮助。以下代码位于常见的 $ GRADLE_HOME / init.d /some.global.common.gradle文件中,因此我不必在每个项目中添加相同的代码。

   test {
     maxParallelForks = 5
     forkEvery = 50
     ignoreFailures = true

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

     //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")
     //}
  }

OR

尝试将上面的代码放在下面的块中(即用//替换//与你的行):

project.gradle.taskGraph.whenReady {
  //integrationTest {
  //  ignoreFailures = true
  //}
}