Configurando a Task e2eTest para Kotest no Gradle 9
Depois de concluirmos esta aula, nós:
- Saberemos como configurar os diretórios de código-fonte e de recursos dos nossos testes End-to-End no Gradle 9.
- Saberemos iniciar nossa aplicação web antes da execução dos nossos testes End-to-End e pará-la após a conclusão dos testes.
- Compreenderemos como compilar e executar testes End-to-End que utilizam o Kotest Framework e Playwright no Gradle 9.
Esta aula assume que:
- Você está familiarizado com tags e categorias do JUnit Platform / Kotest.
- Você sabe executar testes de integração que utilizam o Kotest Framework com o Gradle 9.
- Você está familiarizado com o Kotest Framework.
- Você sabe criar um projeto Gradle que executa testes End-to-End com JUnit 6.
Os Requisitos do Nosso Build Gradle
Os requisitos do nosso build Gradle 9 (build.gradle.kts) são:
- Nossos testes End-to-End devem possuir um diretório de código-fonte separado. O diretório
src/end-to-end-test/kotlindeve conter o código-fonte das nossas especificações End-to-End. - Nossos testes End-to-End devem possuir um diretório de recursos separado. O diretório
src/end-to-end-test/resourcesdeve conter os recursos dos nossos testes End-to-End. - Devemos ser capazes de executar apenas os testes unitários (
test), apenas os testes de integração (integrationTest), apenas os testes End-to-End (endToEndTest) ou todos os testes (check/build). - Se um teste End-to-End falhar, nosso build também deve falhar.
- Testes unitários, de integração e End-to-End devem possuir diretórios de relatórios HTML separados (
build/reports/tests/test,build/reports/tests/integrationTestebuild/reports/tests/endToEndTest).
A seguir, descobriremos como podemos configurar os diretórios de código-fonte e de recursos dos nossos testes End-to-End no Gradle 9.
Configurando os Diretórios de Código-Fonte e Recursos dos Nossos Testes End-to-End
No Gradle moderno (Gradle 9 com Kotlin DSL), configuramos os diretórios de código-fonte e recursos dos nossos testes End-to-End utilizando o plugin nativo jvm-test-suite (que substituiu o antigo plugin de terceiros org.unbroken-dome.test-sets).
Como já aplicamos este plugin para configurar a suíte integrationTest, podemos configurar os diretórios de código-fonte e recursos dos nossos testes End-to-End registrando uma nova suíte chamada endToEndTest no bloco testing.suites. Quando adicionamos esta suíte ao nosso build Gradle, garantimos que o diretório raiz do source set criado aponte para src/end-to-end-test.
Após termos adicionado a nova suíte de testes ao nosso build.gradle.kts, ele fica assim:
|
|
Esta configuração adiciona um source set chamado endToEndTest ao nosso build e configura seus diretórios raiz: o diretório src/end-to-end-test/kotlin contém o código-fonte das nossas especificações End-to-End e o diretório src/end-to-end-test/resources contém os recursos dos nossos testes End-to-End. Além disso, o plugin jvm-test-suite já configura automaticamente diretórios de relatórios HTML isolados para cada task de teste em build/reports/tests/<taskName>.
Vamos avançar e descobrir como podemos configurar a task que executa nossos testes End-to-End.
Configurando a Task que Executa Nossos Testes End-to-End
Quando adicionamos a suíte endToEndTest ao nosso build, o plugin jvm-test-suite criou automaticamente uma task chamada endToEndTest que executa nossos testes End-to-End. Contudo, para atender a todos os requisitos do nosso build Gradle, precisamos fazer algumas alterações em sua configuração seguindo estes passos:
Primeiro, temos que garantir que os testes de integração sejam executados antes dos testes End-to-End e que os testes End-to-End sejam executados quando invocarmos a task check (ou build). Podemos fazer isso seguindo estes passos:
- Garantir que nossos testes End-to-End sejam executados como dependência da task
check, fazendo o build falhar caso um teste End-to-End falhe. - Garantir que nossos testes de integração (
integrationTest) sejam executados antes dos nossos testes End-to-End (shouldRunAfter(tasks.named("integrationTest"))). Isso garante que nossos testes de integração sejam executados mesmo que nossos testes End-to-End falhem.
Segundo, temos que configurar a task endToEndTest seguindo estes passos:
- Garantir que nossos testes End-to-End sejam executados pelo JUnit Platform (
useJUnitPlatform). - Configurar o JUnit Platform para executar apenas as especificações que pertencem à tag/categoria
EndToEndTest(includeTags("endToEndTest")). - Garantir que o Gradle imprima as informações escritas em
System.outouSystem.errquando nossos testes End-to-End forem executados (testLogging { showStandardStreams = true }).
Após termos configurado as tasks test, integrationTest e endToEndTest, nosso arquivo build.gradle.kts fica assim:
|
|
Vamos avançar e entender como iniciamos e paramos nossa aplicação web.
Iniciando e Parando Nossa Aplicação Web
Antes de podermos executar nossos testes End-to-End, temos que iniciar nossa aplicação web antes da execução das especificações e pará-la após a conclusão.
- Em aplicações Spring Boot 4: Podemos iniciar e parar nossa aplicação diretamente através do suporte de testes do Spring Boot (
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)ouDEFINED_PORT) em conjunto com oSpringExtensiondo Kotest e o Testcontainers! Isso elimina a necessidade de plugins externos de container servlet como o Gretty nobuild.gradle.kts, tornando o build mais rápido, autocontido e livre de conflitos de portas. - Em aplicações web legadas sem Spring Boot: Caso a aplicação seja empacotada como WAR clássico sem Spring Boot, um plugin de container servlet pode iniciar o servidor antes da task
endToEndTeste pará-lo ao final.
Agora estamos prontos para executar nossos testes End-to-End. Vamos descobrir como podemos fazer isso.
Executando Testes End-to-End
Podemos executar nossos testes End-to-End utilizando uma das seguintes opções:
Primeiro, podemos executar apenas os nossos testes End-to-End utilizando o comando:
|
|
Quando executamos este comando no terminal, vemos uma saída semelhante a esta:
|
|
Esta saída nos revela que:
- O ambiente da aplicação web (e o banco PostgreSQL via Testcontainers) é iniciado para a suíte
endToEndTest. - O Gradle executa apenas nossas especificações End-to-End quando invocamos a task
endToEndTest. - O servidor web e o navegador Playwright são encerrados automaticamente após a conclusão da task.
Segundo, se quisermos executar todos os testes na ordem correta (unitários -> integração -> End-to-End), podemos usar uma destas duas opções:
- Executar explicitamente as três tasks:
1./gradlew clean test integrationTest endToEndTest - Executar o build completo do projeto:
1./gradlew clean build
Quando executamos todos os testes, vemos as três tasks executando em sequência ordenada:
|
|
Vamos resumir o que aprendemos nesta aula.
Resumo
Esta aula nos ensinou três coisas:
- Podemos configurar diretórios de código-fonte (
src/end-to-end-test/kotlin) e recursos (src/end-to-end-test/resources) isolados no Gradle 9 usando o plugin nativojvm-test-suite. - Se estivermos usando o Spring Boot 4, podemos iniciar e parar nossa aplicação web usando seu próprio suporte de testes (
@SpringBootTest). - Podemos executar tanto testes de integração quanto testes End-to-End de forma ordenada e com relatórios HTML separados usando as tasks
integrationTesteendToEndTest.