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 注释。这使您有机会确保在测试用例运行之前存在任何状态数据(在本例中为那本书)。
首先,上述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();
我有一本 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 注释。这使您有机会确保在测试用例运行之前存在任何状态数据(在本例中为那本书)。
首先,上述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();