有一种方法可以用我要求的其他方法来验证API响应?

时间:2019-04-12 13:23:23

标签: java cucumber rest-assured

我从API自动化测试开始,所以我不确定如何使用Cucumbers步骤来验证API响应。

我通过以下步骤为黄瓜创建了一个功能:

    @criarConta
        Scenario Outline: Criar uma conta valida
            Given que realizo a chamada no <ambiente> da <api> informando <token_admin> e um email e <senha> novos
            Then devera retornar <status code> 
            And no response devera retornar um valor de "ID" ou "Message" 

在我的“ dataMap”类上,我正在进行休假请求并验证:

public void criarConta(String srtAmbiente, String srtAPI, String srtToken, String srtSenha) {

            String uriBase = srtAmbiente;
            RequestSpecification apiRequest = RestAssured.given().contentType(ContentType.JSON);

            int length = 15;
            String email = generateRandomEmail(length);
            System.out.println(email);
            Map<String, String> emailContent = new HashMap<String,String>();
            emailContent.put("email", email);
            Map<String, Object> postContent = new HashMap<String,Object>();
            postContent.put("customer", emailContent);
            postContent.put("password", srtSenha);

            apiRequest.header("Authorization", "Bearer "+srtToken).with().body(postContent);

            Response response = apiRequest.post(uriBase+srtAPI).prettyPeek();

            ResponseBody body = response.getBody();
            String bodyStringValue = body.asString();
            Assert.assertTrue(bodyStringValue.contains("id"));
            JsonPath jsonPathEvaluator = response.jsonPath();
            String responseEmail = jsonPathEvaluator.get("email");
            Assert.assertTrue(responseEmail.equalsIgnoreCase(email));

        }

但是在我的“步骤”类中,我需要调用黄瓜步骤,并且我的请求和验证代码在同一方法上。如何在方法中调用请求并在另一个方法中调用响应以使用黄瓜步骤?谢谢!

2 个答案:

答案 0 :(得分:0)

您应该尝试将Gherkin using QAFqaf-ws-support结合使用。它提供了对Web服务测试的支持,并具有内置步骤,可使用jsonpath / xpath进行json / XML响应的断言验证。 Request call repository允许您将请求信息移出代码之外。

您的实施将变得干净整洁,只需很少或没有任何代码。这是一个示例:

SCENARIO: <scenario name>

   When user requests '${get.sample.call}'
   Then response should have status code '<status code>'
   And response should have '<expectedvalue1>' at '<jsonpath1>'
   And response should have '<expectedvalue2>' at '<jsonpath2>'
     :
     : 
END

答案 1 :(得分:0)

要在一个步骤中收集系统响应并在另一个步骤中进行声明,则需要使用World对象或Scenario Context在步骤之间共享数据。完全公开,我更熟悉在ruby / php / javascript中解决此问题,但原理对于Java应该相同。

一个好的出发点可能是分解您的criarConta方法,当前它捆绑了几个不同的问题-构建请求,发送请求,解析响应以及声明响应值。我建议将请求分为一个方法,将响应解析为另一个方法,然后从您的WhenThen步骤中调用两者。

应该将所有断言完全撤出并在Then步骤中直接调用。通常,像您的dataMap这样的类将是系统接口的纯抽象(类似于页面对象是UI的抽象),但是对系统的“应如何”行为没有任何意见。这些应该放在步骤def中,并与它们代表的小黄瓜紧密相连。