gpt4 book ai didi

unit-testing - Jacoco 单元和集成测试覆盖范围 - 个人和整体

转载 作者:行者123 更新时间:2023-12-04 04:48:54 25 4
gpt4 key购买 nike

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。




Improve this question




我有一个项目(ProjectA),其中包含一些单元测试和集成测试。

以下是结构。

项目A
- src/java (java 源代码)
- test/java(Junit 单元测试)
- 测试/资源(Junit 单元测试所需的资源)
- src/java-test(集成测试)
- conf(包含构建/测试/编译目的所需的 .xml 文件)

我运行以下命令——它们都可以工作,但我怀疑我在 build.gradle/GRADLE_HOME/init.d/*.gradle 文件中的配置如何影响我得到的东西。

似乎我错过了一些东西并且没有得到我想要的东西。

命令 :
- gradle clean build - 它工作正常
- gradle clean build jacocoTestReport - 它工作正常。
- gradle clean build integrationTest jacocoTestReport - 它工作正常(如果我有一个 tomcat 实例并在同一个 ProjectA 的另一个腻子窗口中运行)。

在第三个项目符号操作完成后,我在我的 Jenkins 作业工作区中看到了额外的文件夹“build”及其子文件夹(除了从源/版本控制 check out 的内容)。

即在 -- JenkinsWorkspace 下
/构建
- 类(class) (包含以下内容的 .class 文件,这些文件被称为 sourceSets 部分之一)
----集成测试
- - 主要的
- - 测试
- 资源 (这包含源代码管理中“conf”文件夹下的所有文件 .properties/.xml 文件。
- 报告 (包含单元或 IT 测试的 PMD/CheckStyle/Findbugs 和测试结果的 .xml/.html 文件,但不能同时包含两者)。
---- 检查样式
---- 发现错误
---- pmd
---- 贾 cocoa
---- 测试( 注意 :这是复数,即它不是“test”,它被定义为 sourceSets 中的一个条目)
- jacoco (这包含 2 个 .exec 文件,即 test.exec 和 integrationTest.exec 都有不同的文件大小)
---- test.exec
----集成Test.exec
- jacocoHtml (此文件夹包含许多文件夹(包含 .html 文件),主要是其下的“index.html”。
---- somexxx文件夹
---- ---- somexxfolder's.html 文件
---- index.html
---- 其他等文件/文件夹
- 测试结果 (这包含一些 .xml 文件,但仅用于单元测试或集成测试 - 但 而不是 在给定时间用于两种测试类型)。
即如果我运行“gradle clean build”,那么您将看到与单元测试相关的 .xml 文件和
如果我运行“gradle clean build integrationTest”,则单元测试 .xml 文件将被覆盖
和我看到的 .xml 文件仅与 integrationTest 任务相关/生成。

以下是常用的gradle之一(GRADLE_HOME/init.d/some.common.gradle文件)

//
//Extra file can hold global Gradle settings so that these dont have to be inserted in project
//specific build.gradle file.
//Filename: extraN.common<anyname>.gradle
allprojects {
apply plugin: 'java'
apply plugin: 'pmd'
apply plugin: 'findbugs'
apply plugin: 'checkstyle'
apply plugin: 'jacoco'
apply plugin: 'sonar-runner'
tasks.withType(Compile) {
options.debug = true
options.compilerArgs = ["-g"]
}
sourceSets {
main {
java {
// MOTE: If your project's build.gradle specify the sourceSet section, the following
// values will be overwritten by what project's build.gradle will set.
//
// If you project's sourceSet structure if different in each project, then in this
// global common .gradle file, you can define srcDir for main or other sections like
// test, integrationTest etc as shown below -- commented out. If that's the case,
// then uncomment the below line and comment out using // -- srcDir 'src/java' line
// for sourceSets.main.java section. This rule applies to other sections as well.
// srcDir 'no_src_dir_set_yet'

srcDir 'src/java'
}
resources {
srcDir 'conf'
}
}
test {
java {
srcDir 'test/java'
}
resources {
srcDir 'test/resources'
srcDir 'conf'
}
}
integrationTest {
java {
srcDir 'src/java-test'
}
resources {
srcDir 'conf'
}
}
}
def sonarServerUrl = "dev.sandbox.server.com"
sonarRunner {
sonarProperties {
property "sonar.host.url", "http://$sonarServerUrl:9000"
property "sonar.jdbc.url", "jdbc:h2:tcp://$sonarServerUrl:9092/sonar"
property "sonar.jdbc.driverClassName", "org.h2.Driver"
property "sonar.jdbc.username", "sonar"
property "sonar.jdbc.password", "sonar"
properties ["sonar.sources"] += sourceSets.main.allSource.srcDirs
//properties ["sonar.tests"] += sourceSets.test.java.srcDirs
properties ["sonar.tests"] += sourceSets.integrationTest.allSource.srcDirs
}
}
checkstyle {
configFile = new File(rootDir, "config/checkstyle.xml")
ignoreFailures = true
//sourceSets = [sourceSets.main, sourceSets.test, sourceSets.integrationTest]
sourceSets = [sourceSets.main]
}
findbugs {
ignoreFailures = true
sourceSets = [sourceSets.main]
}
pmd {
ruleSets = ["basic", "braces", "design"]
ignoreFailures = true
}
jacoco {
toolVersion = "0.6.2.201302030002"
reportsDir = file("$buildDir/customJacocoReportDir")
}
task testReport(type: TestReport) {
destinationDir = file("$buildDir/reports/allTests")
}
test {
jacoco {
//destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
destinationFile = file("$buildDir/jacoco/test.exec")
//classDumpFile = file("$buildDir/jacoco/classpathdumps")
classDumpFile = file("$buildDir/build/classes/test")
}
}
jacocoTestReport {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
reports {
xml{
enabled true
destination "${buildDir}/reports/jacoco/jacoco.xml"
}
csv.enabled false
html{
enabled true
destination "${buildDir}/jacocoHtml"
}
}
additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
//additionalSourceDirs = files([sourceSets.main.allJava.srcDirs, xxxx, 'xxxxyyyy' ])
}
}

build.gradle 文件看起来像:
import com.tr.ids.gradle.CustomFileUtil
apply plugin: 'CustomSetup'
apply plugin: 'java'
apply plugin: 'customJarService'
apply plugin: 'customWarService'
sourceSets {
main {
java {
srcDir 'src/java'
}
}
test {
java {
srcDir 'test/java'
}
resources {
srcDir 'test/resources'
srcDir 'conf'
}
}
integrationTest {
java {
srcDir 'src/java-test'
}
}
}
// Read dependency lists from external files. Our custom plugin reads a dep-xxx.txt file for compile/test/war related .jar file entries
// where each entry is like: groupid:artifactid:x.x.x
// and these artifact jars are available in Artifactory
List depListCompile = customFileUtil.readIntoList( "$projectDir/dep-compile.txt" )
List depListTest = customFileUtil.readIntoList( "$projectDir/dep-testArtifacts.txt" )
List depListWar = customFileUtil.readIntoList( "$projectDir/dep-war.txt" )
// Define dependencies
dependencies {
// Compilation
compile depListCompile
// Unit Tests
testCompile depListTest
// Integration tests
// Everything from compile and testCompile targets
integrationTestCompile configurations.compile
integrationTestCompile configurations.testCompile
// Output of compiling "main" files
integrationTestCompile sourceSets.main.output
// Additional dependencies from war and others
integrationTestCompile depListTest, depListWar
// All configuration files
integrationTestRuntime files( 'conf' )
}
task deployTomcat( type: Copy, dependsOn: [ jar, compileIntegrationTestJava, warService ] ) {
from "$buildDir/customWar/${project.name}.war"
into "$projectDir/tomcat/webapps"
}
build {
dependsOn deployTomcat
}
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
}
apply plugin: 'eclipse'
eclipse.classpath {
// Define output directory so Eclipse does not accidentally clobber /bin
defaultOutputDir = file( 'out/classes' )
// Add integration test
plusConfigurations += configurations.integrationTestCompile
// Remove unnecessary files
file.whenMerged { classpath ->
classpath.entries.removeAll { entry -> ( entry.path.indexOf( '/build/classes/main' ) > 0 ) }
classpath.entries.removeAll { entry -> ( entry.path.indexOf( '/build/resources/main' ) > 0 ) }
}
}

我的问题 :
1) 为什么“gradle clean build integrationTest”——它运行成功,会覆盖 build/reports/tests 和 build/test-results 文件夹中的测试结果。

2)无论我在通用 gradle 文件下为 test 和 build.gradle 中为 jacoco 的integrationTest 任务指定什么名称都没有关系,它总是创建 test.exec 和 integrationTest.exec 文件,但生成的 build/jacocoHtml 文件夹index.html 文件不显示与单元/集成测试相关的覆盖率/文件。为了证明这一点,如果我运行“gradle clean build integrationTest jacocoTestReport sonarRunner”,我会看到该作业的工作区,现在包含“.sonar”文件夹和 build/reports/sonar 文件夹,其中包含另一个名为“overall-xxx.exec”的文件"一些文件,但该文件大小不接近 Unit test.exec 和 IT integrationTest.exec 文件大小的“总和”。虽然它比 test.exec 文件大小大几个字节。

3) 我可以设置什么配置来全面覆盖单元和 IT 测试,即总体...exec 文件大小合适(在运行 sonarRunner 任务之后)。在 sonarRunner 任务期间,我确实看到 SonarRunner 任务的“jacocoSensor 步骤”确实会自动看到 UT 和 IT .exec 文件以及整个 .exec 文件(Sonar 的一个很好的功能)。

最佳答案

找到了我的第二个问题的答案。高层信息:

  • Gradle 1.6 jacocoTestReport 使用的变量不同,Gradle >=1.7 使用的变量不同。

    例如:我们可以通过使用 CORRECT 变量更改“test”或“integrationTest”任务来调整单元测试和集成测试 .exec 文件的创建 - 否则它不会生成“test.exec”和“integrationTest.exec”默认文件名称。请参阅下面的示例。

  • 任务集成测试(类型:测试)测试 { ... } 部分可以为我们正在使用的给定 Gradle 版本提供正确的变量。
    task integrationTest (type: Test) { 
    testClassesDir = sourceSets.integrationTest.output.classesDir

    classpath = sourceSets.integrationTest.runtimeClasspath

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



    ignoreFailures = true
    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")
    */
    }
    }

    同样,对于 test { .... } 任务,您可以将其定义为 ../../UT/jacocoUT.exec 和 ../../UT/classpathdumps...
  • 如果我在我的项目工作区中运行“sonar-runner”Linux/Unix sonar-runner 可执行文件,则会创建 .sonar 文件夹,但如果我运行调用 Gradle“clean build integrationTest jacocoTestReport sonarRunner”的 Jenkins 作业,则创建 build/sonar 文件夹并成为 SONAR 的 WORKING DIR(在输出期间显示)。
  • 在 Jenkins > 后构建部分下,我提到了以下内容和现在,Jenkins 仪表板上的 jacoco 代码覆盖率报告,用于两个 jacoco 文件(.html 和 .xml) - 包括单元和集成测试代码覆盖率数据。

  • Jenkins 中的记录 Jacoco 覆盖率报告部分具有以下框:

    我提到:

    exec 文件的路径: /build/jacoco/UT/jacocoUT.exec, */build/jacoco/IT/jacocoIT.exec
    类目录的路径:*/build/jacoco/
    /classpathdumps/com/thc
    (这是 Jacoco 检测类所在的位置).. build/jacoco/UT/classpathdumps/com/thc 和 build/jacoco/IT/classpathdumps/com/thc 都将被选中,因为 ** 将被替换为下的任何文件夹 build /雅 cocoa 。此值也可以设置为“build/classes”文件夹。

    源文件路径:**
    (如果我使用 src/java,很少有源文件的链接不起作用,即文件内容不显示).. 使用 ** .. 现在可以使用了。

    休息箱 - 留空。
  • 仍然想知道 - 为什么整体 jacoco.exec 没有文件大小 = jacocoUT.exec 和 jacocoIT.exec
  • 的总和

    在这一点上,我可以看到单元测试和集成测试的 Jacoco 代码覆盖率,即通过访问作业仪表板上的 Jacoco 代码覆盖率图像并访问源代码链接,如果你去浏览“build/reports/jacoco/html/index.html”或“build/jacocoHtml/index.html”文件。

    仍在试图找出 - SONAR 需要做什么才能选择这 2 个 .exec 文件(我为 sonar.xxx variurs 变量设置了有效值,用于源、测试、二进制文件、...reportsPath 等用于 UT/IT exec 文件...在 SonarQube 仪表板上,单元测试覆盖率显示良好,但集成测试覆盖率仍为 0.0%。

    我将很快粘贴我的 common.gradle 和项目的 build.gradle 文件的副本......以便更好地查看。

    关于unit-testing - Jacoco 单元和集成测试覆盖范围 - 个人和整体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18879250/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com