Primeiras aulas do curso Rest Assured: Testes automatizado de webservice

Rest Assured: Testes automatizado de webservice

Consumindo e testando um webservice - Consumindo e testando um webservice

Serviços web estão por toda a parte, já que hoje a quantidade de aplicações, dos mais diferentes domínios e tecnologias, precisam se comunicar. Por exemplo, uma loja virtual precisa consultar os Correios para saber o valor de determinado frete, ou uma aplicação de compra de passagem aérea que fala com a aplicação de reserva de carros para fazer um pacote turístico.

Existem diferentes maneiras para se distribuir sistemas e fazê-los conversar entre si. As maneiras mais conhecidas são SOAP e REST. Neste curso, lidaremos com serviços REST, já que essa tem sido a preferência de uma boa parte da indústria ultimamente. Aplicações REST fazem uso de requisições e respostas HTTP simples, geralmente trafegando dados em XML ou JSON.

Como em toda nossa formação de testes, continuaremos com a nossa aplicação de leilão. Dessa vez, nossa aplicação possui um conjunto de serviços web para disponibilizar todos os seus recursos, como usuários, leilões e lances dados. Temos um monte de webservices prontos para serem testados. E, da mesma forma que no curso de Selenium, essa aplicação está pronta para você, e tudo que deve fazer é rodá-la. Aqui, focaremos apenas nos testes.

Baixe a aplicação aqui. Para rodá-la, basta ir no terminal, e digitar a seguinte instrução:

ant jetty.run

Pronto! A aplicação está de pé. Vamos agora começar a testá-la. Abra seu browser, e acesse o seguinte endereço: http://localhost:8080/usuarios?_format=xml. A aplicação está preparada para responder em XML e JSON, se você passar o parâmetro _format para ela. Mais pra frente, veremos também que ela responderá certo caso passemos o parâmetro Accept no header do HTTP.

Veja o retorno. Existem alguns usuários já pré-cadastrados e o XML voltou corretamente:

<list>
<usuario>
<id>1</id>
<nome>Mauricio Aniche</nome>
<email>mauricio.aniche@caelum.com.br</email>
</usuario>
<usuario>
<id>2</id>
<nome>Guilherme Silveira</nome>
<email>guilherme.silveira@caelum.com.br</email>
</usuario>
</list>

Excelente. É assim que um serviço Web em REST funciona: fazemos uma requisição e ele nos devolve uma resposta. Precisamos agora testar que sempre que invocarmos esse serviço web, ele nos devolverá usuários. Para escrever esse teste, faremos uso do framework chamado Rest Assured. Ele, junto com o JUnit, nos ajudará a escrever testes que consomem serviços web. Ele já tem um monte de métodos que nos ajudam a fazer requisições, ler respostas, e etc. O Rest-Assured pode ser encontrado aqui: https://code.google.com/p/rest-assured/.

Para facilitar nosso trabalho, baixe aqui um projeto que já contém todas as bibliotecas do Rest-Assured incluídos (veja que são várias!), bem como os modelos já escritos. Veja que, como vamos trafegar Usuários, Leilões, e Lances de um lado para o outro, precisamos ter a representação em Java deles. São classes Java convencionais, por exemplo:

public class Usuario{

    private Long id;
    private String nome;
    private String email;

        // getters e setters
}

Vamos começar nosso primeiro teste. O que ele fará é justamente uma requisição do tipo "GET" para o servidor, e garantirá que a lista com 2 usuários foi recuperada.

Escrever testes já não é mais segredo nessa altura. Usaremos JUnit como sempre. Mas aqui, faremos uso da API do Rest-Assured para fazer essa requisição. A API do framework é fluente, e faz muito uso de métodos estáticos. Vamos importá-los todos desde já:

import static com.jayway.restassured.RestAssured.*;
import static com.jayway.restassured.matcher.RestAssuredMatchers.*;
import static org.hamcrest.Matchers.*;

O primeiro método que vamos aprender é o método get(URL). Ele faz uma requisição do tipo GET para a URL. Em seguida, precisamos dizer a ele que queremos tratar a resposta como XML. Veja só como fica a linha:

public class UsuariosWSTest {

    @Test
    public void deveRetornarListaDeUsuarios() {
        XmlPath path = get("/usuarios?_format=xml").andReturn().xmlPath();
    }
}

Com esse objeto XmlPath, podemos agora pegar os dados desse XML. Por exemplo, sabemos que essa URL nos devolve 2 usuários. Vamos então recuperá-los. Para isso, usaremos o método getObject(), que recebe um caminho dentro do XML, e a classe que ele deve desserializar:

    @Test
    public void deveRetornarListaDeUsuarios() {
        XmlPath path = get("/usuarios?_format=xml").andReturn().xmlPath();
        Usuario usuario1 = path.getObject("list.usuario[0]", Usuario.class);
        Usuario usuario2 = path.getObject("list.usuario[1]", Usuario.class);
    }

