【问题标题】:Avoid restarting server every time when tiny changes on integration tests避免每次在集成测试发生微小变化时重新启动服务器
【发布时间】:2019-10-27 07:19:19
【问题描述】:

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

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

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

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

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

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

我不确定是否可以通过bootRun 启动网络服务器,并且集成测试应该尝试与专用服务器通信,而无需重新启动服务器以运行测试。

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

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

之前

    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"))

【问题讨论】:

  • 如果您发布完整的 Spring 集成测试,将会很有用。

标签: java spring integration spock


【解决方案1】:

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

然后有一种方法可以编写集成测试,以便它们确实与“提前”启动并运行的远程服务器进行通信。在构建期间,这可以在测试阶段之前完成一次,然后在测试完成后关闭服务器。

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

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

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

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

不想做自我广告之类的,但您可以check it out 并可能借用有关如何做到这一点的技术理念。

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    相关资源
    最近更新 更多