【问题标题】:Spring Cloud Contract Verifier - Body matchingSpring Cloud Contract Verifier - 正文匹配
【发布时间】:2018-09-27 05:25:49
【问题描述】:

我正在使用 Spring Cloud Contract Verifier

org.springframework.cloud:spring-cloud-starter-contract-verifier:jar:2.0.0.M8 org.springframework.cloud:spring-cloud-contract-maven-plugin:1.2.4.RELEASE

我有以下合同:

request:
  method: GET
  url: /cars/list
response:
  status: 200
  headers:
    Content-Type: application/json;charset=UTF-8
  body:
    cars:
      [
        {
          "make": "Ford",
          "model": "Fiesta",
          "year": 2016,
          "price": 16500.50
        },
        {
          "make": "BMW",
          "model": "X1",
          "year": 2014,
          "price": 22000.00
        },
        {
          "make": "NISSAN",
          "model": "Juke",
          "year": 2017,
          "price": 19300.00
        }
      ]

然后将其转换为以下 java 代码:

DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
assertThatJson(parsedJson).array("['cars']").contains("['model']").isEqualTo("Juke");
assertThatJson(parsedJson).array("['cars']").contains("['make']").isEqualTo("Ford");
assertThatJson(parsedJson).array("['cars']").contains("['year']").isEqualTo(2014);
assertThatJson(parsedJson).array("['cars']").contains("['year']").isEqualTo(2016);
assertThatJson(parsedJson).array("['cars']").contains("['model']").isEqualTo("Fiesta");
assertThatJson(parsedJson).array("['cars']").contains("['make']").isEqualTo("BMW");
assertThatJson(parsedJson).array("['cars']").contains("['year']").isEqualTo(2017);
assertThatJson(parsedJson).array("['cars']").contains("['make']").isEqualTo("NISSAN");
assertThatJson(parsedJson).array("['cars']").contains("['price']").isEqualTo(16500.5);
assertThatJson(parsedJson).array("['cars']").contains("['model']").isEqualTo("X1");
assertThatJson(parsedJson).array("['cars']").contains("['price']").isEqualTo(22000.0);
assertThatJson(parsedJson).array("['cars']").contains("['price']").isEqualTo(19300.0);

我对这个测试有一些问题:

1) 它不考虑顺序,这意味着以下正文仍将被视为有效:

{
  "cars": [
    {
      "make": "NISSAN",
      "model": "Juke",
      "year": 2017,
      "price": 19300.00
    },
    {
      "make": "BMW",
      "model": "X1",
      "year": 2014,
      "price": 22000.00
    },
    {
      "make": "Ford",
      "model": "Fiesta",
      "year": 2016,
      "price": 16500.50
    }
  ]
}

2) 它只是验证响应中的任何位置是否存在某些属性,这意味着以下正文仍将被视为有效:

{
  "cars": [
    {
      "make": "Ford",
      "model": "Juke",
      "year": 2016,
      "price": 19300.00
    },
    {
      "make": "BMW",
      "model": "X1",
      "year": 2017,
      "price": 22000.00
    },
    {
      "make": "NISSAN",
      "model": "Fiesta",
      "year": 2014,
      "price": 16500.50
    }
  ]
}

3) 它忽略响应中存在的任何额外值,这意味着以下正文仍将被视为有效:

{
  "cars": [
    {
      "make": "Ford",
      "model": "Fiesta",
      "year": 2017,
      "price": 22000.00,
      "state": "good"
    },
    {
      "make": "NISSAN",
      "model": "Juke",
      "year": 2016,
      "price": 19300.00,
      "state": "ok"
    },
    {
      "make": "BMW",
      "model": "X1",
      "year": 2014,
      "price": 16500.50
    },
    {
      "make": "Volkswagen",
      "model": "Golf",
      "year": 2018,
      "price": 12500.00,
      "state": "new"
    }
  ]
}

我希望生成的测试更加严格,并且在上述案例中列出的任何差异上都失败了。

可以用Spring Cloud Contract Verifier实现吗?

【问题讨论】:

    标签: spring-boot spring-cloud spring-cloud-contract


    【解决方案1】:

    首先你的版本不匹配

    org.springframework.cloud:spring-cloud-starter-contract-verifier:jar:2.0.0.M8 org.springframework.cloud:spring-cloud-contract-maven-plugin:1.2.4.RELEASE

    您使用的插件版本与验证程序不同。这些应该匹配。

    现在回答你的问题

    1) 它不考虑顺序,这意味着以下正文仍将被视为有效:

    是的,我们不会开箱即用地对其进行测试。您可以通过为整个正文提供自己的 JSON 路径匹配器来手动完成 (https://cloud.spring.io/spring-cloud-contract/single/spring-cloud-contract.html#contract-matchers)

    2) 它只是验证响应中的任何位置是否存在某些属性,这意味着以下正文仍将被视为有效:

    是的,我们断言结构没问题,这就是合同测试的想法。如果您想要更精确的验证,请使用匹配器部分 (https://cloud.spring.io/spring-cloud-contract/single/spring-cloud-contract.html#contract-matchers)

    3) 它忽略响应中存在的任何额外值,这意味着以下正文仍将被视为有效:

    这绝对是你应该做的。忽略未知字段。您可以在此处阅读有关 Postel 定律的更多信息 (https://en.wikipedia.org/wiki/Robustness_principle)

    我希望生成的测试更加严格,并且在上述案例中列出的任何差异上都失败了。

    我认为您正在寻找一种架构,而不是合同测试或定义。您可以使用 Spring Rest Docs 集成 (https://cloud.spring.io/spring-cloud-contract/single/spring-cloud-contract.html#_generating_stubs_using_rest_docs) 并在那里强制执行存根必须是什么样子。但是 IMO(当然我不知道你的域)你太严格了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 2017-12-31
      • 2018-12-27
      • 2017-09-29
      • 2020-10-24
      • 1970-01-01
      相关资源
      最近更新 更多