Citrus-Framework:根据状态码进行条件验证

Citrus-Framework: Conditional validation depending on status code

我正在评估用于休息服务黑盒测试的柑橘框架。

有没有办法使用 java DSL 和条件容器来根据状态代码进行验证?

       http(httpActionBuilder -> httpActionBuilder
                .client(sutClient)
                .receive()
                .response()
                .messageType(MessageType.JSON)
                .extractFromPayload("$.", "operationReponse")
                .extractFromHeader(HttpMessageHeaders.HTTP_STATUS_CODE, "statusCode"));

        conditional().when("${statusCode} = 200").actions(
                // how to validate on ${operationResponse} ??
                .validate("$.field1", "${expectedUUID}")
                .validate("$.elements[0].result", "APPROVED")
        );

        conditional().when("${statusCode} = 301").actions(
                // how to extract from a variable ${operationResponse}  ?? 
                extractFromPayload("$.pollUrl", "idToGet");
                http(hab -> hab.client(sutClient).send().get("/v1/myendpoint"));
                http(hab -> hab.client(sutClient).receive().response(HttpStatus.OK)
                .messageType(MessageType.JSON)
                .validate("$.field1", "${expectedUUID}")
                .validate("$.elements[0].result", "APPROVED")

        );

最终想创建一个行为以在不同的测试用例上重用。

这里你需要的是将接收到的Http响应存储到本地消息存储中,以供以后验证。您可以为收到的消息添加名称,而不是将有效负载提取到变量:

http(httpActionBuilder -> httpActionBuilder
                .client(sutClient)
                .receive()
                .response()
                .messageType(MessageType.JSON)
                .name("operationResponse")
                .extractFromHeader(HttpMessageHeaders.HTTP_STATUS_CODE, "statusCode"));

您可以稍后在进一步的测试步骤中访问指定的消息内容。

echo("citrus:message(helloMessage.payload())")

对于更复杂的逻辑,我会添加自定义测试操作并访问消息存储以按名称加载消息:

action(new AbstractTestAction() {
    @Override
    public void doExecute(TestContext context) {
        // do something with stored message
        Message message = context.getMessageStore().getMessage("operationResponse"); 
    }
})

顺便说一下,我在您使用 "operationReponse" 和 "operationResponse" 的示例代码中发现了一个拼写错误。