Com esses dois objetos em mãos, basta agora fazermos asserções neles:

    @Test
    public void deveRetornarListaDeUsuarios() {
        XmlPath path = get("/usuarios?_format=xml").andReturn().xmlPath();
        Usuario usuario1 = path.getObject("list.usuario[0]", Usuario.class);
        Usuario usuario2 = path.getObject("list.usuario[1]", Usuario.class);

        Usuario esperado1 = new Usuario(1L, "Mauricio Aniche", "mauricio.aniche@caelum.com.br");
        Usuario esperado2 = new Usuario(2L, "Guilherme Silveira", "guilherme.silveira@caelum.com.br");

        assertEquals(esperado1, usuario1);
        assertEquals(esperado2, usuario2);

    }

Pronto. Nosso teste passa! Veja que com o uso do Rest-Assured, não gastamos tempo algum fazendo requisições, ou mesmo parseando as respostas. Nos preocupamos apenas com o comportamento esperado.

Como falamos anteriormente, podemos passar a informação de que esperamos a resposta em XML pelo próprio header HTTP. Isso também é fácil com Rest-Assured. Veja o código abaixo, que faz uso dos métodos given() e header():

    @Test
    public void deveRetornarListaDeUsuarios() {
        XmlPath path = given()
                .header("Accept", "application/xml")
                .get("/usuarios")
                .andReturn().xmlPath();

        Usuario usuario1 = path.getObject("list.usuario[0]", Usuario.class);
        Usuario usuario2 = path.getObject("list.usuario[1]", Usuario.class);

        Usuario esperado1 = new Usuario(1L, "Mauricio Aniche", "mauricio.aniche@caelum.com.br");
        Usuario esperado2 = new Usuario(2L, "Guilherme Silveira", "guilherme.silveira@caelum.com.br");

        assertEquals(esperado1, usuario1);
        assertEquals(esperado2, usuario2);

    }

Nosso teste continua passando. Esses são os primeiros passos com o Rest-Assured.

Testando JSONs - Testando retornos com JSONs

Vamos agora testar o serviço que nos devolve um usuário de acordo com o seu ID. Dessa vez, o retorno será em JSON. A URL para pegarmos o usuário 1, por exemplo, http://localhost:8080/usuarios/show?usuario.id=1&_format=json.

O teste é parecido com o anterior, mas dessa vez precisamos mudar duas coisas:

O tratamento em JSON é bem simples. O Rest-Assured abstraiu bem isso para nós. Lembra do XmlPath? Pois bem, ele tem também o JsonPath, que é idêntico. A sintaxe é a mesma. Veja só como faríamos se o teste anterior fosse em JSON:

    @Test
    public void deveRetornarListaDeUsuarios() {
        JsonPath path = given()
                .header("Accept", "application/json")
                .get("/usuarios")
                .andReturn().jsonPath();

        List<Usuario> usuarios = path.getList("list.usuario", Usuario.class);

        Usuario esperado1 = new Usuario(1L, "Mauricio Aniche", "mauricio.aniche@caelum.com.br");
        Usuario esperado2 = new Usuario(2L, "Guilherme Silveira", "guilherme.silveira@caelum.com.br");

        assertEquals(esperado1, usuarios.get(0));
        assertEquals(esperado2, usuarios.get(1));

    }

Repare que só mudamos de um para outro.

Para passar o parâmetro também é bem simples. Podemos usar o método parameter(), que recebe o nome do parâmetro, bem como o conteúdo a ser enviado. Veja o novo teste completo:

    @Test
    public void deveRetornarUsuarioPeloId() {
        JsonPath path = given()
                .parameter("usuario.id", 1)
                .header("Accept", "application/json")
                .get("/usuarios/show")
                .andReturn().jsonPath();

        Usuario usuario = path.getObject("usuario", Usuario.class);
        Usuario esperado = new Usuario(1L, "Mauricio Aniche", "mauricio.aniche@caelum.com.br");

        assertEquals(esperado, usuario);

    }

Note que estamos passando o ID=1, e JSON no Accept. Ao rodar o teste, ele passa.

Mesmo se seu JSON não voltar um objeto que possa ser desserializado, a API de Path (tanto de XML quanto de Json) possibilita que você apenas navegue por ele. Por exemplo, se quiséssemos pegar apenas a String contendo o nome "Mauricio Aniche", poderíamos fazer:

path.getString("usuario.nome")

