TDD
BDD
Testes Automatizados
Jest
Cypress
Qualidade de Código

Testes Automatizados: TDD e BDD na Prática

Testes Automatizados: TDD e BDD na Prática

Testes são a base de um software confiável. Quando bem aplicados, reduzem bugs, aumentam a velocidade de entrega e dão confiança para refatorar. Dois paradigmas populares são Test-Driven Development (TDD) e Behavior-Driven Development (BDD). Embora complementares, eles têm focos diferentes.

Quando usar TDD vs BDD

  • TDD: foco em unidades de código (funções, classes). Escreve-se o teste antes da implementação, garantindo que a API pública se comporte como esperado.
  • BDD: foco em comportamento de alto nível (fluxos de usuário, requisitos). Usa uma linguagem quase natural (Gherkin) para descrever cenários.

Regra prática: use TDD para lógica de negócio e bibliotecas internas; use BDD para fluxos de UI e integrações.

Ferramentas recomendadas

CamadaFerramentaPor que usar
Unitário (JS/TS)JestRápido, snapshot testing, cobertura integrada
Unitário (Node)Mocha + ChaiFlexível, boa integração com Sinon
UI (React)Testing LibraryTesta a UI como o usuário vê
End-to-endCypressTestes reais no navegador, depuração visual
BDDCucumber.jsSintaxe Gherkin, integração com Jest/Cypress

Fluxo TDD passo a passo

  1. Escreva o teste que falha (vermelho).
  2. Implemente o código mínimo para passar (verde).
  3. Refatore mantendo os testes verdes (refatorar).
  4. Repita.

Exemplo prático, Função de formatação de preço

// priceFormatter.test.ts (Jest) import { formatPrice } from './priceFormatter'; test('formata número como moeda BRL', () => { expect(formatPrice(1234.5)).toBe('R$ 1.234,50'); });
// priceFormatter.ts (implementação mínima) export function formatPrice(value: number): string { return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(value); }

Fluxo BDD com Cucumber.js

Definição de cenário (Gherkin)

Feature: Cadastro de Usuário As a visitor I want to create an account So that I can access protected features Scenario: Cadastro bem-sucedido Given I am on the registration page When I fill the form with valid data And I submit the form Then I should see a confirmation message And I receive a verification email

Implementação dos passos (Cypress + Cucumber)

import { Given, When, Then } from 'cypress-cucumber-preprocessor/steps'; Given('I am on the registration page', () => { cy.visit('/register'); }); When('I fill the form with valid data', () => { cy.get('#email').type('usuario@example.com'); cy.get('#password').type('SenhaForte123!'); cy.get('#confirmPassword').type('SenhaForte123!'); }); When('I submit the form', () => { cy.get('form').submit(); }); Then('I should see a confirmation message', () => { cy.contains('Cadastro concluído').should('be.visible'); });

Boas práticas gerais

  • Mantenha os testes rápidos: se um teste leva mais de 500 ms, provavelmente está fazendo I/O desnecessário.
  • Isolamento: use mocks/stubs para dependências externas (APIs, bancos).
  • Cobertura mínima: 80 % de cobertura de linhas é um bom ponto de partida, mas priorize lógica crítica.
  • Integração contínua: configure o pipeline (GitHub Actions, GitLab CI) para rodar npm test em cada PR.
  • Feedback visual: use plugins de IDE que mostram resultados de testes em tempo real.

Checklist de implementação

  • Escolher framework de teste (Jest, Cypress, etc.)
  • Configurar jest.config.js e cypress.json
  • Criar diretórios tests/unit e tests/e2e
  • Escrever primeiro teste falho para cada nova feature
  • Integrar testes ao pipeline CI
  • Monitorar cobertura e falhas regressivas

Conclusão

TDD e BDD não são apenas técnicas, são mudanças de mentalidade. Quando adotadas corretamente, garantem que seu código evolua sem medo de quebrar funcionalidades existentes. Comece pequeno, escreva testes claros e deixe que eles guiem seu desenvolvimento.


Qual a sua experiência com TDD ou BDD? Compartilhe nos comentários!

Leia também