PACT - 使用供应商状态(PACT - Using provider state)

2019-09-28 00:50发布

我试图使用协议用于验证春季启动微服务。 我已经产生,从消费者的协议文件,并使用协议的经纪人证实它在提供方。

我有我需要验证与实际服务响应的协议文件之前执行一些代码另一种使用情况。 我读状态改变URL和状态变化与关闭来实现它,但是不可能得到如何实现这样的一个例子。 有人能帮忙吗?

我的具体情况是:我创建了一个合同,更新客户ID为1234(名字:测试姓:用户)。

如果该客户犯规存在,那么我就需要通过从协议文件和其他信息(城市,州,电话号码)通过状态改变代码的更新请求读姓氏,姓名,身份证插入这个数据到数据库。

所以我的问题是,我可以通过状态改变读取协议文件的请求数据,而不是在验证端配置的姓,名和ID的?

Answer 1:

状态改变URL是你的供应商创造一个钩子,允许约定,告诉供应商什么状态时,它应该在测试开始时英寸 每个测试运行之前,模拟消费者轻叩你的供应商的状态变化网址,并告诉它该测试预计国家的名称。

你需要做两件事情:

  1. 配置状态更改URL
  2. 实现对供应商的状态变化端点

配置状态更改URL

您可以配置在供应商验证设置状态改变URL。 例如,使用的maven插件 :

<serviceProvider>
  <name>provider1</name>
  <stateChangeUrl>http://localhost:8080/tasks/pactStateChange</stateChangeUrl>
...

或使用摇篮提供商插件 :

hasPactWith('consumer1') {
 stateChangeUrl = url('http://localhost:8080/tasks/pactStateChange')
...

这两种告诉模拟消费者使用localhost:8080/tasks/pactStateChange每次测试之前更换供应商的状态。

实施状态变化端点

以上链接的文件告诉我们,在默认情况下,该请求的格式是你的状态字符串和任何参数的POST请求:

{ "state" : "a provider state description", "params": { "a": "1", "b": "2" } }

要使用此功能,您实现像上提供下列未经测试的代码:

@RequestMapping(value = "tasks/pactStateChange", method = RequestMethod.POST)
ResponseEntity<?> stateChange(@RequestBody ProviderState state) {
   if (state.state == "no database") {
       // Set up state for the "no database" case here
   } else if state.state == "Some other state" {
       // Set up state here
   } else if  ...   // Other states go here
   ... 
   }

   return ResponseEntity.ok().build()
}

请在例如原谅任何弹簧启动错误 - 我不是一个春天开机的人,但你可以看到的一般原则。

随着国家改变URL,协议并没有告诉任何供应商设置的详细信息。 它只是告诉供应商,你在测试中使用的约定前的状态字符串。 这可能是像"foo exists" 。 然后,实施了状态改变URL处理程序时,您发现"foo exists" ,做任何明确的设置在那里。

if (state.state == "foo exists") {
     // do whatever you need to set up so that foo exists
    repository.clear()
    repository.insert(new Foo("arguments that foo needs",12))
}

如果您想了解更多关于提供国的意图,有一个读维基页面上提供国 。

如何做到这一点在你的具体情况

您询问:

我可以通过状态的改变,而不是配置的姓,名和ID在验证侧读取协议文件的请求的数据?

你可能会感到困惑合同测试的意图 - 每个测试的状态和请求的组合。

因此,而不是使用一个测试说:

  • 我的测试是要求客户更新。 如果客户存在,那么我期待X响应,如果没有,那么我期待ÿ响应

你用两种试验地说:

  • 当我提交的更新客户记录(当客户存在的状态),那么我期待X响应。

  • 当我提交的更新客户记录(在客户不存在的状态),那么我期待ÿ响应。

这些测试是在你的契约合同两个独立的项目。

其目的是不包括在合同中设置的细节 。 在消费者方面,你的状态只是说像“客户使用id = 1234存在”的字符串。

在供应商方面,你的状态变化端点检测URL和创建状态为宜。 这通常是在一个硬编码的方式来完成:

if (state == "Customer with id=1234 exists") {
  Database.Clear()
  Database.Insert(new Customer(1234, "John","Smith")) 
} else if (state == "No customers exist") { 
  Database.Clear()
}

你不想这样做在通过解析状态字符串参数化的方式,因为这样你所创建的测试消费者和提供者之间的新的复杂的合同。

消费者测试不应该知道如何设置供应商状态,就应该只知道通过测试需要什么样的状态(仅名称)什么。 同样,供应商并不需要知道什么是正在测试中,它只需要知道如何把状态名称为实际状态。



文章来源: PACT - Using provider state
标签: pact