Java 避免每次在集成测试中发生微小更改时重新启动服务器

Java 避免每次在集成测试中发生微小更改时重新启动服务器,java,spring,integration,spock,Java,Spring,Integration,Spock,避免每次在集成测试中发生微小更改时重新启动服务器 我刚接触Spring,在Spring上编写集成测试时感到非常痛苦 例如,假设我正在运行集成测试并更改下面的代码 请看,与服务器代码更改无关 要运行新更新的集成测试代码,我必须再次启动Web服务器和数据种子设定,这可能需要5分钟的时间 很难想象人们是如何以这种方式管理发展的 我不确定是否可以通过bootRun启动Web服务器,集成测试应该尝试与专用服务器通信,而不必重新启动服务器以运行测试 通常,哪个部件配置文件将定义此行为 我接管了这个项目,必须

避免每次在集成测试中发生微小更改时重新启动服务器

我刚接触Spring,在Spring上编写集成测试时感到非常痛苦

例如,假设我正在运行集成测试并更改下面的代码

请看,与服务器代码更改无关

要运行新更新的集成测试代码,我必须再次启动Web服务器和数据种子设定,这可能需要5分钟的时间

很难想象人们是如何以这种方式管理发展的

我不确定是否可以通过
bootRun
启动Web服务器,集成测试应该尝试与专用服务器通信,而不必重新启动服务器以运行测试

通常,哪个部件配置文件将定义此行为

我接管了这个项目,必须自己解决

之前 之后
集成测试有很多不同的方法。 Spring有一个内置框架,可以在与实际服务器相同的JVM中运行集成测试。 如果应用程序很重(通常与整块相关),那么运行它确实需要时间,那么您最好“选择”要加载的应用程序中与测试相关的部分。在spring中,有一些方法可以实现这一点,问题是您的应用程序代码是否允许这样的分离

然后有一种编写集成测试的方法,这样它们就可以与“提前”启动并运行的远程服务器进行通信。在构建过程中,这可以在测试阶段之前完成一次,然后当测试完成时,服务器应该关闭

通常,像这样的测试有一些方法来指定用于通信的服务器主机/端口(我将安全性、凭据等放在一边)。 因此,您可以检查是否有一些特殊的标志/系统属性-从那里读取主机/端口

这种方法的一个好处是,您不需要在每次测试之前重新启动服务器。 糟糕的是,它并不总是允许轻松地进行测试:如果您的测试部署了一些测试数据,那么该测试还必须在测试结束时删除这些数据。 测试必须仔细设计

第三种方法是一种混合方法,通常不是主流方法: 您可以创建一个特殊的设置,它将在不同的JVM(外部)中运行测试,但是一旦测试开始,它的字节码就会上传到正在运行的服务器(服务器必须有一个后门),并且实际的字节码会在服务器上实际执行。服务器再次启动并运行

我曾经写过一个库来和斯波克一起做这件事,但那是很久以前的事了,我们毕竟没有使用过它(那个项目已经结束)


我不想做自我宣传什么的,但是你可以,也许可以借用一些技术上的想法来做这件事。

如果你发布完整的spring集成测试,这将是非常有用的。
    serverResp.then()
            .statusCode(203)
            .body("query.startDateTime", equalTo("2018-07-01T00:00:00"))
    serverResp.then()
            .statusCode(200)
            .body("query.endDateTime", equalTo("2020-07-01T00:00:00"))