Automação de Testes de API com Node.js, Cucumber e BAT (Behavioral API Tester): automatize seus testes de API utilizando somente features

Marcos Ribeiro Hioka
QualidadeComposta
Published in
7 min readApr 4, 2021
BAT (Behavioral API Tester)

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!

--

--