Como funciona um teste integrado em uma pipeline onde existe uma etapa de testes a ser executada ? Sei que com testes unitários ela roda normalmente, agora, quando se tem um teste integrado com containers como ela funciona ?
Como funciona um teste integrado em uma pipeline onde existe uma etapa de testes a ser executada ? Sei que com testes unitários ela roda normalmente, agora, quando se tem um teste integrado com containers como ela funciona ?
Oi Renato! Tudo bem?
Testes integrados em uma pipeline CI/CD podem parecer um pouco complexos no início, mas são extremamente valiosos para garantir que sua aplicação funcione corretamente em diferentes ambientes. Vamos explorar como isso funciona, especialmente quando se utiliza containers.
Como funcionam os testes integrados com containers em uma pipeline CI/CD?
Configuração dos Containers: Antes de mais nada, você precisa configurar os containers que serão utilizados para os testes. Isso inclui definir imagens de banco de dados, serviços de terceiros, etc. Em Kotlin, isso geralmente é feito utilizando bibliotecas como o Testcontainers.
Definição dos Testes: Assim como você faz com testes unitários, você precisa definir quais são os testes de integração. Esses testes geralmente verificam a interação entre diferentes partes da sua aplicação, como a comunicação com o banco de dados.
Execução na Pipeline: Na sua pipeline CI/CD, você terá uma etapa específica para a execução dos testes. Essa etapa geralmente é configurada em um arquivo YAML (como o Jenkinsfile, .gitlab-ci.yml, etc.). Durante essa etapa, os containers são iniciados, os testes são executados e, em seguida, os containers são destruídos.
Detalhes Importantes
No Contexto do Kotlin
Como você mencionou, você está utilizando o Spring com Kotlin. Aqui está um exemplo de como um teste de integração pode ser configurado:
Teste de Integração:
@SpringBootTest
@Testcontainers
class RelatorioIntegrationTest {
@Container
val mysql = MySQLContainer<Nothing>("mysql:5.7").apply {
withDatabaseName("testdb")
withUsername("user")
withPassword("password")
}
@Autowired
lateinit var topicoRepository: TopicoRepository
@Test
fun `deve gerar um relatorio`() {
val topico = TopicoTest.build()
topicoRepository.save(topico)
val relatorio = topicoRepository.relatorio()
assertThat(relatorio).isNotNull
assertThat(relatorio.first()).isExactlyInstanceOf(TopicoPorCategoriaDto::class.java)
}
}
Os testes integrados em uma pipeline CI/CD com containers ajudam a garantir que sua aplicação funcione corretamente em um ambiente de produção simulado. Eles são essenciais para detectar problemas que não seriam encontrados com testes unitários.
Espero ter ajudado e bons estudos!