Kotest für Kotlin: Das komplette Tutorial mit Praxisbeispielen

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 Kotest: Was ist das und warum braucht man es?

Kotest (früher bekannt als KotlinTest) ist eine leistungsstarke und flexible Bibliothek zum Schreiben von Tests in Kotlin. Sie bietet Entwicklern eine umfangreiche Toolbox für Unit-, Integrations- und Funktionstests. Im Gegensatz zu Standard-JUnit bietet Kotest zahlreiche Teststile (vom klassischen "xUnit" bis zum Behavior-Driven Development), integrierte Property-basierte Tests, leistungsfähige Matcher (Assertions) und eine nahtlose Integration mit populären Frameworks wie Spring Boot, MockK und Arrow.

Warum Kotest? In der modernen Kotlin-Entwicklung ist Testen nicht nur eine Code-Überprüfung, sondern die Grundlage für Qualität. Kotest löst mehrere zentrale Herausforderungen:

  • Stilflexibilität: Sie können Tests im "String Spec", "Fun Spec", "Behavior Spec" und anderen Stilen schreiben und den für Ihr Team passendsten wählen.
  • Mächtige Matcher: Integrierte Prüffunktionen (shouldBe, shouldContain, shouldThrow) machen Testcode lesbar und prägnant.
  • Property-basierte Tests: Generieren Sie Tausende zufälliger Testdaten, um Invarianten Ihres Codes zu prüfen – nicht nur einzelne Werte.
  • Koroutinen-Integration: Kotest arbeitet hervorragend mit Kotlin-Koroutinen und ermöglicht das Testen asynchronen Codes ohne überflüssigen Boilerplate-Code.
  • Erweiterbarkeit: Sie können eigene Matcher, Listener und Erweiterungen erstellen.

Kotest Installation

Kotest wird über Maven Central verteilt. Für die Installation fügen Sie die Abhängigkeiten in Ihre build.gradle.kts (für Gradle) oder pom.xml (für Maven) ein.

Installation mit Gradle (build.gradle.kts)

// Im dependencies-Block
dependencies {
    // Hauptmodul (enthält Basis-Matcher und Stile)
    testImplementation("io.kotest:kotest-runner-junit5:5.9.1")
    // Modul für Property-basierte Tests
    testImplementation("io.kotest:kotest-property:5.9.1")
    // Modul für Framework-Integration (z. B. Spring)
    testImplementation("io.kotest:kotest-extensions-spring:5.9.1")
}

Installation mit Maven (pom.xml)

<dependency>
    <groupId>io.kotest</groupId>
    <artifactId>kotest-runner-junit5</artifactId>
    <version>5.9.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.kotest</groupId>
    <artifactId>kotest-property</artifactId>
    <version>5.9.1</version>
    <scope>test</scope>
</dependency>

Hinweis: Version 5.9.1 ist zum Zeitpunkt der Erstellung dieses Artikels aktuell. Überprüfen Sie immer die neueste Version auf MVNRepository.

Schnellstart mit einem Codebeispiel

Schreiben wir einen einfachen Test für eine Taschenrechner-Klasse im "Fun Spec"-Stil – einem der beliebtesten und intuitivsten Stile.

// Die zu testende Klasse
class Calculator {
    fun add(a: Int, b: Int): Int = a + b
    fun divide(a: Int, b: Int): Int {
        if (b == 0) throw ArithmeticException("Division durch Null")
        return a / b
    }
}

// Die Testklasse
import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldThrow

class CalculatorTest : FunSpec({
    // Initialisierung des Testobjekts
    val calculator = Calculator()

    test("Addition zweier positiver Zahlen") {
        val result = calculator.add(2, 3)
        result shouldBe 5
    }

    test("Division durch Null sollte eine Exception werfen") {
        shouldThrow<ArithmeticException> {
            calculator.divide(10, 0)
        }
    }
})

Dieses Beispiel zeigt die grundlegende Struktur: Wir erstellen eine Klasse, die von Fun erbt.

Empfehlungen