【问题标题】:Spring mock testing in PactPact 中的 Spring 模拟测试
【发布时间】:2017-10-05 10:00:25
【问题描述】:

我正在尝试采用 Pact。我了解等式的消费者方面,它看起来非常好。但我对制作方感到困惑。

文档似乎提倡运行提供程序应用程序,并针对正在运行的服务器验证合同。

我不想这样做。首先,我需要为每个协议创建一个包含适当信息的数据库,这至少可以说是痛苦的。其次,启动应用程序会很麻烦——我有没有提到它是一个整体? - 最后,还有 POSTS 会改变数据库的状态,使测试运行变得脆弱。

我想做的是用协议做一个 mockMvc 风格的测试。我想模拟我的服务,只测试端点,我认为在这种情况下应该测试什么。

如何使用 Pact 实现这一目标?

【问题讨论】:

    标签: pact pact-jvm


    【解决方案1】:

    好吧,如果您不针对您的 Provider 测试您的合同,就会失去合同测试的全部意义,因为您的合同没有针对双方进行测试。因为主要的一点是消费者决定了提供者的行为方式,在你的情况下,你想用一个 mockMvc 绕过提供者,并且只针对你的消费者而不是提供者进行合同测试是没有意义的。即使您的 Provider 是一个整体,最好先运行它并使用合约进行测试,然后再运行所有微服务以进行端到端测试。

    【讨论】:

    • 我想针对提供者进行测试,但使用模拟服务。我不想引导一个正在运行的应用程序来进行合同测试。我可以运行我的端点,并模拟它背后的所有东西。
    • 如果服务是提供者,你怎么能针对服务进行模拟测试呢?如果不部署它,您将无法测试它是否正常工作。如果您记录了 API,也许这可以帮助您到达您想要的位置:bitbucket.org/atlassian/swagger-request-validator
    • 在一个适当的实现中,服务层包含应用程序逻辑来为控制器准备数据......以及如何将数据呈现给客户端取决于控制器。因此,模拟数据服务层对于合同测试应该没问题。合约测试的目的不是测试服务层或完整的e2e api,而只是该应用程序以约定的格式向客户端返回数据。
    【解决方案2】:

    是的,您可以使用 PACT 来实现它,但是我对 Cotnic 的看法相同,认为它超出了将 PACT 放在提供商方面的目的。 PACT 的主要目的是验证您作为提供商的服务器是否按照协议 (PACT) 工作。因此,在我看来,将 PACT 用作 CONTRACT 的正确方法是在完全部署的服务器上运行它,并使用 @State 来“准备”服务器(数据库、启动应用程序等)

    无论如何,如果您使用的是 Spring,您可能可以看看这个使用 Pact 和 MockMvc 的示例

    https://github.com/DiUS/pact-jvm/tree/master/pact-jvm-provider-spring

    【讨论】:

      【解决方案3】:

      Pact-JVM 现在支持 Spring mockmvc 测试来验证 Spring 或 Springboot 提供程序。见https://github.com/DiUS/pact-jvm/tree/master/pact-jvm-provider-spring

      【讨论】:

        猜你喜欢
        • 2019-02-01
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-09
        • 2021-05-28
        • 2019-01-30
        • 1970-01-01
        相关资源
        最近更新 更多