Testen in Kotlin: Frameworks und Werkzeuge für qualitativen Code

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

Testen in Kotlin: vollständiger Überblick über Frameworks und Werkzeuge



Kotlin — eine Sprache, die rasant an Popularität in der Backend-Entwicklung (Spring Boot, Ktor) und Android gewinnt. Eine leistungsstarke Sprache erfordert jedoch angemessene Testwerkzeuge. In diesem Artikel analysieren wir die wichtigsten Frameworks und Bibliotheken zum Testen von Kotlin-Anwendungen: vom klassischen JUnit5 bis zu modernen Kotest und MockK. Das Material ist sowohl für Anfänger als auch für erfahrene Entwickler nützlich, die von Java wechseln.



1. JUnit5 — die Grundlage des modernen Testens



JUnit5 (Jupiter) ist der De-facto-Standard für Modultests in Java/Kotlin. In Kotlin wird es mit kleinen, aber wichtigen Besonderheiten verwendet.



  • Unterstützung von Lambdas und Funktionen höherer Ordnung — Tests können prägnanter geschrieben werden.
  • Annotationen — @Test, @BeforeEach, @AfterAll funktionieren wie in Java.
  • Assumptions und Assertions — integrierte Überprüfungen.


Beispiel eines einfachen Tests mit JUnit5 und Kotlin:



import org.junit.jupiter.api.Assertions.assertEqualsimport org.junit.jupiter.api.Test

class CalculatorTest {

private val calculator = Calculator()

@Test fun `addition of two numbers should return correct sum`() { val result = calculator.add(2, 3) assertEquals(5, result) }

@Test fun `should throw exception when dividing by zero`() { assertThrows<IllegalArgumentException> { calculator.divide(10, 0) } }}


Wichtig: Kotlin erlaubt die Verwendung von Leerzeichen in Namen von Testfunktionen (Backticks), was die Testnamen in natürlicher Sprache lesbar macht.



2. Kotest — natives Kotlin-Framework



Kotest (früher KotlinTest) ist das umfassendste und flexibelste Framework, das vollständig in Kotlin geschrieben ist. Es bietet mehrere Stile zum Schreiben von Tests (String Spec, Specification, Behavior) und leistungsstarke integrierte Matcher.



Wichtige Funktionen:

  • Property-based Testing — automatische Generierung von Testdaten.
  • Data-driven Tests — mit Tabellen von Eingabedaten.
  • Leistungsstarke Assertion-Matcher — shouldBe, shouldContain, shouldThrow u.a.
  • Unterstützung von Coroutines — integrierter testCoroutineScope.


Beispiel eines Tests im "String Spec"-Stil:



import io.kotest.core.spec.style.StringSpecimport io.kotest.matchers.shouldBeimport io.kotest.matchers.shouldThrow

class UserServiceTest : StringSpec({

val service = UserService()

"should return user by id" { val user = service.getUser(1) user.name shouldBe "Alice" }

"should throw exception for invalid id" { shouldThrow<NoSuchElementException> { service.getUser(-1) } }})


Property-based Testing in Kotest:



import io.kotest.property.forAllimport io.kotest.property.arbitrary.int

class MathPropertiesTest : StringSpec({ "addition is commutative" { forAll<Int, Int> { a, b -> (a + b) == (b + a) } }})


3. MockK — Mocks für Kotlin



Im Gegensatz zu Mockito (das ebenfalls verwendet werden kann) ist MockK vollständig an die Besonderheiten von Kotlin angepasst: Es unterstützt sealed classes, object, extension functions und coroutines.



Hauptfunktionen:

  • Prägnantes DSL zum Erstellen von Mocks und Stubs.
  • Unterstützung von Relax-Mocks (nicht verifizierte Aufrufe).
  • Verifizierung der Aufrufreihenfolge und der Anzahl der Aufrufe.
  • Mocks für suspend-Funktionen.

Empfehlungen