我的应用程序是Spring启动应用程序暴露一些其他api
要运行我的集成测试,首先应用程序需要启动并运行,因为我的应用程序基于gradle,如何确保从命令提示符执行gradle命令,第一次运行应用程序并运行集成测试。
task integration(type: Test, description: 'Runs the integration tests.', group: 'Verification') {
testClassesDir = sourceSets.integration.output.classesDir
classpath = sourceSets.integration.runtimeClasspath
outputs.upToDateWhen { false }
}
task appRunAndIntegrtationTest {
dependsOn 'run'
dependsOn 'integration'
tasks.findByName('integration').mustRunAfter 'run'
}
我将以上代码添加到build.gradle,但是应用程序启动并运行,就是这样,它只保留了它们,集成测试没有运行,任何人都可以对此有所了解。
更新:@Strelok,如上所述,应用程序已启动且集成任务未运行。
更新1:我找到了一个gradle插件
https://github.com/marc0der/gradle-spawn-plugin
我想尝试使用如下
task startServer(type: SpawnProcessTask, dependsOn: 'assemble') {
command "java -jar ${projectDir}/build/libs/example.jar"
ready 'Started Application'
}
task stopServer(type: KillProcessTask)
但是我遇到了异常
* GT;无法为org.gradle.api.Project类型的根项目'example-api'获取未知属性'SpawnProcessTask'。 *尝试: 使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获得更多日志输出。*
请有人在此提出建议
答案 0 :(得分:0)
您应该声明集成测试任务需要依赖于您的应用运行任务。
appRun
只是一个例子,请使用作为集成测试前身的任务名称。
integration.dependsOn appRun
integration.mustRunAfter appRun
此外,它可能就像您的应用正在运行并阻止Gradle构建的进度,构建是否实际完成,或者只是挂起直到应用停止运行?
答案 1 :(得分:0)
我建议采用不同的方法:从测试框架启动和停止应用程序。测试框架支持测试套件的设置和清理步骤(例如JUnit中的BeforeClass
和AfterClass
),在设置步骤中启动应用程序并在清理步骤中停止它。这种方法将使您的测试更加独立,其成功/失败将不依赖于测试代码之外的因素。
即使您更喜欢在测试框架之外运行应用程序,我建议在Java类中包装此逻辑(即启动应用程序,运行测试,停止应用程序),并通过以下任务从Gradle执行此类输入JavaExec
。它比通过Gradle任务处理所有这些要清楚得多。
最后,如果您仍然坚持使用Gradle任务,那就像评论者说的那样:“运行”任务可能会在应用程序运行时阻止执行。只有理智的方法来处理这个问题是有一个任务在后台启动应用程序,另一个在测试结束后停止它(使用finalizedBy
)。