如何检查 api 响应是否匹配 Java class?
How to check if an api response matches a Java class?
在我的项目中,我在 REST 通信中使用了一些 DTO classes。对于空手道,我想创建一些外部 e2e/integration 测试,在其中检查 API 响应是否符合 DTO 中定义的合同。为了保持整个设置干燥,我想避免手动编写描述 DTO 的 Karate JSON 模式。相反,我正在寻找一种方法将我的 Java classes 翻译成空手道 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 that gives me the JSON-Schema 表示我的 class 的转换器。
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 classes 直接翻译成 Karate 模式的翻译器,要么需要 JSON-Schema 和 Karate 风格的 JSON 模式之间的 translator/other 一种粘合剂.
有没有办法检查 API 响应是否与空手道中我丢失的 Java class 匹配?对于我遗漏的任何步骤,是否有一个方便的转换库,或者我是否必须自己编写?
我强烈建议您不要将生产 DTO 重新用于测试。想一想,您正在为失败做好准备 - 运行 没有意识到某人通过 IDE 等应用的“重构”破坏您的 API 客户的风险。
您应该从客户端的角度进行测试,对于许多团队来说,客户端是一个网络浏览器。这就是空手道避免 Java 并坚持使用 JSON + HTTP 的原因。
其次,在我看来,模式匹配测试的价值很小。根据您所说的,您的 JSON 很可能已经从 DTO 生成,这使得它在您的特定情况下价值更低。
对不起,如果这听起来很刺耳,但我看到到处都是这个错误。 DRY 是 over-rated 尤其是在测试自动化环境中。
就是说,如果幸运的话,karate.toJson()
方法可以将您的 DTO-s 转换为 JSON,但是如果您使用一些花哨的注释,它可能无法工作,它全部基于 JavaBean 约定。
最后我想说的是,只需使用 Java 互操作,调用一些 Java 库来进行模式验证,并将其称为一天,如 schema.feature
over here.
总而言之,我认为您应该忘掉模式验证,专注于测试您的 API-s 的“业务流”,您通常会在其中链接 API-s。创建产品。创建订单。检查库存是否减少。等等等等。一旦你有了这些,然后考虑是否值得测试模式匹配。
在我的项目中,我在 REST 通信中使用了一些 DTO classes。对于空手道,我想创建一些外部 e2e/integration 测试,在其中检查 API 响应是否符合 DTO 中定义的合同。为了保持整个设置干燥,我想避免手动编写描述 DTO 的 Karate JSON 模式。相反,我正在寻找一种方法将我的 Java classes 翻译成空手道 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 that gives me the JSON-Schema 表示我的 class 的转换器。
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 classes 直接翻译成 Karate 模式的翻译器,要么需要 JSON-Schema 和 Karate 风格的 JSON 模式之间的 translator/other 一种粘合剂.
有没有办法检查 API 响应是否与空手道中我丢失的 Java class 匹配?对于我遗漏的任何步骤,是否有一个方便的转换库,或者我是否必须自己编写?
我强烈建议您不要将生产 DTO 重新用于测试。想一想,您正在为失败做好准备 - 运行 没有意识到某人通过 IDE 等应用的“重构”破坏您的 API 客户的风险。
您应该从客户端的角度进行测试,对于许多团队来说,客户端是一个网络浏览器。这就是空手道避免 Java 并坚持使用 JSON + HTTP 的原因。
其次,在我看来,模式匹配测试的价值很小。根据您所说的,您的 JSON 很可能已经从 DTO 生成,这使得它在您的特定情况下价值更低。
对不起,如果这听起来很刺耳,但我看到到处都是这个错误。 DRY 是 over-rated 尤其是在测试自动化环境中。
就是说,如果幸运的话,karate.toJson()
方法可以将您的 DTO-s 转换为 JSON,但是如果您使用一些花哨的注释,它可能无法工作,它全部基于 JavaBean 约定。
最后我想说的是,只需使用 Java 互操作,调用一些 Java 库来进行模式验证,并将其称为一天,如 schema.feature
over here.
总而言之,我认为您应该忘掉模式验证,专注于测试您的 API-s 的“业务流”,您通常会在其中链接 API-s。创建产品。创建订单。检查库存是否减少。等等等等。一旦你有了这些,然后考虑是否值得测试模式匹配。