top of page
Writer's pictureJanaina Militão

Teste de API Java com REST Assured

Quando pensamos em executar testes de API é muito comum pensarmos em utilizar o Postman, mas se queremos automatizar podemos fazer o uso do REST Assured.


O REST Assured nos permite testar serviços RESTful em Java de um jeito mais prático. Basicamente ele nos provê uma maneira de criar chamadas HTTP, como se fossemos um cliente acessando a API. Suporta os seguintes verbos/métodos HTTP: POST, GET, PUT DELETE, OPTIONS, PATCH e HEAD.


Para darmos início devemos importar a dependência do Maven no arquivo pom.xml do projeto, no momento em que esse artigo estava sendo escrito a última versão da biblioteca rest-assured era 4.3.2.

<!-- https://mvnrepository.com/artifact/io.rest-assured/rest-assured -->
<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>rest-assured</artifactId>
    <version>4.3.2</version>
    <scope>test</scope>
</dependency>

Não iremos nos apegar a detalhes de implementação do Java, nosso foco será entender a utilização do REST Assured. Agora vamos criar a classe de teste e adicionar as principais anotações.


/**
 * @author Janaina Militão
 */
@RunWith(SpringJUnit4ClassRunner.class)
/** Define uma porta randomica para a aplicação na execução do   * teste
*/
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class)
/** Define a ordem dos testes de forma ascendente (pelo nome do  * teste)
*/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
/** Importa as configurações (conexão com o banco) */
@TestPropertySource(locations = "classpath:application.properties")
public class BeerApiRestTest {
    
    @LocalServerPort
    private int port;  
 
    @Before
    public void before(){
       RestAssured.baseURI="http://localhost";
       RestAssured.port = port;
    }
 
    @After
    public void after(){
        RestAssured.reset();
    }
}

Observando a sintaxe de escrita dos comandos do Rest Assured podemos perceber que ele usa o formato Given/When/Then, que é a mesma sintaxe utilizada no Behavior Driven Development (BBD). 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 HTTP indica uma ação que deve ser realizada em um recurso identificado. A seguir veremos exemplos dos quatro principais verbos HTTP:


O POST é utilizado para persistir dados.

/**Teste de criação de cerveja, contendo os campos nome e preço*/
@Test
public void test01_must_create_beer() {

JSONObject requestParams =new JSONObject();        requestParams.put("name", "Bier Hollf Premium");          requestParams.put("price", new BigDecimal(15));
 
int  statusCode =  given().contentType("application/json")
                          .body(requestParams.toJSONString())
                   .when().post(CONTEXT_PATH+"beers")
                   .then().assertThat()
                          .statusCode(HttpStatus.CREATED.value())
                          .extract().statusCode();
                           
  assertEquals(HttpStatus.CREATED.value(), statusCode);                           
}

O GET é utilizado para consultar ou recuperar dados previamente cadastrados.

/**Teste para lista as cervejas cadastradas*/
@Test
public void test02_must_list_beer() {
 int  statusCode =  given().contentType("application/json")
                           .when().get(CONTEXT_PATH+"beers")
                           .then().assertThat()
                           .statusCode(HttpStatus.OK.value())
                           .extract().statusCode();
                                   
  assertEquals(HttpStatus.OK.value(), statusCode);
}

O PUT é utilizado para atualizar os dados previamente cadastrados.

/**Teste para editar o preço da cerveja*/
@Test
public void test03_must_put_beer() {
 JSONObject requestParams =new JSONObject();        
 requestParams.put("name", "Bier Hollf Premium");          
 requestParams.put("price", new BigDecimal(18));
 
 int  statusCode =  given().contentType("application/json")
                           .body(requestParams.toJSONString())
                    .when().put(CONTEXT_PATH+"beers/"+beerId)
                    .then().assertThat()
                           .statusCode(HttpStatus.OK.value())
                           .extract().statusCode();  
                                               
  assertEquals(HttpStatus.OK.value(), statusCode);
}

O DELETE é utilizado para remover os dados previamente cadastrados.

/**Teste para deletar cerveja*/
@Test
public void test04_must_delete_beer() {
 int  statusCode =  given().contentType("application/json")
                    .when().delete(CONTEXT_PATH+"beers/"+beerId)                
                    .then().assertThat()                                                     
                       .statusCode(HttpStatus.NO_CONTENT.value())
                           .extract().statusCode(); 
                                  
  assertEquals(HttpStatus.NO_CONTENT.value(), statusCode);        
}

Para ver a classe completa do exemplo você pode consultar o meu repositório no Github : https://github.com/janainamilitao/craftbeer/blob/master/src/test/java/com/beerhouse/BeerApiRestTest.java


Espero que tenha gostado. Até a próxima!


Referências:


629 views0 comments
bottom of page