Tests en Kotlin : aperçu complet des frameworks et outils
Kotlin — un langage qui gagne rapidement en popularité dans le développement backend (Spring Boot, Ktor) et Android. Cependant, un langage puissant nécessite des outils de test adéquats. Dans cet article, nous analyserons les frameworks et bibliothèques clés pour tester les applications Kotlin : du classique JUnit5 aux modernes Kotest et MockK. Ce contenu sera utile aussi bien aux débutants qu'aux développeurs expérimentés venant de Java.
1. JUnit5 — la base des tests modernes
JUnit5 (Jupiter) — le standard de facto pour les tests unitaires en Java/Kotlin. En Kotlin, il est utilisé avec des particularités petites mais importantes.
- Prise en charge des lambdas et des fonctions d'ordre supérieur — les tests peuvent être écrits de manière plus concise.
- Annotations —
@Test,@BeforeEach,@AfterAllfonctionnent comme en Java. - Assumptions et Assertions — vérifications intégrées.
Exemple d'un test simple avec JUnit5 et 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) } }}Important : Kotlin permet d'utiliser des espaces dans les noms des fonctions de test (backticks), ce qui rend les noms de tests lisibles en langage naturel.
2. Kotest — framework natif Kotlin
Kotest (anciennement KotlinTest) — est le framework le plus complet et flexible, entièrement écrit en Kotlin. Il propose plusieurs styles d'écriture de tests (string spec, specification, behavior-driven) et des matchers intégrés puissants.
Fonctionnalités clés :
- Property-based testing — génération automatique de données de test.
- Tests data-driven — avec des tableaux de données d'entrée.
- Matchers d'assertion puissants —
shouldBe,shouldContain,shouldThrow, etc. - Prise en charge des Coroutines —
testCoroutineScopeintégré.
Exemple de test en style "String Spec" :
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 dans 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 pour Kotlin
Contrairement à Mockito (qui peut également être utilisé), MockK est entièrement adapté aux spécificités de Kotlin : il prend en charge les sealed classes, object, extension functions et coroutines.
Fonctionnalités principales :
- DSL concis pour créer des mocks et des stubs.
- Prise en charge des mocks relax (appels non vérifiés).
- Vérification de l'ordre des appels et du nombre d'appels.
- Mocks pour les fonctions
suspend.
Aussi dans la bibliothèque
Génération de rapports PDF en C++ avec libharu et PoDoFo
Planificateur de tâches sur Node.js : node-schedule et node-cron
Nodemon pour JavaScript (Node.js) : guide complet avec exemples
Surveillance des applications Swift : bibliothèques et outils pour iOS/macOS