如何在gradle中运行任务后运行集成任务?

时间:2017-07-04 09:22:12

标签: java spring spring-boot gradle build.gradle

我的应用程序是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选项运行以获得更多日志输出。*

请有人在此提出建议

2 个答案:

答案 0 :(得分:0)

您应该声明集成测试任务需要依赖于您的应用运行任务。

appRun只是一个例子,请使用作为集成测试前身的任务名称。

integration.dependsOn appRun
integration.mustRunAfter appRun

此外,它可能就像您的应用正在运行并阻止Gradle构建的进度,构建是否实际完成,或者只是挂起直到应用停止运行?

答案 1 :(得分:0)

我建议采用不同的方法:从测试框架启动和停止应用程序。测试框架支持测试套件的设置和清理步骤(例如JUnit中的BeforeClassAfterClass),在设置步骤中启动应用程序并在清理步骤中停止它。这种方法将使您的测试更加独立,其成功/失败将不依赖于测试代码之外的因素。

即使您更喜欢在测试框架之外运行应用程序,我建议在Java类中包装此逻辑(即启动应用程序,运行测试,停止应用程序),并通过以下任务从Gradle执行此类输入JavaExec。它比通过Gradle任务处理所有这些要清楚得多。

最后,如果您仍然坚持使用Gradle任务,那就像评论者说的那样:“运行”任务可能会在应用程序运行时阻止执行。只有理智的方法来处理这个问题是有一个任务在后台启动应用程序,另一个在测试结束后停止它(使用finalizedBy)。

相关问题