Gradle 在另一个任务运行时执行任务



我正在一个 Spring 启动项目中工作,使用 gradle 自动进行集成测试。我最近开始在一家新企业工作,我的同事运行集成测试如下: 在build.gradle文件中有一个integrationTest任务

sourceSets {
integrationTest {
java {
compileClasspath = test.output + main.output + compileClasspath
runtimeClasspath = test.output + main.output + runtimeClasspath
}
resources.srcDir file('src/test/resources')
}
}
configurations {
mapstruct
integrationTestCompile.extendsFrom testCompile
integrationTestRuntime.extendsFrom testRuntime
}
compileJava {
options.compilerArgs = [
'-Amapstruct.defaultComponentModel=spring'
]
}
test {
ignoreFailures = true
}
task integrationTest(type: JavaExec) {
classpath = sourceSets.integrationTest.runtimeClasspath
}

启动任务后,应用程序开始在指定的端口中运行,然后打开邮递员,导入集合并运行测试。

我的工作是找到一种方法来跳过额外的点击,即自动运行邮递员集合。 第一个想法是使用 postman-runner gradle 插件,但由于企业计算机的连接问题,我无法将其添加到项目中。 我目前正在研究的第二个想法是在Powershell脚本上运行newman并保存输出。

问题是,在 gradle 中,您可以在另一个任务完成后执行一个任务,但integrationTest任务永远不会完成。它在端口中启动应用程序并继续侦听请求。有没有办法在应用程序开始在端口上运行并在等待请求时运行另一个执行 powershell 脚本的任务?

谢谢!

简单的答案:根据设计,在 Gradle 中不可能在另一个任务仍在运行时执行另一个任务。


但是,可能仍有针对您的问题的解决方案。Gradle 中的任务只是一个概念,需要作为构建的一部分来完成。但它不一定代表一个单一的过程。Gradle 可能会使用两个任务运行流程,一个用于start流程,另一个用于stop流程。下面的 Gradle "伪代码"展示了这个想法的一个示例。

def process
task start {
doFirst {
process = startProcess()
}
finalizedBy 'stop'
}
task stop {
dependsOn 'start'
doFirst {
process.stop()
}
}

此示例甚至使用 Gradle 功能来确保每次执行start时,稍后都会执行stop,反之亦然。Gradle Docker插件使用类似的概念,其任务类型为DockerStartContainerDockerStopContainer

关于您的用例,您可以使用一个任务来启动侦听端口的应用程序,另一个任务运行实际测试(使用 Postman(,另一个任务在测试完成后停止应用程序:

task startApp {
doFirst {
println 'Starting app'
}
finalizedBy 'stopApp'
}
task integrationTest {
doFirst {
println 'Running integration tests'
}
dependsOn 'startApp'
finalizedBy 'stopApp'
}
task stopApp {
doFirst {
println 'Stopping app'
}
dependsOn 'startApp'
}

第二个示例是可用作模板的有效build.gradle文件。运行gradle integrationTest时,您将看到任务以正确的顺序执行。现在缺少的只是任务的实际功能。遗憾的是,Gradle 提供的JavaExec任务类型不支持这种异步执行,因此您可能需要第三方插件或创建自己的任务类型(可能基于ProcessBuilder(。您甚至可以将应用程序包装在 Docker 容器中并使用上面提到的插件。

最新更新