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

时间:2019-06-12 17:56:45

标签: java spring integration spock

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

我是Spring的新手,在Spring上编写集成测试时感到很痛苦。

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

看,与服务器代码更改没有任何关系。

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

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

我不确定是否可以通过matches来启动Web服务器,并且集成测试应该尝试与专用服务器通信,而不必费心重启服务器来运行测试。

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

我接手了这个项目,不得不自己解决。

之前

bootRun

之后

    serverResp.then()
            .statusCode(203)
            .body("query.startDateTime", equalTo("2018-07-01T00:00:00"))

1 个答案:

答案 0 :(得分:1)

有很多不同的方法来进行集成测试。 Spring具有一个内置框架,该框架在与真实服务器相同的JVM中运行集成测试。 如果应用程序很沉重(通常与整体程序有关),则确实会花费一些时间来运行它,那么,您最好的办法就是“选择”要加载的与测试相关的应用程序部分。在春季,有多种方法可以实现这一目标,问题是您的应用程序代码是否允许这种分离。

然后,有一种方法可以编写集成测试,以便它们确实与“预先”运行的远程服务器通信。在构建过程中,可以在测试阶段之前完成一次,然后在完成测试后,应关闭服务器。

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

此方法的优点在于,您无需在每次测试之前都重新启动服务器。 不好的是,它并不总是允许轻松进行测试:如果您的测试部署了一些测试数据,则该测试还必须在测试结束时删除数据。 测试必须精心设计。

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

我曾经写过一个库来用Spock来做到这一点,但那是很久以前的事了,毕竟我们还没有使用过它(那个项目已经关闭)。

不想进行自我广告或其他任何事情,但是您可以check it out,甚至可以借鉴有关如何做到这一点的技术思路。

相关问题