如何在持久服务和同步无服务器函数之间定义 Pact 契约?



我有一个持久服务,它通过一些输入同步调用无服务器函数(在 AWS lambda 上,通过无服务器框架),无服务器(和无状态)lambda 函数执行输入的一些转换,并将输出同步返回给调用服务。

我想编写一个 Pact 合约,其中无服务器函数是提供者,持久服务是使用者。我怎样才能为同步(即RequestResponse)无服务器功能?

我找到了一些关于无服务器函数契约的资源,但它们似乎都只处理异步用例,除非我误解了什么。 需要明确的是,在我的案例中,用例不是异步的、事件驱动的消息传递,而是对无服务器函数的同步调用,在等待响应时阻塞。

从 Pact 文档中,我只能找到对基于 HTTP 的 API 和基于消息的异步 API 的支持的引用。此用例都不适合这两种模式,因为我们使用无服务器框架,它在后台执行实际的 HTTP 请求。

就我而言,持久服务(消费者)在 Java 中,无服务器函数在 Kotlin 中,即两者都在 JVM 上。

正如 Matthew Fellows 所提到的,您可以将 AWS Lambda 客户端配置为调用您的自定义 URL,因为它在后台执行常规 HTTP 请求。使用 AWSLambdaClientBuilder 并执行以下操作:

withEndpointConfiguration(
AwsClientBuilder.EndpointConfiguration(pactMockServerEndpoint, Regions.EU_CENTRAL_1.name)
)

您需要在请求标头中设置Content-Type: application/json否则 Pact 无法解析标头(因为出于某种原因默认情况下它是空字符串)。为此使用withRequestHandlers并通过此客户端调用 lambda 函数来创建消费者合约(它应该请求 Pact 模拟服务器而不是 AWS)。

但是,在生产者方面,您需要:

  • 创建一个代理服务器(使用类似MockServer的东西)
  • 在运行 Pact 测试时使用 Pact JUnit 提供程序,以便您可以启动代理服务器
  • 像往常一样在玩 Pact 合约时使用 HTTP 目标,并将代理设置为目标

这个想法是,你有一个代理HTTP服务器,它使用你的无服务器处理程序函数来返回响应:

mockServer.`when`(
HttpRequest.request().withPath(".*")
).respond { httpRequest ->
HttpResponse.response(
// Invoke handler and return response
OBJECT_MAPPER.writeValueAsString(invokeLambdaWithRequest(httpRequest))
).let { httpResponse ->
httpResponse.withHeader(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8")
}
}

这是Pact尚未直接支持的内容。

选项 1目前,您需要编写两组单独的测试来涵盖交互的请求和响应方面,一组由使用者发起,另一组由提供者发起。

选项 2(未经测试)

调用lambda只是通过AWS lambda服务发出的HTTP POST请求,因此理论上可以通过常规HTTP请求/响应进行测试。

请参阅 https://gist.github.com/bethesque/c858e5c15649ae525ef0cc5264b8477c 以获取有关 req/res 样式交互的一些想法(并在 slack.pact.io 加入我们以聊天)

相关内容

  • 没有找到相关文章

最新更新