Quando o código se transforma em história
\nImagine: você escreve código em Go, executa os testes — barra verde. Mas o gerente olha para o seu t.Errorf e não entende o que exatamente quebrou. O negócio diz: "Faça com que o usuário possa se registrar", e o desenvolvedor traduz isso para "POST /api/v1/user com validação de email". A lacuna entre a linguagem técnica e a humana é a principal dor de cabeça de muitos projetos.
Existe uma solução — BDD (Behaviour-Driven Development) em Go. Não são apenas testes. É uma ponte entre o código e a lógica de negócio. Neste artigo, vamos abordar como escrever testes BDD em Go, usando exemplos reais, e por que seu gerente de produto vai te agradecer.
\n\nO que é BDD e por que Go?
\nBehaviour-Driven Development (desenvolvimento orientado a comportamento) é uma evolução do TDD. Se o TDD foca no "como" (como implementar uma função), o BDD responde ao "o quê" (o que o sistema deve fazer do ponto de vista do usuário).
\nGo é ideal para BDD devido à sua simplicidade, pacote nativo testing e frameworks poderosos como Ginkgo e Godog. A comunidade Go usa ativamente BDD para microsserviços, APIs e até utilitários de linha de comando.
Princípios-chave do BDD em Go
\n- \n
- Linguagem Ubíqua (Ubiquitous Language) — os cenários são escritos em inglês ou português compreensível para o negócio. \n
- Given-When-Then — estrutura de qualquer cenário: premissas → ação → resultado esperado. \n
- Automação — os cenários se transformam em testes executáveis em Go. \n
Ferramentas para BDD em Go
\nA escolha do framework depende de como você deseja descrever os cenários. Aqui estão duas abordagens principais:
\n\n1. Ginkgo + Gomega (para desenvolvedores Go)
\nGinkgo é um framework BDD escrito em Go puro. Os cenários parecem código Go com descrições legíveis. Gomega é uma biblioteca de matchers para asserções.
\nVantagens: controle total sobre o código, excelente integração com ferramentas Go, suporte a testes assíncronos.
\n\n2. Godog (Cucumber para Go)
\nGodog é uma implementação do Cucumber em Go. Você escreve cenários em Gherkin (arquivos Feature em linguagem natural) e depois implementa os passos em Go.
\nVantagens: cenários legíveis mesmo para não programadores, fácil alterar a lógica sem editar o código.
\n\nPrática: escrevendo um teste BDD em Go com Ginkgo
\nVamos criar um serviço simples — um carrinho de compras de e-commerce. Vamos escrever um teste BDD que verifica a adição de um produto.
\n\nPasso 1: Instalação do Ginkgo
\ngo get github.com/onsi/ginkgo/v2\ngo get github.com/onsi/gomega\n\nPasso 2: Inicialização do pacote de teste
\ncd mycart\nginkgo bootstrap\nO arquivo mycart_suite_test.go é criado.
Passo 3: Escrevendo o cenário
\nCrie o arquivo cart_test.go:
package mycart_test\n\nimport (\n . "github.com/onsi/ginkgo/v2"\n . "github.com/onsi/gomega"\n "mycart"\n)\n\nvar _ = Describe("Carrinho", func() {\n var cart *mycart.Cart\n\n BeforeEach(func() {\n cart = mycart.NewCart()\n })\n\n Describe("Adição de produto", func() {\n Context("com ID e preço corretos", func() {\n It("deve aumentar a quantidade de itens em 1", func() {\n cart.AddItem("sku-123", 100.0)\n Expect(cart.TotalItems()).To(Equal(1))\n })\n\n It("deve calcular corretamente o valor total", func() {\n cart.AddItem("sku-123", 100.0)\n cart.AddItem("sku-456", 250.0)\n Expect(cart.TotalPrice()).To(BeNumerically("~", 350.0, 0.01))\n })\n })\n\n Context("com produto já existente", func() {\n It("deve aumentar a quantidade, não adicionar um novo item", func() {\n cart.