Testes em TypeScript: Frameworks e ferramentas para desenvolvimento de qualidade
TypeScript é uma linguagem poderosa que adiciona tipagem estática ao JavaScript. No entanto, mesmo tipos rigorosos não garantem a ausência de erros lógicos. Para garantir a confiabilidade do código, é necessário usar testes. Neste artigo, vamos explorar as principais ferramentas e frameworks para testar aplicações TypeScript: desde testes unitários até testes de ponta a ponta (E2E).
Por que testar código TypeScript?
O compilador TypeScript detecta erros de tipo, mas não verifica a lógica de negócios. Os testes ajudam a:
- Detectar regressão durante refatorações
- Documentar o comportamento esperado das funções
- Acelerar revisões de código através de verificação automática
- Aumentar a confiança no funcionamento da aplicação
Categorias principais de testes
- Testes unitários — verificação de funções, classes ou módulos individuais.
- Testes de integração — interação entre módulos (por exemplo, com banco de dados).
- Testes E2E — simulação de ações do usuário no navegador.
1. Jest — framework universal para testes unitários
Jest, do Facebook, é a escolha mais popular para TypeScript. Ele funciona "pronto para uso": não requer configuração complexa, possui um mecanismo de mock integrado e relatório de cobertura de código.
Instalação:
npm install --save-dev jest @types/jest ts-jestAdicione em jest.config.ts:
export default { preset: 'ts-jest', testEnvironment: 'node',};Exemplo de teste unitário para uma função:
// math.tsexport const add = (a: number, b: number): number => a + b;
// math.test.tsimport { add } from './math';
describe('add', () => { it('should return sum of two numbers', () => { expect(add(2, 3)).toBe(5); });
it('should handle negative numbers', () => { expect(add(-1, -2)).toBe(-3); });});Mocks em Jest:
// api.tsexport const fetchData = async (id: string) => { const response = await fetch(`/api/${id}`); return response.json();};
// api.test.tsjest.mock('./api', () => ({ fetchData: jest.fn().mockResolvedValue({ id: '1', name: 'Test' }),}));
import { fetchData } from './api';
test('should return mocked data', async () => { const data = await fetchData('1'); expect(data.name).toBe('Test');});2. Mocha + Chai — alternativa flexível
Mocha é um executor de testes que oferece controle total sobre o processo. Chai adiciona asserções expressivas.
Instalação:
npm install --save-dev mocha chai @types/mocha @types/chai ts-nodeExemplo de teste de integração com assincronia:
// database.tsexport class Database { async getUser(id: number): Promise<{ id: number; name: string }> { // simulação de consulta return { id, name: 'Alice' }; }}
// database.test.tsimport { expect } from 'chai';import { Database } from './database';
describe('Database', () => { it('should return user by id', async () => { const db = new Database(); const user = await db.getUser(1); expect(user).to.have.property('name', 'Alice'); });});Para executar, use o comando mocha --require ts-node/register src/**/*.test.ts.
3. Cypress — Testes E2E para aplicações web
Cypress é ideal para testar frontend em TypeScript. Ele funciona em um navegador real e possui uma interface GUI conveniente.
Instalação:
npm install --save-dev cypress @cypress/typesExemplo de teste E2E para uma página de login