gpt4 book ai didi

gradle - 在另一个任务正在运行时,Gradle执行任务

转载 作者:行者123 更新时间:2023-12-03 05:23:39 26 4
gpt4 key购买 nike

我正在一个Spring Boot项目中使用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 ,导入集合并运行测试。
我的工作是找到一种跳过多余点击的方法,即自动运行 postman 收藏。
第一个想法是使用 postman-runner gradle plugin,但是由于企业计算机的连接问题,我无法将其添加到项目中。
我当前正在研究的第二个想法是在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 plugin使用类似的概念,其任务类型为 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容器中,并使用上述插件。

关于gradle - 在另一个任务正在运行时,Gradle执行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62536066/

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