Blog > Ferramentas de Teste para Javascript - Automação de API REST com frisby.js

08/mar

Se faz cada vez mais presente o teste em APIs REST pela diversidade de camadas que podemos ter em uma aplicação. Neste post aprenderemos a utilizar, de forma simples e direta, o frisby.js que é uma ótima escolha para a automação de teste para APIs REST.


Introdução

Se faz cada vez mais presente o teste em APIs REST pela diversidade de camadas que podemos ter em uma aplicação.
Neste post aprenderemos a utilizar, de forma simples e direta, o frisby.js que é uma ótima escolha para a automação de teste para APIs REST.


Conhecendo o frisby.js

Frisby ( http://frisbyjs.com) é uma API em Javascript para automação de API REST que torna este teste muito simples, rápido e muito legível.
Ele é desenvolvido com base no node.js e jasmine, o que dá mais facilidade na execução, resultados fáceis de entender e relatórios no padrão jUnit.
Ele trabalha com todos os verbos de uma API REST, que é o ponto de partida do teste e também com os seguintes métodos de apoio:

  • Expectations (Expectativas): são funções que irão validar algum aspecto da API, como o código de status, retorno de dados do JSON entre outros. Com eles é que iremos validar realmente se alguma informação está ou não correta.
  • Helpers (Suporte): são funções de suporte que executam quando um teste é finalizado. Podemos encadear testes dentro de testes com os helpers (ideal para pegar a informação de um teste e usar no próximo).
  • Headers (Cabeçalhos): são funções que trabalham com os cabeçalhos HTTP.
  • Inspectors (Inspetores): são métodos que podemos utilizar para obter a resposta HTTP que usamos, principalmente, quando o teste falha ou gera alguma erro.

Estruturas e pré condições para criar um com frisby.js

  1. Criar o arquivo package.json que vai conter as informações básicas do teste e ferramentas
  2. Criar um arquivo de teste com sufixo _spec.js
  3. Instanciar o frisby no script de teste
  4. Criar um teste
  5. Definir o verbo (GET, POST, etc…)
  6. Inserir as Expectations (validações)
  7. Informar a execução do teste pelo método toss()

Também é necessário instalar as seguintes dependências de forma global (ou se você preferir dentro do próprio projeto sem o -g):

npm install -g frisby
npm install -g jasmine-node

Cenário para automação

Usaremos uma API bem simples da Qualister que vai listar nossas informações institucionais.

URL: http://qualister.info/qualister-api
Parâmetro: nome
JSON de retorno (exemplo):

status : "success",
message : "Elias, seja bem-vindo a API da Qualister",
   data : {
      atuacao: ["Treinamentos","Consultoria","Revenda de ferramentas"],
      consultores : {
         quantidade : 5,
         nomes : [
            "Cristiano Caetano",
            "Elias Nogueira",
            "Julio de Lima",
            "Roberto Ungarelli"
            ]
         }
      }

Automação com frisby.js

A automação validará estes itens da requisição: HTTP Status, Header, Tipo de retorno do JSON e Dados de Retorno do JSON.
Vamos seguir todos os passos descritos no tópico da estrutura.

Criar o arquivo package.json que vai conter as informações básicas do teste e ferramentas

Eu criei uma pasta chamada frisby_test na minha máquina.
Agora, no meu editor de texto vou criar o arquivo package.json com os dados necessários.

Duas informações são bem importantes aqui:

  • o main é o teste principal que será executado caso não seja informado um teste no diretório
  • o dependencies adiciona as dependências necessárias para execução, neste caso o frisby e o jasmine-node


Criar um arquivo de teste com sufixo _spec.js

Você precisa criar um arquivo chamado frisby_test_spec.js no mesmo diretório do package.json
O sufixo _spec.js é necessário para que o jasmine-node (framework de teste) entenda que este é um arquivo de teste e possa executá-lo.


Instanciar o frisby no script de teste

Neste ponto iremos criar o objeto frisby e uma variável para a URL já passando como parâmetro o nome da pessoa que está solicitando as informações.


Criar um teste

Todo novo teste no frisby é criado através do método create, onde definimos um nome para o mesmo.
Note que eu já coloquei um ponto-e-virgula no final da sentença, mas nos próximos métodos nós vamos encadear com o create.


Definir o verbo (GET, POST, etc…)

Neste exemplo iremos usar o GET para diretamente na URL para receber o retorno do JSON.
Notem que irei adicionar o método antes do ponto-e-virgula.


Inserir as Expectations (validações)

Aqui irei mostrar por partes como fazer a validação dos resultados.
Uma boa prática é validar o HTTP status, que no caso de uma requisição com sucesso retorna 200 e o Header validando que o retorno é em JSON.
Os dois métodos utilizados abaixo já contam como testes, porque estão validando estes dois itens.

Agora, como boa prática, iremos validar a estrutura do retorno do JSON que é composta por:

  • status com o tipo String (texto)
  • message com o tipo String (texto)
  • data com o tipo Object (objeto)

A por último a validação do retorno do JSON com todos os dados, igual ao exemplo do JSON colocado no tópico Cenário para Automação.
Usaremos o método expectJSON informando o atributo e valor de cada um para validação.
No final da escrita é necessário colocar o método toss() para informar a execução.


Execução

A execução sempre será por linha de comando usando o jasmine-node e informando o teste que será executado.

 jasmine-node nome_do_arquivo<nome_do_arquivo></nome_do_arquivo>

Note que temos, ao total, 14 validações feitas pelo nosso script. Isso porque para cada item do expectJSONTypes e expectJSON é considerado como uma validação (e realmente é).

Caso você execute o script e ocorra um erro na validação a comparação com o resultado esperado x resultado obtido mostra a diferença entre os dois.
Na execução abaixo eu troquei a palavra “Treinamentos” da atuacao para “Cursos”.
Note que é apresentado a diferença da validação em vermelho no meu console.


Conclusão

Aprendemos uma ferramenta para testar APIs REST de forma simples, fácil e muito direta.
Note também que a execução é muito rápida, proporcionando a inclusão destes testes em um ciclo de integração contínua.

Desafio Agile Testers

Este post faz parte do #DesafioAgileTesters de 2016
http://www.agiletesters.com.br/topic/359/desafioag...

POSTS RELACIONADOS

AGENDA

CURSOS RELACIONADOS