当前位置: 首页 > 知识库问答 >
问题:

Gradle在另一个任务运行时执行任务

长孙景焕
2023-03-14

我正在从事一个spring boot项目,以自动化与gradle的集成测试。我最近开始在一家新企业工作,我的同事们按如下方式运行集成测试:在构建中。gradle文件有一个集成测试任务

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,导入集合并运行测试。

我的工作是找到一种方法来跳过额外的点击,即自动运行邮递员集合。第一个想法是使用postman-run gradle插件,但由于企业计算机的连接问题,我无法将其添加到项目中。我目前正在研究的第二个想法是在powershell脚本上运行newman并保存输出。

问题是,在gradle中,您可以在另一个任务完成后执行一个任务,但integrationTest任务永远不会完成。它在端口中启动应用程序并不断侦听请求。在应用程序开始在端口上运行并且等待请求时,是否有方法运行另一个执行powershell脚本的任务?

非常感谢。

共有1个答案

董阳平
2023-03-14

简单回答:根据设计,在Gradle中,当另一个任务仍在运行时,不可能执行一个任务。

然而,可能仍然有解决您的问题的方法。Gradle中的任务只是一个概念,需要作为构建的一部分来完成。但它不一定代表单个过程。Gradle可能会使用两个任务来运行一个进程,一个是启动进程,另一个是停止进程。下面的Gradle“伪代码”显示了这一想法的示例。

def process

task start {
    doFirst {
        process = startProcess()
    }
    finalizedBy 'stop'
}

task stop {
    dependsOn 'start'
    doFirst {
        process.stop()
    }
}

此示例甚至使用Gradle功能来确保每次执行start时,Stop将在稍后执行,反之亦然。Gradle Docker插件与其任务类型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'
}

第二个示例是有效的构建。gradle可以用作模板的文件。当运行gradle integrationTest时,您将看到任务以正确的顺序执行。现在缺少的只是任务的实际功能。遗憾的是,Gradle提供的JavaExec任务类型不支持这种异步执行,因此您可能需要第三方插件或创建自己的任务类型(可能基于ProcessBuilder)。您甚至可以将应用程序包装在Docker容器中,并使用上述插件。

 类似资料:
  • 我在gradle项目中添加了一个任务: 现在,任务总是在任务之前运行。这很好,因为构建任务包含许多步骤。现在我想显式禁用其中一个包含的任务。

  • 问题内容: 我有以下使用类的课程。所以我想做的是,在运行cp1实例处理方法的同时,我要并行运行。 但是,我要按顺序cp1,所以我要它运行并完成,如果cp2没有完成或失败,那就很好。如果确实失败,我想加入结果。该示例中未返回任何内容,但我想返回结果。 为此,应该使用TaskExecutor吗?还是线程? 我只希望cp2与cp1并行运行。或者,如果我添加更多内容,例如说cp3,我希望它也可以与cp1并

  • 我已经创建了3个任务。Task3取决于Task1和Task2的结果。在调试代码时,它会正确执行,但在运行应用程序时,Task3会在Task1和Task2完成之前执行。 示例代码: 提前谢谢。

  • 我有一个spark作业,它从数据库中读取数据,执行过滤、联合、2连接,最后将结果写回数据库。 然而,最后一个阶段仅在50个执行器中的一个执行器上运行一个任务。我试图增加分区的数量,使用哈希分区,但没有成功。 经过几个小时的谷歌搜索,似乎我的数据可能会但我不知道如何解决它。 有什么建议吗? 规格: < li >独立群集 < li>120核心 < li>400G内存 遗嘱 执行 人: 30个执行器(4

  • 这是我的扑动医生总结 flutter doctor医生总结(要查看全部详情,运行flutter doctor -v): [√] Flutter(渠道稳定,1.22.3,在微软Windows[版本10.0.19041.572],locale en-KE)[√]Android tool chain-develop for Android devices(Android SDK版本30.0.2) [!]

  • 我有一个任务执行10秒,周期为1秒,没有延迟,另一个任务执行30秒,周期为5秒,当第一个任务完成时。 此外,我需要取消两个任务时,一个按钮被按下。 > 我尝试了基本线程,但将阻塞GUI,直到两个任务都执行 我尝试,但我这里是一个接一个地执行任务,但不是每个任务都定期执行 我尝试了预定的executor,但预定的executor是异步的,我知道如何使用 任何反馈都很感激。