我有一个项目(ProjectA),其中包含一些单元测试和集成测试。
以下是结构。
ProjectA - src/java(java 源代码)
- test/java(Junit 单元测试)
- test/resources(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”及其子文件夹(除了从源代码/版本控制中签出的内容)。
即在 -- JenkinsWorkspace
/ build
- classes下(包含以下称为 sourceSets 部分之一的 .class 文件)
---- integrationTest
---- main
---- test
-资源(这包含所有文件.properties/.xml 文件,位于源代码控制中的“conf”文件夹下
。-报告(包含 PMD/CheckStyle/Findbugs 的 .xml/.html 文件以及单元或 IT 测试的测试结果,但不是两者)。--- - checkstyle
---- findbugs
---- pmd
---- jacoco
---- tests (注意:这是复数,即它不是“test”,它被定义为 sourceSets 中的一个条目)
- jacoco(这包含 2 个 .exec 文件,即 test.exec 和 integrationTest.exec 都有不同的文件大小)
---- test.exec
---- integrationTest.exec
- jacocoHtml(这个文件夹包含很多文件夹(包含 .html文件),主要是它下面的“index.html”
。---- somexxxfolders
---- ---- somexxfolder's.html files
---- index.html
---- other etc files/folders
- test-results (这包含一些 .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 文件下为 .exec 文件命名,还是在 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 的一个很好的功能)。