01. Introdução ao Kotest Framework
Ao concluirmos todas as aulas deste tópico, nós:
- Saberemos como configurar e executar especificações do Kotest 6 no JUnit Platform usando Gradle 9 e Maven.
- Compreenderemos a estrutura de uma classe de especificação do Kotest (
DescribeSpec,BehaviorSpec,ShouldSpec), seus blocos de ciclo de vida e a organização semânticaGiven/When/Then. - Saberemos como escrever asserções expressivas com
kotest-assertions-core(shouldBe, coleções, exceções eassertSoftly) e testes orientados a dados (data-driven testing) comwithData.
Como Configurar o Ambiente para Kotest 6 e BDD em Kotlin
O Kotest 6 é o framework moderno de testes e especificações BDD mais expressivo e flexível do ecossistema Kotlin. Diferente de soluções legadas que dependiam de linguagens dinâmicas adicionais (como Groovy com Spock) ou anotações verbosas do JUnit 4, o Kotest foi projetado nativamente para tirar proveito da sintaxe idiomática do Kotlin: lambdas com receptor (type-safe builders), funções infix, corrotinas assíncronas e forte tipagem estática.
Neste guia prático, aprenderemos a configurar um ambiente completo e reprodutível do zero, integrando Spring Boot, Kotlin 2.4+, Gradle 9 (Kotlin DSL), Kotest 6.2.6 e MockK 1.14.0.
Passo 1: Criando o Projeto Base via CLI (start.spring.io)
O meio mais rápido e reprodutível de criar um projeto moderno em Kotlin com Gradle é através da API de linha de comando do Spring Initializr via curl.
Execute o comando abaixo no terminal para gerar a estrutura base do projeto com Gradle Kotlin DSL (build.gradle.kts), Kotlin e Java 21:
|
|
[!NOTE] Explicação dos parâmetros utilizados:
type=gradle-project-kotlin: Gera o projeto com Gradle configurado nativamente com Kotlin DSL (build.gradle.kts).language=kotlin: Configura o compiladorkotlin-jvme a biblioteca padrãokotlin-stdlib.javaVersion=21: Seleciona o JDK 21 LTS (Long-Term Support).dependencies=web: Adiciona ospring-boot-starter-webpara termos componentes Spring gerenciados.baseDir=kotest-spring-demo | tar -xzvf -: Descompacta os arquivos diretamente no diretóriokotest-spring-demo.
Passo 2: Configurando Dependências no build.gradle.kts
Abra o arquivo build.gradle.kts na raiz do projeto. Precisamos adicionar as bibliotecas essenciais para escrever e executar testes BDD com o Kotest 6 e criar mocks idiomáticos com o MockK:
io.kotest:kotest-runner-junit5:6.2.6: Implementa aTestEnginedo Kotest sobre a JUnit Platform. É esse runner que descobre e executa as especificações Kotest quando o Gradle executa a tarefatest.io.kotest:kotest-assertions-core:6.2.6: Oferece o conjunto de asserções idiomáticas e expressivas do Kotlin (shouldBe,shouldNotBe,shouldThrow,assertSoftly, etc.).io.kotest.extensions:kotest-extensions-spring:1.3.0: Permite a integração nativa entre o ciclo de vida do Kotest e oTestContextManagerdo Spring Framework, possibilitando injeção de dependências no construtor da especificação e anotações como@SpringBootTest.io.mockk:mockk:1.14.0: Biblioteca de mocks criada especificamente para Kotlin, com suporte pleno a corrotinas, lambdas e classes finais (final classes por padrão no Kotlin).
Edite a seção dependencies do seu build.gradle.kts conforme o exemplo abaixo:
|
|
[!TIP] Caso prefira gerenciar versões via BOM (Bill of Materials), você pode importar
testImplementation(platform("io.kotest:kotest-bom:6.2.6"))e omitir as versões dos móduloskotest-runner-junit5ekotest-assertions-core.
Passo 3: Configurando a Tarefa tasks.withType<Test>
O Kotest 6 executa em cima da JUnit Platform. Para que o Gradle reconheça a engine do Kotest e forneça logs detalhados e hierárquicos das especificações BDD, configure a tarefa tasks.withType<Test> no seu build.gradle.kts:
|
|
[!IMPORTANT] A diretiva
useJUnitPlatform()é estritamente obrigatória. Sem ela, o Gradle tentará rodar a suíte com o runner vintage do JUnit 3/4 e ignorará completamente as classes de especificação do Kotest.
Passo 4: Criando a Primeira Especificação BDD com DescribeSpec
Com o ambiente configurado, vamos criar uma especificação BDD utilizando o estilo DescribeSpec, um dos mais populares e legíveis do Kotest.
Primeiro, crie uma classe de serviço simples em src/main/kotlin/com/testwithspring/master/GreetingService.kt:
|
|
Agora crie o arquivo de teste correspondente em src/test/kotlin/com/testwithspring/master/GreetingServiceSpec.kt:
|
|
[!TIP] Se a sua especificação precisar injetar componentes gerenciados pelo Spring (como
@Autowiredou via construtor), basta registrar a extensãoextension(SpringExtension)no construtor doDescribeSpece anotar sua classe com@SpringBootTest:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15import io.kotest.extensions.spring.SpringExtension import org.springframework.boot.test.context.SpringBootTest @SpringBootTest class GreetingServiceIntegrationSpec( private val greetingService: GreetingService ) : DescribeSpec({ extension(SpringExtension) describe("Integração com contexto Spring") { it("deve injetar o serviço com sucesso") { greetingService.buildGreeting("Spring") shouldBe "Olá, Spring!" } } })
Passo 5: Executando e Validando a Suíte com Gradle
Para executar sua suíte e validar as especificações, execute o comando a seguir no terminal:
|
|
Com o bloco testLogging configurado no Gradle, a árvore hierárquica BDD será impressa diretamente no console:
|
|
Para executar apenas a sua especificação individualmente:
|
|
O Gradle também gera um relatório HTML visual com todo o detalhamento da execução no diretório build/reports/tests/test/index.html.
Pronto! Seu ambiente está configurado para explorar todas as potencialidades do Kotest 6 nos próximos tópicos e aulas práticas.
Conteúdo
-
Configurando o Kotest Runner no JUnit Platform (Maven)
Aprenda a compilar e executar especificações de testes unitários com Kotest 6 no JUnit Platform utilizando Maven.
-
Executando Especificações Kotest com Gradle 9
Aprenda a configurar, filtrar por tags e executar especificações do Kotest 6 com Gradle 9.8.2 (Kotlin DSL).
-
Estilos de Especificação do Kotest (DescribeSpec, BehaviorSpec) e Ciclo de Vida
Aprenda a criar classes de especificação no Kotest 6, escolher estilos (DescribeSpec, BehaviorSpec, ShouldSpec), isolar campos e usar callbacks de fixture.
-
Estruturando Blocos Given/When/Then e Ciclo de Vida
Aprenda a estruturar especificações de comportamento usando blocos Given, When, Then, And, blocos funcionais diretos e limpeza garantida de recursos com autoClose no Kotest 6.
-
Escrevendo Asserções Expressivas com kotest-assertions-core
Aprenda a escrever asserções expressivas e legíveis em especificações do Kotest 6 usando kotest-assertions-core, shouldThrow e matchers fluentes.
-
Testes Orientados a Dados com withData no Kotest
Aprenda por que e como escrever testes parametrizados e orientados a dados (Data-Driven Testing) usando withData e tabelas tipadas no Kotest 6.