创建一个 Groovy 可执行 jar,其中包含要执行的 Spock 测试集

Create a Groovy executable jar with Spock test set as to be executed

我想用两个 groovy 文件创建 jar,AppLogic.groovy 其中包含两个少数 groovy classes 和另一个文件,AppSpec 有 Spock 测试套件我想执行这个 Spock class(设置为可执行文件)。如何创建具有所有依赖项的此类 jar?我在这里找到了与 jUnit 类似的东西:how to export (JUnit) test suite as executable jar 但无法根据我的需要进行调整。

我使用 gradle 进行构建,这是我的 build.gradle 文件:

group 'someGroup'
version '1.0'

apply plugin: 'groovy'
apply plugin: 'java'
apply plugin:'application'

sourceCompatibility = 1.7

repositories {

//some repos here

maven { url "http://repo.maven.apache.org/maven2" }
}

dependencies {
//some dependencies here
}

我四处浏览并找到了 SpockRuntime,但我不知道是否以及如何使用它来实现我的目标。

获胜者是:

static void main(String[] args) {
    EmbeddedSpecRunner embeddedSpecRunner = new EmbeddedSpecRunner()
    embeddedSpecRunner.runClass(MySpec)
}

我不建议按照接受的答案中所述使用 spock 实现中的 EmbeddedSpecRunner。

这是我发现与 gradle 4.9 一起可靠工作的东西。基本方法是使用:

  1. gradle 应用程序插件创建单个 tar 文件,其中包含所有 testRuntimeClasspath 依赖项和 运行 spock 测试 运行 脚本
  2. gradle maven-publish 插件将 tar 文件作为工件发布到您的 maven 存储库(在我的例子中是 nexus)

build.gradle 文件如下所示:

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'maven-publish'
apply plugin: 'application'

mainClassName = 'org.junit.runner.JUnitCore' // The junit 4 test runner class
applicationName = 'run-tests-cli'  // Feel free to change

repositories {
    ...
}

dependencies {
    ...

    testImplementation "org.codehaus.groovy:groovy-all:${groovyVersion}"
    testImplementation "org.spockframework:spock-core:${spockVersion}"

}

// Package compiled spock / junit tests to <artifact>-test-<version>.jar
task testJar(type: Jar) {
    classifier = 'tests'
    from sourceSets.test.output.classesDirs
}

// Copy all testRuntimeClasspath dependencies to libs folder
task copyToLibs(type: Copy) {
    from configurations.testRuntimeClasspath
    into "$buildDir/libs"
}

// Make sure test jar is copied
copyToLibs.dependsOn('testJar')

// Make sure platform-specific shell scripts are created after copyToLibs
startScripts.dependsOn(copyToLibs)

// Configure what goes into the tar / zip distribution file created by gradle distribution plugin assembleDist task
distributions {
    main {
        contents {
            // Include test jar
            from(testJar) {
                into "lib"
            }
            // Include all dependencies from testRuntimeClasspath
            from(copyToLibs) {
                into "lib"
            }
        }
    }
}

startScripts {
    // Ensure ethat all testRuntimeClasspath dependencies are in classpath used by shell scripts
    classpath = project.tasks['testJar'].outputs.files + project.configurations.testRuntimeClasspath
}

publishing {
    repositories {
        maven {
            def releasesRepoUrl = "https://nexus.yourcompany.com/repository/maven-releases/"
            def snapshotsRepoUrl = "https://nexus.yourcompany.com/repository/maven-snapshots/"
            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
            credentials {
                username = rootProject.getProperty('NEXUS_USERNAME')
                password = rootProject.getProperty('NEXUS_PASSWORD')
            }
        }
    }
    publications {
        maven(MavenPublication) {
            groupId = 'com.yourgroupId'
            version = "${rootProject.getVersion()}"
        }
        TestJar(MavenPublication) {
            artifact(testJar)
        }
        RunTestsCliTar(MavenPublication) {
            artifact(distTar)
            artifactId "${applicationName}"
        }
    }
}

现在您可以执行以下操作:

  • 要在没有 运行ning 测试任务的情况下构建项目(包括 tar 文件):gradle -x test clean build
  • 发布项目产生的工件(包括 tar 文件到 maven 仓库——在我的例子中是 nexus):gradlew -x test publish。请注意,您需要提供凭据才能将工件上传到存储库。最好在 ~/.gradle/gradle.properties 中定义它们(在我的示例中为 NEXUS_USERNAME、NEXUS_PASSWORD)或通过 gradle 命令行上的 -P 选项指定它们.