Chega de adivinhar: por que TDD não é masoquismo, mas um superpoder
\n\nImagine: você escreve código. Tudo funciona. Você está satisfeito. Um mês depois, você volta ao projeto, faz uma pequena alteração — e tudo quebra. Familiar? Agora imagine que você tem uma rede de segurança que captura cada erro em um segundo. Isso é o TDD em TypeScript — desenvolvimento orientado a testes.
\n\nMuitos desenvolvedores acham que TDD é para perfeccionistas ou para projetos da NASA. Spoiler: não é. Test Driven Development é uma ferramenta que economiza horas de depuração, melhora a qualidade do código e torna a refatoração segura. Neste artigo, vamos explorar o TDD TypeScript com exemplos reais, sem rodeios ou abstrações.
\n\nSe você programa em TypeScript e quer parar de ter medo das suas próprias alterações — continue lendo. Vai ser interessante.
\n\nO que é TDD (e por que não é sobre "escrever testes")
\n\nTDD (Test-Driven Development) é uma metodologia onde os testes são escritos antes do código. Parece loucura? Só à primeira vista. O ciclo TDD consiste em três etapas:
\n\n- \n
- Vermelho (Red) — escreva um teste que certamente falhará, porque o código ainda não existe. \n
- Verde (Green) — escreva o código mínimo para que o teste passe. \n
- Refatoração (Refactor) — melhore o código sem alterar seu comportamento. \n
E assim — em ciclo. Cada nova funcionalidade começa com um teste. Isso disciplina, força você a pensar no design da API antecipadamente e dá a confiança de que tudo funciona como um relógio.
\n\nA propósito, testes unitários TypeScript não são apenas "verificação de funções". São documentação, especificação e seguro em um só pacote.
\n\nFerramentas para TDD em TypeScript: o que instalar
\n\nPara testes TypeScript, precisaremos de:
\n\n- \n
- Jest — o framework de testes mais popular. Funciona nativamente com TypeScript. \n
- ts-jest — predefinição para Jest entender TypeScript sem configuração adicional. \n
- @types/jest — tipos para autocompletar na IDE. \n
Instalação em um comando:
\n\nnpm install --save-dev jest ts-jest @types/jest typescript\n\nAdicione no package.json o script para executar os testes:
"scripts": {\n "test": "jest",\n "test:watch": "jest --watch"\n}\n\nAgora está tudo pronto para o desenvolvimento orientado a testes TypeScript.
\n\nEscrevendo o primeiro teste com TDD: do vermelho ao verde
\n\nVamos supor que precisamos escrever uma função que verifica se uma string é um palíndromo. Pela clássica abordagem TDD — começamos com o teste.
\n\nPasso 1. Vermelho (Red)
\n\nCrie o arquivo isPalindrome.test.ts:
import { isPalindrome } from './isPalindrome';\n\ndescribe('isPalindrome', () => {\n it('deve retornar true para a string "racecar"', () => {\n expect(isPalindrome('racecar')).toBe(true);\n });\n\n it('deve retornar false para a string "hello"', () => {\n expect(isPalindrome('hello')).toBe(false);\n });\n});\n\nExecute o teste:
\n\nnpm test\n\nVemos o erro: Cannot find module './isPalindrome'. Ótimo, a fase vermelha foi concluída. Agora precisamos escrever o código para que o teste passe.
Passo 2. Verde (Green)
\n\nCrie isPalindrome.ts com a implementação mínima:
export function isPalindrome(str: string): boolean {\n return str === str.split('').reverse().join('');\n}\n\nExecute os testes novamente — verde! Ambos os testes passam. Mas ainda não é tudo.
\n\nPasso 3. Refatoração (Refactor)
\n\nNossa função funciona, mas há um detalhe: ela não lida com strings que contêm espaços e letras maiúsculas/minúsculas. Vamos adicionar um novo teste:
\n\nit('deve ignorar maiúsculas/minúsculas e espaços',