Quando o código fala a linguagem do negócio: conhecendo o BDD
Imagine a seguinte situação: você escreveu um módulo de pagamento perfeito, do ponto de vista do código. Todos os métodos funcionam, as exceções são tratadas, a cobertura de testes unitários é de 99%. Você abre o champanhe, mas chega o gerente e pergunta: "Por que estamos debitando o dinheiro antes da confirmação do pedido?". E você percebe — o bug não está no código, mas no entendimento da tarefa.
Familiar? É exatamente para esses casos que existe o BDD (Behaviour-Driven Development) — desenvolvimento orientado a comportamento. Não é apenas mais uma metodologia, mas uma ponte entre "quero que funcione" e "como implementar isso em PHP". Se você está cansado de reescrever a lógica após cada esclarecimento de requisitos, este artigo é para você.
Neste material, vamos abordar como implementar BDD em PHP usando o framework Behat, escrever testes reais e entender por que isso torna o código mais limpo e a comunicação mais transparente.
O que é BDD e como ele difere do TDD?
Muitos confundem Behaviour-Driven Development com o TDD (Test-Driven Development) comum. E de fato, externamente são parecidos: em ambos, os testes são escritos primeiro. Mas a diferença está no foco.
- TDD — é sobre "como verificar se a função retorna o número correto". Os testes são escritos na linguagem do programador: assert, equals, mock.
- BDD — é sobre "como o sistema se comporta em uma situação de negócio específica". Os cenários são escritos em linguagem natural, quase humana.
A ideia central do BDD em PHP é usar uma linguagem única para comunicação. Desenvolvedores, testadores e gerentes leem o mesmo cenário. E se nele está escrito "o usuário adiciona um produto ao carrinho sem autenticação", todos entendem isso da mesma forma.
Ferramentas: Behat e Gherkin
No mundo PHP, a principal ferramenta para BDD é o Behat. É um framework que analisa cenários na linguagem Gherkin e os transforma em testes executáveis. Gherkin é uma linguagem simples em português (ou inglês) com palavras-chave: Feature, Scenario, Given, When, Then.
Vamos instalar o Behat no seu projeto PHP:
composer require --dev behat/behat behat/mink-extension behat/mink-goutte-driverApós a instalação, inicialize o projeto:
vendor/bin/behat --initA estrutura ficará assim:
features/ bootstrap/ FeatureContext.php your_feature.featurebehat.ymlEscrevendo o primeiro cenário BDD em PHP
Suponha que temos uma loja online. Requisito de negócio: "Um usuário registrado pode adicionar um produto ao carrinho e ver o valor total". Crie o arquivo features/cart.feature:
Feature: Carrinho do comprador Como um usuário registrado Eu quero adicionar produtos ao carrinho Para ver o valor total
Scenario: Adicionar um único produto Given eu acesso o site como usuário "ivan@example.com" And na página do catálogo existe o produto "Notebook" por 50000 reais When eu clico em "Adicionar ao carrinho" para o produto "Notebook" Then eu vejo a mensagem "Produto adicionado" And o valor total do carrinho é 50000 reaisObserve: este cenário pode ser lido por qualquer gerente sem conhecimento de PHP. Mas para o Behat, ele é um teste executável.
Implementação dos passos (Step Definitions)
Agora precisamos "ensinar" o Behat a entender esses passos. Abra o arquivo features/bootstrap/FeatureContext.php:
<?php
use Behat\\Behat\\Context\\Context;use Behat\\Gherkin\\Node\\PyStringNode;use Behat\\Gherkin\\Node\\TableNode;
class FeatureContext implements Context{ private $currentUser; private $cart = []; private $products = [];
/** * @Given eu acesso o site como