我正在使用Spring Cloud合约验证器
org.springframework.cloud:spring-cloud d-starter-crating-验证器:jar:2.0.0。M8org.springframework.cloud:spring-cloud d-crating-maven-plugin:1.2.4。发布
我有以下合同:
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合约验证器实现吗?
首先,你有一个版本不匹配
org.springframework.cloud: spring-cloud d-starter-crating-验证者:jar:2.0.0.M8org.springframework.cloud:spring-cloud d-crating-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)它忽略响应中存在的任何额外值,这意味着以下主体仍然被认为是有效的:
这绝对是你应该做的。忽略未知字段。你可以在这里阅读更多关于波斯特定律的信息(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(当然我不知道你的领域)你太严格了。