BDD em Kotlin: Escrevendo testes que gerentes e desenvolvedores leem
\n\nVocê já mostrou um teste unitário para o seu gerente de produto? Provavelmente não. Porque é como mostrar os diagramas de um motor a jato para um piloto — útil, mas incompreensível. O Behaviour-Driven Development (BDD) em Kotlin resolve exatamente esse problema: ele transforma asserts secos em cenários vivos que descrevem o comportamento do sistema em linguagem humana.
\n\nNeste artigo, vamos explorar como implementar BDD em Kotlin usando frameworks modernos — Kotest e Spek. Você verá como escrever testes no estilo Given-When-Then, que são ao mesmo tempo documentação e verificação automática. E sim, até seu líder técnico sem preparação conseguirá lê-los.
\n\nO que é BDD e como ele difere do TDD?
\n\nMuitos confundem TDD (Test-Driven Development) e BDD (Behaviour-Driven Development). A diferença é simples:
\n\n- \n
- TDD — é sobre "como vou testar este método?" \n
- BDD — é sobre "como o usuário obterá valor desta funcionalidade?" \n
O desenvolvimento orientado a comportamento foca no comportamento do sistema, não nos detalhes de implementação. Você descreve um cenário: sob certas condições (Given), quando uma ação ocorre (When), o sistema produz um resultado esperado (Then).
\n\nPor exemplo, em vez de escrever: assertEquals(42, calculator.add(20, 22)),
você escreverá:
Given("eu tenho uma calculadora") {\n val calc = Calculator()\n When("eu somo 20 e 22") {\n val result = calc.add(20, 22)\n Then("o resultado deve ser 42") {\n result shouldBe 42\n }\n }\n}\n\n\nConcorde que a segunda opção se lê como uma história, não como uma instrução técnica.
\n\nPor que Kotlin é ideal para BDD
\n\nKotlin é uma linguagem que por si só favorece a escrita de código legível. Funções de extensão, notação infixa, lambdas com receptor — tudo isso torna os testes BDD em Kotlin extremamente naturais. Você pode escrever shouldBe, shouldThrow e outros matchers que parecem inglês.
Além disso, Kotlin suporta múltiplos paradigmas, permitindo o uso de diferentes frameworks para BDD. Vamos analisar os dois mais populares.
\n\nFramework Kotest: BDD nativo
\n\nKotest (anteriormente KotlinTest) é um poderoso framework de teste multiplataforma. Ele suporta vários estilos, incluindo BehaviorSpec, que é perfeito para BDD.
\n\nAqui está um cenário BDD completo em Kotlin usando Kotest:
\n\nimport io.kotest.core.spec.style.BehaviorSpec\nimport io.kotest.matchers.shouldBe\n\nclass CartSpec : BehaviorSpec({\n given("carrinho vazio") {\n val cart = ShoppingCart()\n `when`("adicionamos um item com preço 100") {\n cart.addItem(Item("Livro", 100.0))\n then("o carrinho deve ter 1 item") {\n cart.itemCount shouldBe 1\n }\n then("o total deve ser 100") {\n cart.total shouldBe 100.0\n }\n }\n `when`("adicionamos um item e aplicamos desconto de 10%") {\n cart.addItem(Item("Livro", 100.0))\n cart.applyDiscount(10.0)\n then("o valor final deve ser 90") {\n cart.total shouldBe 90.0\n }\n }\n }\n})\n\n\nObserve as aspas invertidas em torno de when. Esta é uma peculiaridade do Kotlin: when é uma palavra reservada, mas entre aspas funciona como identificador. Alguns desenvolvedores preferem usar When com letra maiúscula.
Spek: BDD estruturado para Kotlin
\n\nSpek