在另一个任务正在运行时,使任务执行任务

时间:2020-06-23 13:36:48

标签: gradle integration-testing

我正在一个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脚本的任务?

谢谢!

1 个答案:

答案 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使用类似的概念,其任务类型为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容器中,并使用上述插件。