Conceitos e Importância
Conceitos:
- Unidade: Menor parte funcional do código que pode ser testada, como uma função ou método.
- Teste Automatizado: Código que verifica o comportamento de outro código automaticamente.
- Frameworks de Teste: Ferramentas que ajudam a organizar, executar e relatar testes.
Importância:
- Confiabilidade: Reduz erros e garante que alterações futuras não quebrem funcionalidades existentes.
- Manutenibilidade: Facilita a refatoração e a adição de novas funcionalidades.
- Documentação: Serve como documentação viva, descrevendo como o código deve se comportar.
- Velocidade: Identifica problemas rapidamente, economizando tempo no desenvolvimento.
Ferramentas de Teste
- Mocha: Framework para organizar e executar testes.
- Jest: Framework completo para JavaScript, ideal para aplicações React.
- Chai: Biblioteca de asserções, usada junto com frameworks como Mocha.
- Sinon: Biblioteca para mocks, stubs e spies.
- QUnit: Usado para testes de aplicações baseadas em jQuery.
- Karma: Executor de testes que roda em navegadores reais.
Exemplo Prático: Teste de Unidade
Código a ser Testado
// math.js
function soma(a, b) {
return a + b;
}
module.exports = soma;
Configuração
-
Instale o Jest (ou outra ferramenta):
npm install jest --save-dev
-
Adicione um script no
package.json
:{ "scripts": { "test": "jest" } }
Escrevendo o Teste
// math.test.js
const soma = require('./math');
test('Deve somar 2 e 3 e retornar 5', () => {
expect(soma(2, 3)).toBe(5);
});
test('Deve retornar um número negativo ao somar -5 e 2', () => {
expect(soma(-5, 2)).toBe(-3);
});
Executando o Teste
npm test
Saída esperada:
PASS ./math.test.js
✓ Deve somar 2 e 3 e retornar 5 (Xms)
✓ Deve retornar um número negativo ao somar -5 e 2 (Xms)
Teste com Mocking e Spying
Mocks e spies ajudam a simular o comportamento de funções ou serviços externos.
Exemplo
Simulando uma função que faz uma chamada API:
// api.js
function fetchUser(id) {
return fetch(`https://api.example.com/users/${id}`)
.then((response) => response.json());
}
module.exports = fetchUser;
Teste com Mock:
const fetchUser = require('./api');
jest.mock('./api', () => ({
fetchUser: jest.fn(() => Promise.resolve({ id: 1, name: "John Doe" }))
}));
test('Deve retornar o usuário correto', async () => {
const user = await fetchUser(1);
expect(user).toEqual({ id: 1, name: "John Doe" });
});
Boas Práticas
- Nomenclatura: Use nomes claros para os testes.
- Unidade Isolada: Evite dependências externas (use mocks ou spies).
- Automatização: Configure testes no pipeline CI/CD.
- Cobertura: Utilize ferramentas como Istanbul para verificar a cobertura de código.