BDD em TypeScript: quando o código fala a linguagem do negócio
\n\nVocê já traduziu um documento de requisitos de várias páginas para descobrir que o cliente queria dizer algo completamente diferente? Conhece a situação em que o desenvolvedor e o analista olham para a mesma tarefa, mas veem duas aplicações diferentes? Se sim, você já está maduro para o BDD (Behaviour-Driven Development) — uma metodologia que apaga a fronteira entre "quero" e "pronto".
\n\nHoje vamos falar sobre como implementar BDD em TypeScript. Vou mostrar como transformar especificações chatas em cenários vivos e executáveis que tanto o gerente quanto o desenvolvedor backend entenderão. Não se trata apenas de testes — trata-se de uma linguagem comum para a equipe.
\n\nA propósito, se você está começando sua jornada em TypeScript, recomendo dar uma olhada na base de conhecimento PythonLib — lá tem materiais excelentes sobre os fundamentos. E nós seguimos em frente.
\n\nO que é BDD e por que você precisa dele?
\n\nBehaviour-Driven Development é uma evolução do TDD (Test-Driven Development). Enquanto o TDD foca em "como" o código funciona (os testes são escritos antes da implementação), o BDD responde à pergunta "o que" o sistema deve fazer do ponto de vista do usuário.
\n\nA principal característica do BDD é a sintaxe Gherkin. É a estrutura "Dado — Quando — Então" (Given — When — Then), que se parece com isto:
\n\nFuncionalidade: Autenticação do usuário\n Como um usuário registrado\n Eu quero fazer login no sistema\n Para ter acesso à área pessoal\n\n Cenário: Login bem-sucedido\n Dado um usuário com email "test@example.com" e senha "123456"\n Quando o usuário insere dados corretos\n Então o sistema o redireciona para a área pessoal\n\n\nConcorda que isso é mais claro do que "o teste unitário verifica se o método login() retorna true"? É aí que está a força do BDD: testes em TypeScript se tornam documentação que qualquer membro da equipe pode ler.
\n\nQuando o BDD se paga?
\n\n- \n
- Lógica de negócio complexa — quando há muitas condições, cadeias de ações e cenários de erro no código. \n
- Equipes distribuídas — analistas em Moscou, desenvolvedores em Minsk, testadores em Novosibirsk. BDD é a linguagem comum deles. \n
- Microsserviços — quando é necessário descrever claramente os contratos de interação entre os serviços. \n
Ferramentas para BDD em TypeScript
\n\nPara implementar BDD em TypeScript, temos duas ferramentas principais: Cucumber.js (ou suas variações) e Jest com plugins. Vamos analisar ambas as abordagens.
\n\nCucumber.js + TypeScript: o clássico
\n\nCucumber é o padrão ouro do BDD. Ele lê arquivos Gherkin (geralmente com extensão .feature) e executa os steps de código que você escreve em TypeScript.
Instalação:
\n\nnpm install --save-dev @cucumber/cucumber typescript ts-node\nnpm install --save-dev @types/node\n\n\nCriamos o arquivo features/login.feature:
Funcionalidade: Login no sistema\n Como usuário\n Eu quero me autenticar\n Para ter acesso às funcionalidades\n\n Cenário: Login bem-sucedido com email e senha corretos\n Dado que estou na página de login\n Quando eu insiro o email "admin@test.com"\n E eu insiro a senha "secret"\n E eu clico no botão "Entrar"\n Então eu vejo a mensagem de boas-vindas "Bem-vindo, Admin!"\n\n\nAgora escrevemos os steps em TypeScript. Criamos features/step_definitions/login.steps.ts:
import { Given, When, Then } from '@cucumber/cucumber';\nimport { expect } from 'chai';\n\n// Simulação simples do estado da aplicação\nconst appState = {\n currentPage: '',\n loggedInUser: ''\n};\n\nGiven('que estou na página de login', function () {\n appState.currentPage = 'login';\n appState.loggedInUser = '';\n});\n\nWhen('eu insiro o email {string}', function (email