Testes em Kotlin: unit, integration, e2e — guia completo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução ao teste em Kotlin: de testes unitários a end-to-end

Teste é uma parte essencial do desenvolvimento de software confiável. No ecossistema Kotlin, que é amplamente utilizado para desenvolvimento Android, backend com Ktor e projetos multiplataforma, existe um conjunto poderoso de ferramentas para todos os níveis de teste. Neste artigo, abordaremos três níveis principais: testes unitários, testes de integração e testes end-to-end (e2e). Você aprenderá como eles diferem, quando aplicá-los e como escrever testes eficazes em Kotlin com exemplos de código.



Teste unitário em Kotlin: a base da confiabilidade

Testes unitários verificam o funcionamento de componentes individuais (funções, classes) de forma isolada. Em Kotlin, o padrão de facto é o framework JUnit 5 em conjunto com a biblioteca de mocks MockK.



Exemplo de teste unitário com JUnit 5 e MockK

Vamos considerar um serviço simples para cálculo de desconto:

class DiscountService(private val userRepository: UserRepository) {    fun calculateDiscount(userId: String, amount: Double): Double {        val user = userRepository.findById(userId) ?: return amount        return if (user.isPremium) amount * 0.9 else amount    }}

Teste para este serviço:

import io.mockk.everyimport io.mockk.mockkimport org.junit.jupiter.api.Testimport kotlin.test.assertEquals

class DiscountServiceTest {

@Test fun `should apply 10% discount for premium user`() { // Arrange val userRepo = mockk<UserRepository>() every { userRepo.findById("123") } returns User("123", isPremium = true) val service = DiscountService(userRepo)

// Act val result = service.calculateDiscount("123", 100.0)

// Assert assertEquals(90.0, result) }

@Test fun `should not apply discount for regular user`() { val userRepo = mockk<UserRepository>() every { userRepo.findById("456") } returns User("456", isPremium = false) val service = DiscountService(userRepo)

val result = service.calculateDiscount("456", 100.0)

assertEquals(100.0, result) }}

Pontos-chave:

  • Use mockk{} para criar mocks.
  • O bloco every { ... } returns ... define o comportamento do mock.
  • A estrutura Arrange-Act-Assert torna os testes legíveis.
  • Testes unitários devem ser executados rapidamente e não depender de recursos externos.


Teste de integração: verificando a interação entre componentes

Testes de integração verificam como vários módulos funcionam juntos — por exemplo, um serviço com um banco de dados real ou uma API externa. Para Kotlin, são populares Testcontainers (para contêineres Docker) e Spring Boot Test (para backend).



Exemplo de teste de integração com Testcontainers e Ktor

Suponha que temos uma aplicação Ktor com PostgreSQL:

class UserRepository(private val database: Database) {    suspend fun findById(id: String): User? {        return database.query("SELECT * FROM users WHERE id = ?", id).singleOrNull { row ->            User(row.string("id"), row.boolean("is_premium"))        }    }}

Teste de integração com Testcontainers:

import io.kotest.core.spec.style.StringSpecimport io.kotest.matchers.shouldBeimport org.testcontainers.containers.PostgreSQLContainerimport org.testcontainers.junit.jupiter.Containerimport org.testcontainers.junit.jupiter.Testcontainers

@Testcontainersclass UserRepositoryIntegrationTest : StringSpec({

@Container val postgres = PostgreSQLContainer<Nothing>("postgres:15").apply { withDatabaseName("testdb") withUsername("test") withPassword("test") }

"should

Blogs

Book Recommendations