DEV Community

Gabriel_Silvestre
Gabriel_Silvestre

Posted on • Edited on

Introdução a Testes no Back-end

Tabela de Conteúdos


Tipos de Testes

Unitário

Testes unitários trabalham no menor escopo do código, testando funções, ou classes, individualmente, variando de acordo com o paradigma.

Integração

Testes de integração utilizam a junção de múltiplos escopos na hora de testar, ou seja, uma função que se utiliza de outras funções, essas que devem possuir seus próprios testes (unitários).

Ponta-a-Ponta

Teste de Ponta-a-Ponta (E2E) verificam o fluxo da aplicação como um todo, para isso presumem que testes de menor escopo, como os Unitários e os de Integração, já tenham sido ou irão ser desenvolvidos.

Voltar ao topo


Escrevendo Testes

Estrutura com Mocha

O que é?

Mocha é um framework para testes em JS, nós iremos utilizar a estrutura e a interface, disponibilizadas por ele, para a realização de nossos testes.

Sintaxe

A sintaxe para a estruturação dos testes é exatamente a mesma que vimos no Jest, temos um bloco describe() que irá descrever um ou mais testes e temos o bloco it() que irá definir o teste em si.

Ambas as funções, describe() e it(), recebem dois parâmetros, o primeiro é uma string que será a descrição do bloco e o segundo uma arrow function que irá definir o bloco.

describe('First block test', () => {
  it('First test', () => {});
  it('Second test', () => {});
});
Enter fullscreen mode Exit fullscreen mode

** Apesar de ter focado apenas na estrutura de tests com o Mocha nesse artigo, há outras diversas funcionalidades que esse Framework pode fazer, segue a documentação do Mocha.

Aferindo com Chai

O que é?

Chai é uma biblioteca para a asserção dos resultados recebidos a os resultados esperados, ou seja, criamos uma relação entre os resultados, dessa forma caso a relação seja verdadeira o teste irá passar.

Sintaxe

A sintaxe geral segue a mesma do Jest, temos uma função expect() que irá receber o resultado de nossa função, e a partir do expect() chamados um método de asserção para verificar se o resultado obtido é válido.

Existem diversos métodos de asserção no Chai, alguns similares aos do Jest, outros não, então a recomendação é sempre consultar a documentação do Chai.

expect(4 + 5).equals(9);
Enter fullscreen mode Exit fullscreen mode

Voltar ao topo


Executando Testes

Definindo script

  • Para executarmos os testes em nosso projeto, primeiro precisamos estar trabalhando em um pacote Node, então caso ainda não exista um arquivo package.json, basta executar o comando:
npm init -y
Enter fullscreen mode Exit fullscreen mode
  • Tendo o package.json, tudo o que precisamos fazer é definir o Mocha como script de testes, para isso passamos na chave "test" o valor "mocha tests". E obviamente é necessário ter o Mocha instalado.
"scripts": {
  "test": "mocha tests"
},
Enter fullscreen mode Exit fullscreen mode
  • Ao definir o script como fizemos acima, iremos executar os testes contidos no diretório tests/, ou seja, o valor que passamos no script de teste após o mocha, refere-se ao diretório que irá conter os testes.
"scripts": {
  "test": "mocha <diretório dos testes>"
},
Enter fullscreen mode Exit fullscreen mode

Executando o script

Após o script ter sido definido, tudo que precisamos fazer é rodar o seguinte comando no terminal:

npm test
Enter fullscreen mode Exit fullscreen mode

E se quisermos rodar um teste em outro diretório, que não faça sentido alterar o script (por qualquer motivo), podemos excutar os testes a partir do npx

npx mocha #path até os tests
npx mocha ./my_folder/my_tests
Enter fullscreen mode Exit fullscreen mode

Além disso também há outras flags que podemos usar ao executar o comando, elas podem ser vistas na documentação do Mocha CLI.

Voltar ao topo


TDD

O que é?

É uma metodologia de desenvolvimento, na qual a pessoa desenvolvedora começa a desenvolver a aplicação a partir dos testes.

Passos

Para usarmos essa metodologia de forma ativa podemos seguir quatro passos simples:

  1. Antes de iniciarmos a escrita de código precisamos interpretar os requisitos necessários para a implementação da funcionalidade.

  2. Com os requisitos em mente, começamos a escrever as estruturas descritivas dos testes com describe() e it().

  3. Com as estruturas descritivas já implementadas, passamos a verdadeiramente escrever os testes, utilizando as asserções para verificar o comportamento esperado.

  4. Por fim, agora que os testes já foram criados, nos resta partir para a implementação da funcionalidade pensada.

Lembrando que não há problema em realizar pequenos ajustes nos testes, afinal criamos eles para código que ainda nem existe, então um detalhe, ou outro, pode ser esquecido.

Voltar ao topo


Isolando Testes

O que é?

O isolamento de testes é a simulação de um comportamento esperado de uma função, para que não seja necessário interagir com recursos externos como arquivos, APIs e Bancos de Dados.

Por que isolar?

No Front-end trabalhamos com a manipulação do DOM, já no Back-end a maioria das operações serão de Input ou Output de dados, esses que podem ser provenientes de uma API externa, uma requisição do Front ou uma consulta no Banco de Dados.

Logo, trabalhar todas essas operações em ambiente de teste seria extremamente complexo, por exemplo: depois de testarmos a integração entre nosso Back-end e um Banco de Dados, o DB teria seus dados modificados, sendo necessário reseta-lo após cada teste.

Então para solucionar esse problema tem-se o conceito de Test Doubles, que nada mais são que objetos que "fingem" ser outros objetos para fins de testes. Podemos ainda comparar esse conceitos às Mocks, apesar de não serem exatamente a mesma coisa, servem para o mesmo propósito.

Como isolar?

Para isolarmos os testes iremos utilizar a biblioteca Sinon, ela oferece diversos recursos para a criação de Test Doubles. Para instalar a biblioteca basta utilizar o comando:

npm install -D sinon
Enter fullscreen mode Exit fullscreen mode

Sintaxe

Podemos utilizar diversos métodos para a criação de Test Doubles com Sinon, porém o mais básico entre eles é o .stub(), ao chamarmos passamos dois parâmetros, o primeiro é o objeto e o segundo, caso exista, é o método a ser "simulado".

Além desses parâmetros precisamos definir o valor a ser retornado quando os testes chamam o método que criamos o stub, para isso chamamos o método returns() logo após o método .stub().

sinon.stub(fs, 'readFileSync').returns(/*conteúdo do arquivo*/);
Enter fullscreen mode Exit fullscreen mode

Caso não definirmos o retorno do Test Double ela irá retornar undefined, porém há uma vantagem em "fakear" sem definir retorno, pois assim a função a ser "fakeada" perde a funcionalidade e a momentos que isso pode ajudar.

Outros "isolamentos"

Como dito acima, podemos simular comportamentos através de diversos métodos do sinon, não se limitando apenas ao .stub(), onde cada um desses métodos possui sua especificidade, assim como um caso de uso.

Para mais detalhes sobre tais métodos consulte a documentação do Sinon

Voltar ao topo


Links Úteis

Voltar ao topo

Top comments (0)