Estrutura básica de um teste unitário

Artigos - 25/Mar/2021 - por André Kanamura

Testes automatizados têm se tornado uma exigência para garantir a qualidade dos produtos da maioria das empresas de desenvolvimento de software. A grande vantagem é que, além de termos mais confiança de que novas funcionalidades não causam problemas em outras partes da aplicação, com eles não precisamos realizar testes manuais repetidas vezes, para cada modificação aplicada no código. A longo prazo, testes são uma grande economia de tempo e maior garantia de qualidade do código.

Existem diferentes tipos de testes automatizados, como testes de integração, requisição ou unitários. Neste artigo vamos falar um pouco sobre a estrutura básica de um teste unitário. Para isso, vamos usar dois frameworks como exemplo: o Rspec, para testar código Ruby, e o Jest, para Javascript.

Como o objetivo aqui é apresentar a estrutura geral de um teste unitário, não vamos entrar em detalhes sobre a configuração dos frameworks. No final do artigo você encontrará algumas referências para aprofundar seu conhecimento sobre esse assunto.

Vamos considerar uma classe Word que implementa o método ou função longest, que por sua vez recebe uma string de uma frase e retorna a palavra mais longa presente nela. Independente do framework que estamos utilizando, será necessário que o código da classe seja carregado. Com JavaScript podemos fazer isso com a linha:

const Word = require('./word.js')

Com Ruby e Rspec, podemos requerer o spec_helper, que vai nos ajudar a incorporar todos os arquivos do projeto:

require `spec_helper`

Note que no caso do JavaScript é necessário adicionar o código a uma constante, que chamamos de Word, o mesmo nome da classe importada. Essa variável será utilizada para chamarmos a função dentro dos testes.

Agora que temos o código da classe importada nos testes, podemos falar sobre a estrutura dos testes em si. Normalmente os testes começam com uma descrição para facilitar a leitura e compreensão. Embora não seja sempre necessária, adicionar uma descrição é uma prática que ajuda na organização do conjunto de testes de uma aplicação. Por exemplo, no Jest, poderíamos fazer algo como:

const Word = require('./word.js')

describe('Retornar a palavra mais longa em', () => {

});

No lugar de 'Retornar a palavra mais longa em', você poderia colocar qualquer descrição que faça sentido para o cenário do seu teste. É uma prática comum, por exemplo, incluir o nome da classe ou da função testada.

Dentro do bloco describe podem entrar todos os testes relacionados a esta funcionalidade. Cada teste tem sua própria descrição e uma expectativa, neste caso poderiam ficar parecido com o seguinte:

const Word = require('./word.js')

describe('Retornar a palavra mais longa em', () => {
  test('I have a bad feeling about this', () => {
    expect(Word.longest("I have a bad feeling about this")).toEqual("feeling");
  });

  test('These are not the droids you are looking for', () => {
    expect(Word.longest("These are not the droids you are looking for")).toEqual("looking");
  });
});

Usando Rspec, a estrutura é semelhante, começando com um describe:

require `spec_helper`

describe 'Retornar a palavra mais longa em' do

end

E dentro desse bloco incluímos cada um dos testes com suas descrições e expectativas:

require `spec_helper`

describe 'Retornar a palavra mais longa em' do
  it 'I have a bad feeling about this' do
    expect(Word.longest('I have a bad feeling about this')).to eq 'feeling'
  end

  it 'These are not the droids you are looking for' do    
    expect(Word.longest('These are not the droids you are looking for')).to eq 'looking'
  end
end

Deu pra perceber como as estruturas básicas são bastante semelhantes, com apenas algumas pequenas mudanças de test para it, por exemplo, mas ambos possuem blocos de código com expectativas bem definidas e fáceis de ler. Naturalmente, cada teste vai possuir características próprias para o seu contexto e palavras chaves específicas para suas expectativas.

Esse mesmo padrão pode ser encontrado em outros frameworks e linguagens de programação, cada uma com suas particularidades, vantagens e desvantagens.

Se você quiser saber mais sobre frameworks de testes, pode saber nossas impressões sobre Mocha e Jest neste artigo, ou pode ver como começar a testar sua aplicação Ruby on Rails com Rspec.

Referências e outras leituras

Foto de perfil do autor
André Kanamura

Dev na Campus Code