Testen in Kotlin: Unit, Integration, E2E – vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung in das Testen mit Kotlin: Von Unit- bis End-to-End-Tests

Eine qualitativ hochwertige Codebasis ist ohne automatisierte Tests nicht möglich. Kotlin als moderne Sprache für die JVM bietet Entwicklern ein reichhaltiges Toolkit zur Erstellung zuverlässiger Tests. In diesem Artikel betrachten wir drei Ebenen der Testpyramide in Bezug auf Kotlin: Unit (Modultests), Integration (Integrationstests) und e2e (End-to-End-Tests). Sie erfahren, wie Sie effektive Tests in Kotlin mit beliebten Frameworks wie JUnit 5, MockK, Ktor Client und Selenium schreiben.



1. Unit-Testing in Kotlin: Grundlage der Stabilität

Unit-Tests überprüfen die Arbeit einzelner Funktionen, Klassen oder Methoden isoliert von externen Abhängigkeiten. In Kotlin wird dafür am häufigsten JUnit 5 in Kombination mit der Mock-Bibliothek MockK verwendet.



1.1. Projekteinrichtung

Fügen Sie die Abhängigkeiten in die Datei build.gradle.kts ein:

dependencies {    testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")    testImplementation("io.mockk:mockk:1.13.8")}


1.2. Beispiel eines Unit-Tests mit MockK

Angenommen, wir haben einen Service UserService, der von einem Repository abhängt:

class UserService(private val repository: UserRepository) {    fun getUserName(id: Long): String {        val user = repository.findById(id)        return user?.name ?: "Unknown"    }}

Test mit MockK:

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

class UserServiceTest { @Test fun `return userName when user exists`() { val mockRepo = mockk<UserRepository>() every { mockRepo.findById(1L) } returns User(1L, "Alice") val service = UserService(mockRepo)

val result = service.getUserName(1L)

assertEquals("Alice", result) }}


1.3. Best Practices für Unit-Tests

  • Isolieren Sie Abhängigkeiten — verwenden Sie Mocks für alle externen Aufrufe (Datenbanken, APIs).
  • Testen Sie Grenzfälle: null, leere Zeichenketten, negative Zahlen.
  • Verwenden Sie aussagekräftige Testnamen — sie sollten das Szenario und das erwartete Ergebnis beschreiben.
  • Befolgen Sie das AAA-Prinzip: Arrange (Vorbereitung), Act (Aktion), Assert (Überprüfung).


2. Integrationstests in Kotlin: Überprüfung der Interaktion

Integrationstests prüfen, wie mehrere Komponenten des Systems zusammenarbeiten. In Kotlin kann dies das Testen einer REST-API mit Ktor Client oder die Überprüfung der Arbeit mit einer Datenbank über Exposed sein.



2.1. Testen einer REST-API mit Ktor

Wir erstellen einen einfachen Server mit Ktor und testen ihn:

// Serverfun Application.module() {    routing {        get("/hello") {            call.respondText("Hello, Kotlin!")        }    }}

// Testclass ApiTest { @Test fun `test hello endpoint`() = testApplication { application { module() } val response = client.get("/hello") assertEquals(HttpStatusCode.OK, response.status) assertEquals("Hello, Kotlin!", response.bodyAsText()) }}


2.2. Arbeiten mit einer Testdatenbank

Für Integrationstests mit einer Datenbank verwenden Sie H2 (im Speicher) oder Testcontainers für PostgreSQL:

@Testfun `test user creation`() {    withTestDatabase {        val user = User.new {            name = "Bob"            email = "bob@test.com"        }        assertEquals("Bob", user.name)        assertNotNull(user.id)    }}

private fun withTestDatabase(block: () -> Unit) { Database.connect("jdbc:h2:mem:

Blogs

Buchempfehlungen