Por que BDD em Rust não é sobre testes chatos
\n\nImagine: você está escrevendo um serviço de alta carga em Rust. Código seguro, rápido, mas quando o produto chega ao cliente, ele diz: "Ah, eu pensei que o botão deveria funcionar de outra forma". Familiar? A clássica lacuna entre código e expectativas. É aqui que o BDD (Behaviour-Driven Development) vem em socorro — uma metodologia que traduz requisitos de negócios para uma linguagem compreensível tanto para o gerente quanto para o compilador Rust.
\n\nNeste artigo, vamos explorar como implementar BDD em Rust na prática. Você aprenderá a escrever cenários em linguagem humana (Gherkin), automatizá-los com cucumber e specs, e por que isso torna seu código não apenas confiável, mas também transparente para toda a equipe. Sem enrolação — apenas código vivo e exemplos reais.
O que é BDD e por que Rust é ideal para ele
\n\nBehaviour-Driven Development é uma evolução do TDD. Enquanto o TDD foca em "como testar o código", o BDD responde à pergunta "qual comportamento queremos ver". Você escreve cenários na linguagem Gherkin (Given-When-Then), que são ao mesmo tempo testes e documentação.
\n\nRust — uma linguagem que adora rigor e previsibilidade. BDD em Rust oferece:
\n- \n
- Código autodocumentado — qualquer desenvolvedor lê o cenário e entende a lógica de negócios. \n
- Segurança em nível de tipos — o compilador verifica se seus passos correspondem à estrutura. \n
- Execução paralela — testes BDD em Rust rodam rapidamente graças a
asynce multithreading. \n
Quando o BDD em Rust é especialmente útil?
\n- \n
- Serviços de API com contratos claros (REST, GraphQL). \n
- Sistemas com regras de negócios (finanças, logística, jogos). \n
- Microsserviços onde a integração entre componentes é importante. \n
Ferramentas para BDD em Rust: Cucumber e Specs
\n\nO ecossistema Rust oferece duas abordagens principais:
\n\n1. cucumber — framework BDD clássico
\nPermite escrever cenários em Gherkin (arquivos .feature) e vinculá-los ao código Rust. Suporta async, macros personalizadas e relatórios.
2. specs — alternativa leve e rápida
\nNão requer arquivos Gherkin — os cenários são escritos diretamente em Rust usando macros. Ideal se você não quiser carregar um parser separado.
\n\nVamos nos concentrar no cucumber, pois ele oferece máxima flexibilidade e está alinhado ao padrão BDD.
\n\nEscrevendo o primeiro cenário BDD em Rust
\n\nVamos criar uma calculadora de descontos simples. Regra de negócio: se o valor da compra for maior que 1000 reais, desconto de 10%. Caso contrário — 0%.
\n\nPasso 1. Instalação de dependências
\nAdicione ao Cargo.toml:
[dev-dependencies]\ncucumber = "0.20"\ntokio = { version = "1", features = ["full"] }\nasync-trait = "0.1"\n\n\nPasso 2. Criando o arquivo feature
\nArquivo tests/features/discount.feature:
Feature: Cálculo de desconto\n Como um comprador\n Quero obter desconto em uma compra grande\n Para economizar dinheiro\n\n Scenario: Compra maior que 1000 reais\n Given o valor da compra é "1500"\n When eu solicito o cálculo do desconto\n Then o valor do desconto deve ser "150"\n\n Scenario: Compra menor que 1000 reais\n Given o valor da compra é "500"\n When eu solicito o cálculo do desconto\n Then o valor do desconto deve ser "0"\n\n\nPasso 3. Escrevendo os passos em Rust
\nCrie tests/steps/discount_steps.rs:
use cucumber::{given, then, when, World};\nuse async_trait::async_trait;\n\n#[derive(Debug, Default)]\nstruct DiscountWorld {\n purchase_amount: f64,\n discount: f64,\n}\n\n#[async_trait(?Send)]\nimpl World for DiscountWorld {\n // Implementação vazia para simplificar\n async fn new() -> Self {\n Self::d