Kaique Mitsuo Silva Yamamoto
Arquitetura software

BDD na Pratica: Next.js e Spring Boot

Behavior-Driven Development (BDD) conecta negocio, produto e engenharia por meio de exemplos executaveis. O objetivo e reduzir ambiguidade e transformar requisitos em comportamento verificavel.


O que e BDD

BDD estende ideias de TDD com foco em linguagem de negocio:

  • descreve comportamento esperado em linguagem natural;
  • usa exemplos concretos para alinhar entendimento;
  • automatiza cenarios como testes vivos.

Formato comum: Given / When / Then.


Fluxo recomendado

  1. Product + Engenharia definem exemplos de negocio.
  2. Exemplos viram cenarios Gherkin.
  3. Cenarios falham inicialmente.
  4. Implementacao minima para passar.
  5. Refatoracao sem quebrar comportamento.

Exemplo de cenario (Gherkin)

Feature: Checkout
  Scenario: Aplicar desconto VIP
    Given um cliente VIP com carrinho de R$ 200,00
    When ele finaliza a compra
    Then o valor final deve ser R$ 170,00

Esse cenario vira teste automatizado e documentacao executavel.


BDD em Next.js

Stack comum:

  • @cucumber/cucumber para cenarios;
  • Playwright para E2E;
  • Vitest/Jest para camadas internas.

Exemplo de step definition:

import { Given, When, Then } from "@cucumber/cucumber"
import { expect } from "@playwright/test"

Given("um cliente VIP com carrinho de R$ 200,00", async function () {
  await this.page.goto("/checkout")
  await this.page.fill("[name=customerType]", "VIP")
  await this.page.fill("[name=amount]", "200")
})

When("ele finaliza a compra", async function () {
  await this.page.click("button[type=submit]")
})

Then("o valor final deve ser R$ 170,00", async function () {
  await expect(this.page.locator("[data-testid=final-amount]")).toHaveText("170.00")
})

BDD em Spring Boot

Stack comum:

  • Cucumber JVM;
  • JUnit Platform;
  • Spring Boot Test + Testcontainers.
@SpringBootTest
@AutoConfigureMockMvc
public class CheckoutSteps {
  @Autowired private MockMvc mvc;
  private ResultActions response;

  @When("ele finaliza a compra")
  public void finalizaCompra() throws Exception {
    response = mvc.perform(post("/checkout")
      .contentType(MediaType.APPLICATION_JSON)
      .content("{\"customerType\":\"VIP\",\"amount\":200.00}"));
  }

  @Then("o valor final deve ser R$ 170,00")
  public void validaTotal() throws Exception {
    response.andExpect(status().isOk())
      .andExpect(jsonPath("$.finalAmount").value(170.00));
  }
}

Boas praticas

  • Cenario descreve regra de negocio, nao detalhe de tela.
  • Linguagem sem jargao tecnico.
  • Cenários curtos e independentes.
  • Um feature por capacidade de negocio.
  • Evite overlap de cenarios com testes unitarios.

Anti-padroes

  • Cenarios longos (10+ passos).
  • Steps muito acoplados a CSS/XPath.
  • BDD usado so para E2E lento.
  • Features sem revisao com negocio.

Estrategia de teste em camadas

  • Unidade: regra e calculos (rapido).
  • Componente/API: contratos de endpoint.
  • BDD: jornada de negocio principal.

BDD nao substitui os demais testes. Ele ancora entendimento do comportamento.


Recursos recomendados

YouTube

Artigos e documentacao

Papers e estudos

Livros

Posts no X (opcional)


Conclusao

BDD melhora previsibilidade de entrega porque transforma expectativa de negocio em contrato executavel. Em Next.js e Spring Boot, ele funciona melhor quando combinado com bons testes unitarios e de API.