karate - 如何检查 api 响应是否与 Java 类匹配?
问题描述
在我的项目中,我有一些在 REST 通信中使用的 DTO 类。使用空手道,我想创建一些外部 e2e/集成测试,以检查 API 响应是否符合 DTO 中定义的合同。为了保持整个设置干燥,我想避免手动编写描述 DTO 的空手道 JSON 模式。相反,我正在寻找一种将我的 Java 类转换为空手道 JSON 模式的方法。
我已经拥有的:
假设这是我的 Java DTO 之一。
@Getter
@Setter
@AllArgsConstructor
@SuperBuilder
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({"elements", "property_1", "property_2"})
public class MyComplexTypeListDTO extends MyBaseAPIResponseDTO {
private List<MyComplexType> elements;
}
我有一个使用jsonschema-generator的转换器,它为我提供了我的班级的JSON-Schema表示。
private static JsonNode getSchemaFor(Class clazz) {
JacksonModule module = new JacksonModule();
ObjectMapper objectMapper = new ObjectMapper();
SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(objectMapper, SchemaVersion.DRAFT_2019_09, OptionPreset.PLAIN_JSON)
.with(module);
SchemaGeneratorConfig config = configBuilder.build();
SchemaGenerator generator = new SchemaGenerator(config);
return generator.generateSchema(clazz);
}
但是空手道的模式定义不同,结果不匹配。所以我要么需要一个从 Java 类直接到空手道模式的翻译器,要么需要一个翻译器/其他类型的 JSON-Schema 和空手道的 JSON 模式之间的粘合剂。
有没有办法检查 API 响应是否与我缺少的空手道中的 Java 类匹配?对于我缺少的任何步骤,是否有一个方便的转换库,或者我必须自己编写?
解决方案
我强烈建议您不要在测试中重复使用您的生产 DTO-s。想想看,你正在为失败做好准备——并且冒着没有意识到某人通过 IDE 等应用的“重构”何时会破坏你的 API 客户端的风险。
您应该从客户端的角度进行测试,对于许多团队来说,客户端是一个网络浏览器。这就是空手道避开 Java 并坚持使用 JSON + HTTP 的原因。
其次,在我看来,模式匹配测试几乎没有价值。根据您所说的,您的 JSON 很可能已经从 DTO-s 生成,这使得它在您的特定情况下的价值更低。
对不起,如果这听起来很苛刻,但我看到这个错误到处都是。DRY 被高估了,尤其是在测试自动化环境中。
也就是说,如果幸运的话,该karate.toJson()
方法可以将您的 DTO-s 转换为 JSON,但如果您使用一些花哨的注解,它可能无法正常工作,这都是基于 JavaBean 约定的。
最后我想说只使用 Java 互操作,调用一些 Java 库来进行模式验证,并称之为一天,如在这里看到schema.feature
的那样。
总而言之,我认为您应该忘记模式验证并专注于测试 API-s 的“业务流程”,您通常在其中链接 API-s。创建产品。创建订单。检查库存是否减少。等等等等。一旦你有了这些,然后考虑是否值得测试模式匹配。
推荐阅读
- php - 尝试合并 SQL 查询的两个结果 - ToDoList App
- javascript - Angular - 在嵌套对象中访问 ngFor 变量
- python - Pythonic 嵌套 for - Python 中的循环
- automapper - 使用 ValueTransformer 映射可空和不可空双精度
- angular - 如何在角度测试中获取 nativeElement [属性] 值?
- python - 如何在 Django 视图中执行长时间运行的进程?
- .net-core - .net core 3.1 pack dll 与 Azure Devops
- react-native - 在 FlatList 中设置状态
- winapi - 如何验证仅出站服务器端管道句柄是管道?
- c# - 项目中按钮闪烁的问题