Tableless

Busca Menu

Teste automatizado de API com frisby e jasmine

Seja o primeiro a comentar por

O Frisby é um framework para teste de API REST que roda em cima do nodejs. Seu principal apelo é a facilidade em se fazer testes automatizados de API com o apoio do framework de teste BDD jasmine.

Instalação:

Pré requisitos: nodejs, npm.

1) jasmine-node. Instalação global.

sudo npm install -g jasmine-node

2) frisby. Instalação local no projeto.

sudo nam install --save-dev frisby

Hello, World!

Para o uso devemos instanciar seu módulo:

var frisby = require ('frisby');

No seu uso mais básico, passamos como parâmetro a url a ser chamada e a resposta esperada.

frisby.create('Teste BDD').get('http://www.teste.com/pessoa/1').expectStatus(200).toss();

Com o comando acima, estamos testando a API sendo que seu sucesso depende do código de retorno HTTP 200.

Por convenção devemos salvar este arquivo de teste com o sufixo ‘-spec.js’. Ex: ‘pessoa-spec.js’

Para execução do teste e para que o mesmo gere relatório no formato ‘junitreport’ devemos executar o seguinte comando:

jasmine-node pessoa-spec.js --junitreport --output specTestReportJasmine

Na prática apontamos para um pasta de teste para que todos sejam executados. Ex:

jasmine-node spec/ --junitreport --output specTestReportJasmine

Já temos o essencial para integração do teste de api com alguma ferramenta de CI como o Jenkins(https://jenkins-ci.org/) com relatório padronizado.

Hello, Universe!

O framework oferece alguns recursos interessantes e de fácil implementação para testar a resposta da API REST.

1) Testar se a resposta HTTP contém um cabeçalho específico.

frisby.create('Teste BDD').get('http://www.teste.com/pessoa/1')
   .expectStatus(200)
   .expectHeaderContains('Content-Type', 'json')
   .toss();

2) Testar se a resposta HTTP contém um objeto com um conteúdo específico.

frisby.create('Teste BDD').get('http://www.teste.com/pessoa/1')
   .expectStatus(200)
   .expectHeaderContains('Content-Type', 'json')
   .expectJSON({codigo:1,nome:"fulano"})
   .toss();

3) Testar se a resposta HTTP contém um objeto com um tipo específico.

frisby.create('Teste BDD').get('http://www.teste.com/pessoa/1')
   .expectStatus(200)
   .expectHeaderContains('Content-Type', 'json')
   .expectJSONTypes({codigo: Number})
   .toss();

4) Realizar um teste que depende da conclusão de um teste anterior.

frisby.create('Teste BDD').get('http://www.teste.com/pessoa/1')
   .expectStatus(200)
   .expectHeaderContains('Content-Type', 'json')
   .expectJSONTypes({codigo: Number})
   .after(function(){
      frisby.create('Teste BDD').delete('http://www.teste.com/pessoa/1').expectStatus(200).toss();
   })
   .toss();

No teste acima, caso tenha sucesso ao obter informações de uma pessoa será feito um teste da exclusão da mesma.

Integração com GULP(Projetos em nodejs)

Quando a aplicação backend é feita em nodejs é interessante configurar o gulpjs(http://gulpjs.com/) para o gerenciamento dos testes. No exemplo abaixo o gulp é configurado para iniciar a aplicação backend, disparar os testes e finalizar a aplicação:

gulp.task('spec', function() {
   var jasmine = spawn('jasmine-node', ['spec/','--junitreport','--output','specTestReportJasmine']);
   var serverApp = require('./server');
   var resumeText = "";
 
   serverApp.init(8082);
 
   jasmine.stdout.on('data', function (data) {
      var texto = data.toString().trim();
      resumeText += texto;
   });
   jasmine.stderr.on('data', function (data) {
      console.log('erro: ' + data);
   });
   jasmine.on('close', function (code) {
      console.log('*********************\n' + resumeText);
      serverApp.close();
      process.exit();
   });
});
Publicado no dia