如何以及是否使用 Pact 测试句法(错误请求)验证?

How and if test syntactic (bad request) validation with Pact?

我开始使用 Pact(在 Java)进行合同测试。

我已阅读 Contract Tests vs Functional Tests Pact 最佳实践,但我有点困惑。

示例:创建资源的简单 REST 端点 (POST),returning 201 Created on success 和 400 Bad Request for syntactic验证错误。 请求正文类似于:

{
    "firstname" : "Foo",
    "lastname" : "Bar"
}

firstnamelastname都不能为空。据我所知,我可以在这里写 3 个场景,其中提供者应该 return 400 Bad Request:

  1. firstname空白lastname不是空白
  2. firstname不是空白,lastname空白
  3. firstnamelastname 都是 空白

问题是模拟服务器 return 是一个 500 内部服务器错误,如果只定义了 "happy path pact",如果我想让它 return 400 错误请求我有写下所有可能的契约。此外,如果我添加另一个具有相同验证规则的字段,协议数量就会激增。

谢谢。

当我为 POST 建立合同时,我关心服务器接受有效输入以及服务器对错误输入的响应方式(通常为 400)。没有必要为输入可能无效的所有可能方式制定合同,主要是因为无数种原因都会导致这种情况发生。

所以,从消费者的角度来看,我通常只有一个无效输入的合同,除非我面临一个非常特殊的情况,即服务器可能会根据失败的原因做出不同的响应,并且我关心不同的反应。

根据您的具体情况,只为上述三种情况中的一种写一份合同。

在您的案例中,功能与契约讨论的核心信息是:那些不愉快路径的排列属于您的提供者代码,因为那是逻辑所在。

正如@fabricio-lemos 所说,您只需要封装一个 400 错误请求的示例来证明您的代码可以处理这种情况。

至于 500 错误,这可能是因为您没有为每个测试设置一个预期的交互(通过 Pact DSL)。如果您在注册预期交互之前访问 Pact 模拟服务器,您将获得 500。

在伪代码中,您的测试结构可能类似于

Describe "User API"
  BeforeAll
     setup Pact mock server
  AfterEach
     verify and clear interactions 
  With valid request
     setup 201 interaction
     run tests
  With invalid request
     setup 400 interaction
     run tests