我是新手。我使用以下代码。但它为单元测试用例生成了覆盖范围。但它没有为集成测试用例生成。我在src / test / java包中有我的测试类。
test {
dependsOn jettyRunWar
ignoreFailures true
finalizedBy jettyStop
}
apply plugin: 'jacoco'
jacocoTestReport {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
}
答案 0 :(得分:4)
使用Gradle 5.4.1(现在是5.5.1),我可以在完成任何测试任务后获得报告,目前我既有test
和integrationTest
任务。
EDIT2 :解决方案相同,我只是进行了调整
jacoco.reportsDir
的报告目标,tasks.withType(Test)
而不是[test, integrationTest]
executionData
是在doFirst
块中完成,而不是doLast
编辑:查看JacocoReport
的文档后,有一个JacocoReport:executionData变体可以直接执行Gradle任务。之所以有效,是因为the JaCoCo plugin adds a JacocoTaskExtension
extension to all tasks of type Test
。这样就不容易出错。报告任务将变为:
jacocoTestReport {
doFirst {
// The JaCoCo plugin adds a JacocoTaskExtension extension to all tasks of type Test.
// Use task state to include or not task execution data
// https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/TaskState.html
executionData(tasks.withType(Test).findAll { it.state.executed })
}
reports {
xml.enabled true
xml.destination(file("${jacoco.reportsDir}/all-tests/jacocoAllTestReport.xml"))
html.enabled true
html.destination(file("${jacoco.reportsDir}/all-tests/html"))
}
}
同样的技巧也可以应用于sonarqube
任务:
sonarqube {
group = "verification"
properties {
// https://jira.sonarsource.com/browse/MMF-1651
property "sonar.coverage.jacoco.xmlReportPaths", jacocoTestReport.reports.xml.destination
properties["sonar.junit.reportPaths"] += integrationTest.reports.junitXml.destination
properties["sonar.tests"] += sourceSets.integrationTest.allSource.srcDirs
// ... other properties
}
}
较旧但非常有效的答案。同样,利用上面的知识(Test
的任务被JacocoTaskExtension
扩展了),可以用file
和{{替换executionData
的手动test.jacoco.destinationFile
配置1}}。
integrationTest.jacoco.destinationFile
答案 1 :(得分:2)
看起来,您需要告诉build.gradle是使用sourceSets进行的Intergration测试(即包含这些IT测试的文件夹)的位置。在我的情况下,我有src / java下的源代码(而不是src / main / java - gradle默认)..我的单元测试(Junit)在test / java文件夹下,我的集成测试在src / java-test文件夹下。 / p>
sourceSets {
main {
java {
srcDir 'src/java'
}
}
test {
java {
srcDir 'test/java'
}
resources {
srcDir 'test/resources'
srcDir 'conf'
}
}
integrationTest {
java {
srcDir 'src/java-test'
}
}
}
然后,我将IntegrationTest任务作为...你可以调整,因为你可能没有cleanTest(我创建的自定义任务),所以你可以忽略那个依赖...我认为在你的情况下你会使用类似于jettyStart的东西,因为你正在使用它进行IT测试(启动容器运行IT测试,然后用finalizeBy功能来停止jetty .. jetty插件)
task integrationTest( type: Test, dependsOn: cleanTest ) {
jacoco {
//destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
destinationFile = file("$buildDir/jacoco/integrationTest.exec")
//classDumpFile = file("$buildDir/jacoco/classpathdumps")
classDumpFile = file("$buildDir/classes/integrationTest")
}
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath
}
请参阅此帖子,了解我最终的详细输出结构和脚本。我得到单元测试(test.exec)和IT测试intergrationTest.exec的.exec但我没有得到两个测试的jacoco.xml / jacocoHtml报告。我还发现,如果我运行“gradle clean build”(包括调用“test”任务)和“gradle clean build integrationTest”,那么稍后会覆盖build / test-results文件夹中的单元测试数据和build / reports /测试文件夹。
Jacoco Unit and Integration Tests coverage - individual and overall
注意:在我的情况下,jacocoTestReport在其中一个公共gradle文件的global gradle init.d文件夹中定义。这将有助于我们不要在所有/项目级build.gradle文件中包含相同的代码。
答案 2 :(得分:2)
由于我无法通过任何答案使其运行,因此我将在此处添加解决方案。
如果您先运行测试任务(例如integTest
),然后再调用jacocoTestReport
,它将起作用。
您需要做的就是告诉jacocoTestReport
任务从测试任务中找到收集的执行数据的位置。执行数据始终以测试任务命名。因此,如果您有一个名为integTest
的测试任务,那么您的执行数据将存储在build/jacoco/integTest.exec
中。通过将jacocoTestReport
任务添加到属性executeData中,它们也可以配置为查找其他文件。您还可以添加包含通配符,以便将所有执行数据都考虑在内:
jacocoTestReport {
executionData = fileTree(dir: project.projectDir, includes: ["**/*.exec"])
}
通过执行测试覆盖率下方的语句,将为您创建集成测试任务(例如integTest
)
./gradlew integTest jacocoTestReport
这也适用于要在模块integTest
中运行a
任务的多模块项目:
./gradlew a:integTest a:jacocoTestReport
答案 3 :(得分:0)
我相信最完整的答案将如下所示:
tasks.withType(Test) {
finalizedBy jacocoTestReport
}
project.jacocoTestReport {
getExecutionData().setFrom(fileTree(buildDir).include("/jacoco/*.exec"))
reports {
csv.enabled true
}
}
至少它完全适合我的集成和功能测试需求。