PACT:如何使用 Provider DataBase 中存在的有效数据创建动态路径

PACT : How to have dynamic path with valid data that is present in Provider DataBase

我有一本 restFul API http://localhost:8080/books/{id} 其中 return 一本具有特定 ID 的书。

例如:

获取 http://localhost:8080/books/1

将return

{ "id" : 1, "pages" : 20, "price" : 100 }

获取http://localhost:8080/books/2

将return

{ "id" : 2, "pages" : 30, "price" : 120 }

我已经使用正则表达式代替 {id} 写下了我的消费者期望,并生成了 PACT。

提供程序中现在没有数据。 (数据库中没有书籍信息)。当我 运行 在供应商方面进行契约验证时,它失败了,因为它无法通过点击实际服务来交叉检查契约来获取任何信息。

是否可以在提供商数据库中没有数据的情况下验证合同?还是有任何解决方法?

如果我们将提供程序部署到多个环境中,提供程序的数据库也会发生变化,如何处理?

感谢您的帮助。谢谢。

为什么要解决这个问题?合同测试的重点是让您可以验证合同双方是否得到妥善满足!

为此,您可能需要查看提供者状态 [1]。

您使用的是哪种语言?

所提供的文章为您提供了一些背景知识。在JVM中,可以看一下@State注解https://github.com/DiUS/pact-jvm/tree/master/pact-jvm-provider-junit#example-of-http-test.

在您的消费者中,您将指定一个状态,例如 "Given a book with ID 1 exists"。在提供者端,框架将调用与此期望相对应的@State 注释。这使您有机会确保在测试用例运行之前存在任何状态数据(在本例中为那本书)。

[1] https://docs.pact.io/documentation/provider_states.html

首先,上述URL中的none有效。 &它非常难以使用这个框架.. API 的 none 有适当的文档并且当某些东西不起作用时也很血腥,它也没有给出正确的错误消息。

就我而言,我一直在尝试发送一个名为 "business-date" 的请求参数,该参数期望格式为 "yyyy-MM-dd" 的日期,并且以下选项的 none 似乎有效 - -

matchQuery("business-date", "\d{4}-\d{2}-\d{2}", "2020-05-18")

query("business-date="+getBusinessDate())

queryMatchingDate("business-date", "yyyy-MM-dd")

matchQuery("business-date", "\d{4}-\d{2}-\d{2}")

queryMatchingDate("business-date", "yyyy-MM-dd")

queryMatchingISODate("business-date", "yyyy-MM-dd")

异常看起来像这样

org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Internal Server Error: [{ "error": "Unexpected request : \tmethod: GET\n\tpath: \/api\/batch_activities\/ACTIVITY\/STARTED\n\tquery: {}\n\theaders: {X-b3-traceid=[6c88f0a1a0ae288e], Accept=[application\/json], Connection=[ke... (443 bytes)]

Caused by: org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Internal Server Error: [{ "error": "Unexpected request : \tmethod: GET\n\tpath: \/api\/batch_activities\/ACTIVITY\/STARTED\n\tquery: {}\n\theaders: {X-b3-traceid=[6c88f0a1a0ae288e], Accept=[application\/json], Connection=[ke... (443 bytes)]

DSL 实例如下所示 -

builder.given("Fetch Batch Activity by status")
        .uponReceiving("Receiving Batch activity status").headers(headers).method(HttpMethod.GET)
        .matchPath(pathRegex, path)
        .matchQuery("business-date", "\d{4}-\d{2}-\d{2}")
        .willRespondWith().status(200).headers(headers).body(jsonUtil.getObjectAsString(
            formatBatchActivityForStatus(FeedExporterConstants.BATCH_STATUS_STARTED)))
        .toPact();