Escrevendo os primeiros testes de API em Java usando o Rest Assured
Iaê galera, beleza? Hoje vou mostrar como dar os primeiros passos com o Rest Assured para validar a sua API.
Antes de mais nada, caso você não conheça a biblioteca que vamos falar hoje, sugiro ler esse meu outro post que fala sobre o setup para utilizar o Rest Assured.
O Rest Assured nos permite testar serviços RESTful em Java de um jeito muito mais prático, basicamente, ele nos provê uma maneira de criar chamadas HTTP, como se fôssemos um cliente acessando a API. Suporta os métodos POST, GET, PUT, DELETE, OPTIONS, PATCH e HEAD e pode ser usado para validar e verificar a resposta dessas solicitações.
Vou usar como referência o mesmo projeto criado no post que falei aí em cima, caso queira fazer o download e acompanhar o tutorial, pode encontrar o código final desse post no meu GitHub.
Com tudo configurado na sua máquina, a primeira coisa a fazer é criar a nossa classe de teste “RestAssuredSample” dentro do package “src > test > java > sample”. Com a classe criada é hora de configurarmos qual a URL da API que vamos testar, nesse exemplo será o https://reqres.in/, esta API disponibiliza uma série de endpoints que podemos usar para simular requisições/respostas reais.
private String url = "https://reqres.in/api/users";
Não irei me apegar a detalhes de implementação do Java, como quais modificadores de acesso estamos utilizando, nesse momento o foco é entender a utilização do Rest Assured.
Se vocês observarem a sintaxe de escrita dos comandos do Rest Assured irão perceber que ele usa o formato Given/When/Then, que é a mesma sintaxe utilizada no Behavior Driven Development (BDD), utilizar esse formato de escrita tem suas vantagens e desvantagens. Se por uma lado esse padrão facilita o entendimento da escrita do teste e permite que você tenha a suas precondições, ações e resultados esperados de uma maneira clara no seu teste. Por outro lado, seu teste fica “engessado” nessa estrutura e isso pode ser um problema caso você precisa fazer algo que essa forma de escrita não suporte.
Um verbo ou método indica uma ação que deve ser realizada em um recurso identificado. Dito isso vou demonstrar exemplos dos quatro principais verbos:
GET
O método GET é um dos verbos mais básicos do HTTP Request, por definição ele deve ser utilizado quando se deseja consultar ou recuperar dados e não deve ser utilizado para alterar o estado do recurso acessado.
Na linha 17, podemos observar o primeiro teste, temos um GET para recuperar os dados da página 01. Na linha 18 o método Given() é utilizado para configurar as precondições para rodar o teste, nesse caso temos o parâmetro “page=1", que indica que queremos recuperar os dados da primeira página.
@Test
public void getPageOneTest(){
given().
param("page", "1").
when().
get(url).
then().
statusCode(200).
body("page", equalTo(1));
}
No comando seguinte, When() informamos o verbo que queremos utilizar passando a URL alvo do nosso teste (GET). Por último temos as validações que desejamos fazer no nosso teste, nesse caso estamos validando o status code na linha 23 e dentro do Response Body verificamos se o atributo page retornado indica a página que solicitamos, nesse caso a página 1.
O segundo teste, presente na linha 28 é utilizado para recuperar os dados de um usuário, a sintaxe é um pouco diferente apesar de ser o mesmo verbo. Dessa vez passamos diretamente o verbo que queremos utilizar na linha 29, como parâmetro passamos uma concatenação da URL mais o ID do usuário que queremos recuperar os dados. Depois, no comando Then(), dizemos que queremos validar dentro do Response Body se o atributo presente nesse campo possui o valor 2, que é o ID do usuário que solicitamos anteriormente.
@Test
public void getPageOneTest(){
given().
param("page", "1").
when().
get(url).
then().
statusCode(200).
body("page", equalTo(1));
}
Viu como é fácil? Utilizei duas formas diferentes de realizar o GET para que você pudesse algumas possibilidades que o Rest Assured nos permite.
POST
Para realizar a chamada utilizando o método POST vamos usar algumas coisas diferentes. Utilizaremos o POST para fazer o cadastro de um novo usuário, para isso vamos criar um objeto JSON para representar o nosso usuário e passarmos ele no body da nossa chamada, você pode observar isso na linha 34, onde criamos o objeto com os valores name e job.
JSONObject requestParams = new JSONObject();
requestParams.put("name", "Rafael");
requestParams.put("job", "QA");
Após a criação do objeto iremos utilizar o método body, para indicar ao Rest Assured que vamos utilizar o objeto JSON que criamos anteriormente. Fazemos a chamada ao método POST passando a URL. E para finalizar, validamos se o status code retornado foi 201(created) e se o Response Body possui o atributo create date.
given().body(requestParams.toJSONString()).
when().
post(url).
then().
statusCode(201).
body(containsString("createdAt"));
Pronto! Usuário criado, observe que o endpoint apenas retorna o status code, ID e data da criação, por isso optei por validar no teste se o status code e o parâmetro foram retornados. Em outras situações poderíamos fazer um GET passando o ID do usuário retornado no POST para validar se os dados foram cadastrados corretamente.
PUT
O método PUT geralmente é utilizado para atualizar os dados de um recurso previamente cadastrado. Para utilizarmos ele no Rest Assured basta observar o teste da linha 48. Observe que a estrutura do PUT é bem parecida com o POST que fizemos no teste anterior.
@Test
public void putUserTest(){
JSONObject requestParams = new JSONObject();
requestParams.put("name", "Rafael A.");
requestParams.put("job", "QA/DEV");
As diferenças são que no PUT passamos os valores atualizados no request Body, linha 53, também passamos como parâmetro além da URL, o ID do usuário que desejamos atualizar.
given().
body(requestParams.toJSONString()).
when().
put(url + "/2").
then().
statusCode(200).
body(containsString("updatedAt"));
}
Em termos de validação, as diferenças ficam por conta do status code, nesse caso do PUT o retorno é o 200 (OK) e no body é retornado o campo update date.
Poderíamos assim como no POST realizar uma validação para garantir que os dados foram de fato atualizados no banco de dados, mas como a aplicação que estamos utilizando não salva os dados de fato, vamos fazer a validação apenas olhando para as informações de retorno.
DELETE
O Delete é bem simples de ser realizado, vamos observar a linha 64. Para executar o delete, simplesmente chamamos o verbo, passando o ID do usuário que desejamos apagar. Para validar a exclusão basta verificar o status code 204 (No Content) retornado pelo endpoint.
@Test
public void deleteUserTest(){
when().
delete(url + "/2").
then()
.statusCode(204);
}
O código final ficou assim:
Simples, não!?? Dá para fazer muito mais coisas com o Rest Assured mas o intuito desse post é ser um material inicial para te ajudar a escrever os primeiros testes para os principais verbos usando a biblioteca. Nos próximos posts vamos aprofundar os estudos no Rest Assured, até lá!!
Se tiver alguma dúvida, sugestão ou viu algum erro no texto, posta ai nos comentários! Vlw!!