我正在一个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-runner gradle plugin,但是由于企业计算机的连接问题,我无法将其添加到项目中。 我目前正在研究的第二个想法是在Powershell脚本上运行newman并保存输出。
问题是,在gradle中,您可以在另一个任务完成后执行任务,但是integrationTest
任务永远不会完成。它在端口中启动应用程序,并继续监听请求。在应用程序开始在端口上运行并且正在等待请求之后,是否可以运行另一个执行powershell脚本的任务?
谢谢!
答案 0 :(得分:0)
简单答案:根据设计,在另一个任务仍在运行时,在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使用类似的概念,其任务类型为DockerStartContainer
和DockerStopContainer
。
关于用例,您可以使用一个任务来启动侦听端口的应用程序,使用另一个任务运行实际测试(使用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容器中,并使用上述插件。