Veja os métodos disponíveis: getBoolean(), getDouble(), entre outros. É importante conhecê-los para que você faça bom uso da biblioteca.

Enviando dados para o WebService - Enviando dados para o WebService

Até o momento só consultamos os dados, vamos agora consumir webservices que os recebem. Adicionando um usuário, serviço está disponível em http://localhost:8080/usuarios. Para inserir um usuário, precisamos fazer um POST com um XML (ou JSON), o formato é o mesmo da nossa entidade Usuario.

Vamos começar nosso teste, então, criando o usuário que será adicionado:

    @Test
    public void deveAdicionarUmUsuario() {
        Usuario joao = new Usuario("Joao da Silva", "joao@dasilva.com");

    }

Agora usaremos a simples API do Rest-Assured para fazer o POST. Essa requisição é mais complicada. Precisamos:

Vamos começar configurando os dados da requisição. Veja que invocamos o método header(), contentType e body. Os três são auto-explicativos. Mas repare que o body sabe que o objeto deve ser serializado em XML, justamente por causa do valor passado para o content-type:

    @Test
    public void deveAdicionarUmUsuario() {
        Usuario joao = new Usuario("Joao da Silva", "joao@dasilva.com");

            given()
                .header("Accept", "application/xml")
                .contentType("application/xml")
                .body(joao);
    }

Em seguida, precisamos fazer o post, e receber os dados de volta como XML (da maneira que já estamos acostumados). Com isso, já conseguimos inclusive fazer o assert:

    @Test
    public void deveAdicionarUmUsuario() {
        Usuario joao = new Usuario("Joao da Silva", "joao@dasilva.com");

        XmlPath retorno = 
            given()
                .header("Accept", "application/xml")
                .contentType("application/xml")
                .body(joao)
            .when()
                .post("/usuarios")
            .andReturn()
                .xmlPath();

        Usuario resposta = retorno.getObject("usuario", Usuario.class);

        assertEquals("Joao da Silva", resposta.getNome());
        assertEquals("joao@dasilva.com", resposta.getEmail());

    }

Por fim, é legal também garantir que o código de retorno do HTTP seja 200. Para isso, usaremos o método expect(), que faz a asserção que queremos:

    @Test
    public void deveAdicionarUmUsuario() {
        Usuario joao = new Usuario("Joao da Silva", "joao@dasilva.com");

        XmlPath retorno = 
            given()
                .header("Accept", "application/xml")
                .contentType("application/xml")
                .body(joao)
            .expect()
                .statusCode(200)
            .when()
                .post("/usuarios")
            .andReturn()
                .xmlPath();

        Usuario resposta = retorno.getObject("usuario", Usuario.class);

        assertEquals("Joao da Silva", resposta.getNome());
        assertEquals("joao@dasilva.com", resposta.getEmail());

    }

Excelente. Nosso teste agora passa! Observe novamente que com o uso do framework nossos testes são por demais simples de serem escritos.

Veja que aqui estamos fazendo uma inserção. Ou seja, um novo elemento está sendo inserido no serviço externo. Você, desenvolvedor de testes, precisa ficar atento a isso, pois isso pode mudar o resultado de outros testes. Imagine que você tenha um teste que garanta que o serviço que retorne a quantidade de usuários funcione, se você adicionar um novo usuário, o teste vai quebrar, porque o número de usuários cresceu.

Essa discussão aconteceu no exercício do capítulo anterior. Precisamos sempre tomar cuidado com cenários em serviços externos. Se você criou um usuário, você precisa deletá-lo depois. Para isso, você pode usar algum serviço de deleção, que é disponibilizado pelo serviço web.

Configurando o Rest-Assured

Você reparou que até agora temos passado endereços relativos, mas ele sabe que nossa aplicação está em http://localhost:8080? Pois bem, isso é a configuração padrão dele. Você pode mudá-la. Por exemplo, se quiséssemos mudar a URL base, faríamos:

RestAssured.baseURI = "http://www.meuendereco.com.br";
RestAssured.port = 80;

Geralmente colocamos esse tipo de configuração em algum lugar centralizado. Por exemplo, em algum @Before ou @BeforeClass da bateria de testes. Assim, fica fácil mudar essa configuração caso o endereço do serviço mude.

Sobre o curso Rest Assured: Testes automatizado de webservice

O curso Rest Assured: Testes automatizado de webservice possui 32 minutos de vídeos, em um total de 33 atividades. Gostou? Conheça nossos outros cursos de Java em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Java acessando integralmente esse e outros cursos, comece hoje!

  • 1122 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 1122 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 1122 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 1122 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Procurando planos para empresas?
Acesso por 1 ano
Estude 24h/dia onde e quando quiser
Novos cursos toda semana