如何组装Gradle的测试套件?

ycl3bljg  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(176)

假设我有一个基本的Java应用程序,还有一个用于集成测试的额外特定测试套件(在Gradle中使用testing{suites{...}} DSL定义)。我想将这个测试套件打包并分发为一个独立的自包含的东西,将org.junit.platform.console.ConsoleLauncher作为Main-Class,并且只需要一个JRE来运行。
如果你有一个基本的java应用程序,Gradle的applcation插件为你提供了一组方便的任务,可以将你的src/main代码+依赖项打包到一个带有bin + libs文件夹的tar/zip中。因此,您将得到一个归档到tar/zip中的独立包,并且您只需要JRE来运行它。这些任务被命名为distTar/distZip,用于相应地生成tar/zip,或者还有一个assembleDist,用于同时生成两种类型的存档。
我如何创建自己的distSpecificTestSuite(Tar|Zip)任务,它将只打包我需要的测试套件+它的依赖项到一个独立的可分发文件中?

tuwxkamq

tuwxkamq1#

我是这样解决这个问题的。因此,假设我的自定义测试套件(testIntegration)声明如下:

plugins {
    java
    `jvm-test-suite`
}

testing {
    @Suppress("UnstableApiUsage")
    suites {
        val integrationTestSuite = register<JvmTestSuite>("testIntegration") {
            description = "Runs integration tests."
            testType.set("integration")

            useJUnitJupiter()
            dependencies {
                runtimeOnly("org.junit.platform:junit-platform-console-standalone")
            }
        }
    }
}

然后,为了从这个自定义测试套件中生成可执行的“分发”,并以原生Gradle方式执行,我创建了额外的任务(类似于application插件为src/main代码提供的开箱即用的任务),并声明了一个自定义distribution,如下所示:

plugins {
    java
    `jvm-test-suite`
    distribution // <-- adding plugin for `distributions {...}` DSL
}

val packageIntegrationTestsJar by tasks.registering(Jar::class) {
    archiveFileName.set("integration-tests.jar")
    from(sourceSets.findByName("testIntegration")!!.output)
    destinationDirectory.set(File(project.buildDir, "libs-integration-tests"))
}

val integrationTestsStartScripts by tasks.registering(CreateStartScripts::class) {
    description = "Creates OS specific scripts to run integration tests as a JVM application."
    classpath = packageIntegrationTestsJar.get().outputs.files + sourceSets.findByName("testIntegraion")!!
        .runtimeClasspath
    mainClass.set("org.junit.platform.console.ConsoleLauncher")
    applicationName = "integration-tests"
    outputDir = File(project.buildDir, "scripts")
}

distributions {
    create("integrationTests") {
        distributionBaseName.set("integration-tests")
        version = ""
        contents {
            from(sourceSets.findByName("testIntegration")!!.runtimeClasspath){
                include("*.jar")
                into("lib")
            }
            from(packageIntegrationTestsJar) {
                into("lib")
            }
            from(integrationTestsStartScripts) {
                into("bin")
            }
        }
    }
}

上述distributions配置为您创建了以下附加任务:integrationTestsDistZip / distTar / distJarinstallIntegrationTestsDist
因此,Gradle将为您准备一个“发行版”,其中将包含binlib文件夹。所有jar(包括integration-tests.jar本身)都放在lib中,bin包含用于在默认JVM上运行测试套件的windows/unix脚本,这些脚本具有来自lib的所有必要的类路径

相关问题