Configurando o Kotest Runner no JUnit Platform (Maven)
Depois de concluirmos esta aula, nós:
- Compreenderemos como compilar testes unitários escritos em Kotlin que utilizam o Kotest Framework 6.
- Saberemos como executar especificações do Kotest sobre a JUnit Platform usando o Maven Surefire Plugin.
- Saberemos como filtrar e executar apenas especificações que pertençam a uma Tag específica (
UnitTest) e que sigam a convenção de nomenclatura*Spec.
[!NOTE] Onde entra o Kotest na stack moderna?
No curso original, o Pacote Master ensinava a escrever especificações BDD em Groovy utilizando o Spock Framework. No ecossistema moderno com Kotlin 2.4.21 e Spring Boot 4.1.2, não precisamos adicionar uma segunda linguagem dinâmica (Groovy) ao projeto: utilizamos o Kotest 6.2.6, o framework de especificações BDD, asserções e testes baseados em propriedades nativo para Kotlin!
1. Os Requisitos do Nosso Build Maven
Os requisitos do nosso build Maven são:
- Nossa aplicação e nossos testes são escritos em Kotlin.
- Ele deve suportar testes unitários escritos com o Kotest Framework 6.
- O diretório de código-fonte dos nossos testes unitários deve ser
src/test/kotlin. - O diretório de recursos dos nossos testes unitários deve ser
src/test/resources. - Ele deve executar apenas os testes unitários que pertencem à tag
UnitTest.
Vamos descobrir como declarar as dependências necessárias no arquivo pom.xml.
2. Obtendo as Dependências Necessárias
Para escrever e executar especificações com o Kotest 6 no JUnit Platform, precisamos declarar as seguintes dependências no nosso arquivo pom.xml:
- Kotest Runner JUnit 5 / JUnit Platform (
io.kotest:kotest-runner-junit5-jvm, versão6.2.6): fornece aTestEngine(KotestJunitPlatformTestEngine) que permite ao JUnit Platform descobrir e executar especificações do Kotest nativamente. - Kotest Assertions Core (
io.kotest:kotest-assertions-core-jvm, versão6.2.6): fornece a biblioteca de matchers e asserções fluentes do Kotest (shouldBe,shouldThrow,assertSoftly, etc.). - Kotlin Stdlib (
org.jetbrains.kotlin:kotlin-stdlib, versão2.4.21): biblioteca padrão da linguagem Kotlin.
Depois de adicionarmos essas dependências ao nosso arquivo pom.xml, a seção dependencies fica assim:
|
|
[!TIP] Se você quiser importar todos os módulos do Kotest alinhados na mesma versão sem repetir
<version>6.2.6</version>, também pode importar o BOM oficialio.kotest:kotest-bom:6.2.6na seção<dependencyManagement>do seupom.xml.
A seguir, vamos dar uma olhada rápida nas duas especificações do Kotest do nosso projeto de exemplo.
3. Conhecendo Nossas Especificações do Kotest
Nosso projeto de exemplo possui duas classes de especificação simples:
Primeiro, definimos um objeto UnitTest que estende io.kotest.core.Tag (ou usamos a anotação @Tags("UnitTest")) para identificar todas as especificações que devem rodar durante a fase de testes unitários:
|
|
A classe MessageServiceSpec especifica um teste unitário marcado com @Tags("UnitTest"):
|
|
Segundo, a classe UnCategorizedSpec especifica um teste que não possui nenhuma tag associada. Em outras palavras, esta especificação não deve ser executada quando rodarmos nossa suíte filtrada por UnitTest:
|
|
[!NOTE] Exploraremos a anatomia completa das especificações do Kotest e seus estilos (
DescribeSpec,BehaviorSpec,ShouldSpec) nas próximas aulas deste tópico. Por ora, nosso foco é garantir que o build compile e filtre essas classes corretamente.
Vamos ver agora como compilar nossos testes unitários com o Maven.
4. Compilando Nossos Testes Unitários
Para compilar nosso código de produção (src/main/kotlin) e nossas especificações de teste (src/test/kotlin), configuramos o kotlin-maven-plugin na seção build do nosso pom.xml executando os goals compile e test-compile:
|
|
Podemos compilar nossos testes unitários executando o seguinte comando no terminal:
|
|
Ao executar esse comando, veremos uma saída semelhante a esta:
|
|
Essa saída confirma que o kotlin-maven-plugin compilou tanto a classe MessageService quanto nossas classes de especificação em src/test/kotlin.
5. Executando Nossos Testes Unitários com Maven Surefire
Para executar nossas especificações do Kotest, declaramos o Maven Surefire Plugin (maven-surefire-plugin) na seção plugins do pom.xml. Precisamos configurá-lo em dois passos:
Primeiro, garantimos que o Kotest execute apenas as especificações marcadas com a tag UnitTest. No Kotest 6, podemos passar a propriedade de sistema kotest.tags dentro do bloco <systemPropertyVariables> do Surefire.
Segundo, por padrão, versões clássicas do Maven Surefire Plugin procuram por classes cujo nome termine com Test, Tests ou TestCase. Quando escrevemos especificações com o Kotest (assim como no Spock), adotamos a convenção de terminar o nome das nossas classes com o sufixo Spec (ex: MessageServiceSpec). Por isso, configuramos o bloco <includes> para incluir **/*Spec.java (lembre-se de que o Surefire inspeciona o bytecode .class compilado mapeando padrões .java):
|
|
Agora podemos executar nossos testes unitários rodando o comando:
|
|
Ao executar esse comando, vemos que o Maven Surefire Plugin descobre o KotestJunitPlatformTestEngine automaticamente, executa a especificação MessageServiceSpec e ignora UnCategorizedSpec:
|
|
Resumo
Nesta aula, aprendemos três pontos essenciais:
- O artefato
io.kotest:kotest-runner-junit5-jvmregistra a engine do Kotest na JUnit Platform, permitindo sua execução transparente sem plugins proprietários obrigatórios. - Compilamos nossas especificações em
src/test/kotlinusando okotlin-maven-plugin. - Configuramos o
maven-surefire-pluginpara incluir classes terminadas com*Spece filtrar a execução pela propriedadekotest.tags.