Automação de Testes de API com Node.js, Cucumber e BAT (Behavioral API Tester): automatize seus testes de API utilizando somente features
Olá, pessoal! Tudo bem?
No dia a dia, dentro de projetos ou times de desenvolvimento de software, vemos o quanto é importante a realização de testes para termos um feedback de como anda a qualidade dos nossos produtos.
Uma forma de conseguirmos feedbacks uniformes, que diminuem a necessidade de testes manuais repetitivos e constantes é a criação de testes automatizados. Existem inúmeras ferramentas, open source e pagas, que trabalham em conjunto com linguagens de programação ou não, que podem fazer essa tarefa.
Muitas vezes, as equipes são enxutas e não contam com QAs especializados em automação, o que pode dificultar essa tarefa. Para facilitar a operação, existem frameworks que diminuem a complexidade de implementação. Um desses frameworks é o BAT (sigla de Behavioral API Tester), que trabalha em conjunto com Node.js e Cucumber.
Mas afinal, quem é BAT? 🦇
O BAT (Behavioral API Tester) é uma DSL baseada em Gherkin, criada pelo time de Engenharia da Harver para testes de APIs via Cucumber e Node.js. Com ele, não há necessidade de implementação do código nos snippets/steps gerados pela feature, como tradicionalmente fazemos com Cucumber. A maioria dos métodos para testes de API estão "encapsulados" em "frases" pré definidas em inglês.
Para mais informações, acesse o repositório da DSL:
https://github.com/harver-engineering/bat
E quem é o Cucumber?
Cucumber é uma ferramenta que dá suporte ao desenvolvimento orientado por comportamento (BDD- Behavior Driven Development).
A principal função do BDD pelo Cucumber é o seu interpretador em Gherkin.
A sintaxe básica para utilização é Given, When e Then.
Para mais detalhes, acesse o link: https://cucumber.io
E o Node.js?
Node.js é um executor de código JavaScript, amplamente utilizado no desenvolvimento de aplicações.
O link oficial do Node.js é: https://nodejs.org
Vantagens da utilização do BAT:
* Times com menos skill de automação conseguem implementar rapidamente a automação de testes de APIs;
* O projeto/framework de automação fica mais enxuto, removendo a necessidade de classes com os steps, Page Objects, etc.;
* Para times que já trabalham com Cucumber, o entendimento e desenvolvimento é mais rápido que o tradicional, podendo gerar uma escalabilidade ainda maior.
Desvantagens da utilização do BAT:
* As frases pré definidas são encontradas apenas em inglês, o que pode ser uma "barreira" para algumas pessoas;
* Se houver a necessidade de implementação de algum método diferente dos pré definidos, o trabalho pode ser maior do que o tradicional.
Vamos a implementação:
Primeiro, é preciso atender alguns pré requisitos:
* Ter instalado o Node.js em sua máquina (caso não tenha, o download pode ser realizado em https://nodejs.org/en/download/);
* Utilizar uma IDE para trabalhar com Node.js (recomendo o VS Code, que pode ser baixado em https://code.visualstudio.com/).
Crie uma pasta para o projeto e abra diretamente na sua IDE.
Em seguida, abra o terminal, para iniciarmos a instalação das dependências (você pode usar o terminal da IDE, se preferir).
Para iniciarmos, iremos realizar o comando npm init, que irá criar o package.json, com informações básicas do projeto:
- npm init
Você pode adicionar as informações solicitadas e no final confirmar com "yes", conforme sua preferência:
O package.json será criado então, com sua estrutura básica:
Faremos a instalação do BAT via npm:
- npm i --save-dev @harver/bat
Após instalação do BAT, iremos instalar o Cucumber:
- npm install --save-dev cucumber
Após realizar a instalação das dependências, um arquivo package-lock.json será automaticamente criado, junto com a pasta node_modules, que possui os binários de cada dependência. As dependências são adicionadas também ao package.json.
Agora vamos criar o arquivo setup.js, no caminho features/support com o seguinte trecho de código, para que o BAT utilize as dependências do Cucumber:
const {setWorldConstructor,After, AfterAll, Before, BeforeAll,Given, When, Then} = require('cucumber');const { registerHooks, World, registerSteps } = require('@harver/bat');
setWorldConstructor(World);
// Allow Bat to hook into your Cucumber dependency:registerHooks({ Before, BeforeAll, After, AfterAll });registerSteps({ Given, Then, When });
Feito isso, vamos criar nossa feature. A API que iremos utilizar para esse exemplo é a https://api.postmon.com.br/v1/cep, que retorna informações dos CEPs pesquisados, através de um método GET.
Quando realizamos uma requisição nessa rota com um CEP válido, ela retorna um response com o seguinte body:
Preparando a feature:
Vamos montar a feature da seguinte maneira:
@cep
Feature: CEP
In order to know an address information
As a consumer
Put a CEP number in CEP's route
@200cep01001001
Scenario: 200 - Get CEP 01001001
Given I am anonymous
When I send a 'GET' request to 'https://api.postmon.com.br/v1/cep/01001001'
Then I should receive a response with the status 200
And the response body json path at "$.logradouro" should equal "Praça da Sé"
And the response body json path at "$.bairro" should equal "Sé"
And the response body json path at "$.cidade" should equal "São Paulo"
And the response body json path at "$.estado_info.nome" should equal "São Paulo"
Agora, explicando cada trecho da feature criada:
@cep
É a tag principal da feature. Tags são muito úteis para diferenciar e executar testes utilizando Cucumber. Não são obrigatórias, mas ajudam bastante.Feature: CEP
Aí vai o nome da feature/funcionalidade criada.In order to know an address information
As a consumer
Put a CEP number in CEP’s route
Essa é a descrição da feature. Não é um item obrigatório para a execução dos testes, mas é uma boa prática colocar numa feature, para entendimento da funcionalidade.
@200cep01001001
Tag dada para o cenário.Scenario: 200 — Get CEP 01001001
Nome do cenário criado.
A seguir, são detalhados cada um dos steps utilizados do BAT no exemplo (a lista completa de steps do BAT pode ser encontrada em https://github.com/harver-engineering/bat/blob/master/docs/step-reference.md):
Given I am anonymous
Esse método do BAT apenas serve para declarar um usuário anônimo (pode ser usado também para completar uma sintaxe Given, When, Then).
When I send a ‘GET’ request to ‘https://api.postmon.com.br/v1/cep/01001001'
Esse método realiza um GET para a url declarada.
Then I should receive a response with the status 200
Com esse método, você valida o status da requisição.
And the response body json path at “$.logradouro” should equal “Praça da Sé”
And the response body json path at “$.bairro” should equal “Sé”
And the response body json path at “$.cidade” should equal “São Paulo”
And the response body json path at “$.estado_info.nome” should equal “São Paulo”
Esses métodos realizam comparações de igualdade nos conteúdos do response body através de json path. Por exemplo, quando mencionado “$.logradouro”, o método busca no json o nome "logradouro" e compara seu valor com o informado “Praça da Sé”. Mais exemplos de como montar esses paths podem ser encontrados em https://goessner.net/articles/JsonPath/.
Executando o teste:
Vamos então executar o teste. Para execução no terminal (pode ser o próprio terminal do VS Code), o comando básico para execução via cucumber é ./node_modules/.bin/cucumber-js ou pode ser usado também o comando npx cucumber-js.
………
1 scenario (1 passed)
7 steps (7 passed)
0m00.169s
Esse é o resultado da execução: o cenário de teste, compreendido pelos seus 7 steps, passou. O tempo da execução também é apresentado no console (no caso, 0m00.169s).
Então é isso!
Agradeço você que acompanhou até o fim esse artigo!
Com as informações passadas aqui, é possível preparar uma estrutura básica de execução do BAT. Para melhorar a utilização, além de incluir mais cenários de testes nas features, é possível também integrar outros recursos que trabalham em conjunto com esse framework, como reports, log detalhado de falha no console, etc.
Se você gostou e quer mais informações de como trabalhar com o BAT, deixe seu comentário! Obrigado, um grande abraço e até a próxima!