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

问题描述:

我的应用程序是春季启动应用程序暴露出一些REST API如何在gradle中运行任务后运行集成任务?

运行我的集成测试,首先将应用程序必须运行起来,我的应用程序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) 

,但我得到的例外下面

* >不能克以及类型为org.gradle.api.Project的根项目'example-api'的未知属性'SpawnProcessTask'。 *尝试: 使用--stacktrace选项运行以获取堆栈跟踪。与--info或--debug选项来运行,以获得更多的日志输出。*

请有人请提出这个

+0

什么?清除你的帖子 – Edwin

+0

@Edwin,没有得到你的评论。 – Bravo

+0

修改您的帖子 - 不可理解! – Edwin

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

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

integration.dependsOn appRun 
integration.mustRunAfter appRun 

此外,它可能会像你的应用程序正在运行,并阻止你的摇篮构建,并生成实际完成进度或者它只是挂起,直到应用程序停止运行?

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

即使您更愿意在测试框架之外运行应用程序,我建议在Java类中包装此逻辑(即启动应用程序,运行测试,停止应用程序),并通过任务从Gradle执行此类类型为JavaExec。这将比通过Gradle任务处理所有这些要清楚得多。最后,如果你仍然坚持Gradle任务,就像评论者所说:“运行”任务可能会在应用程序运行时阻止执行。处理这个问题的唯一方法是在后台启动应用程序,在测试完成后使用另一个应用程序停止应用程序(使用finalizedBy)。