首页 > 解决方案 > 如何检查 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 类匹配?对于我缺少的任何步骤,是否有一个方便的转换库,或者我必须自己编写?

标签: karate

解决方案


我强烈建议您不要在测试中重复使用您的生产 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。创建产品。创建订单。检查库存是否减少。等等等等。一旦你有了这些,然后考虑是否值得测试模式匹配。


推荐阅读