Тестирование в Kotlin: фреймворки и инструменты для качественного кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Тестирование в Kotlin: фреймворки и инструменты для качественного кода

Kotlin — современный язык программирования, работающий поверх JVM. Благодаря совместимости с Java, для тестирования Kotlin-кода можно использовать классические Java-фреймворки (JUnit, Mockito), а также современные инструменты, написанные специально под Kotlin. В этой статье разберём основные фреймворки, их особенности и приведём практические примеры.

1. JUnit 5 — основа тестирования

JUnit 5 — стандартный фреймворк для модульного тестирования на JVM. Отлично работает с Kotlin благодаря поддержке лямбд, extension-функций и data-классов.

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

class CalculatorTest {
    @Test
    fun `addition should return correct sum`() {
        val result = Calculator().add(2, 3)
        assertEquals(5, result)
    }
}

Особенности JUnit 5 в Kotlin:

  • Имена тестов можно писать в бэктиках с пробелами — читаемость повышается
  • Поддержка параметризованных тестов через @ParameterizedTest
  • Встроенные assertion-функции (assertAll, assertThrows)
  • Легко комбинируется с MockK и Mockito

2. Kotest — фреймворк нового поколения

Kotest (бывший KotlinTest) — мощный фреймворк, написанный на Kotlin с нуля. Предлагает множество стилей описания тестов (StringSpec, BehaviorSpec, FunSpec и другие).

import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe

class StringSpecExample : StringSpec({
    "length should return correct size" {
        "hello".length shouldBe 5
    }
    "startsWith should work" {
        "world".startsWith("wo") shouldBe true
    }
})

Преимущества Kotest:

  • Более 200 встроенных matcher-ов (shouldBe, shouldContain, shouldBeGreaterThan)
  • Поддержка property-based testing (генерация случайных данных)
  • Встроенные дата-провайдеры для табличных тестов
  • Полная интеграция с Gradle и Maven

3. MockK — моки для Kotlin

MockK — библиотека для создания мок-объектов, специально спроектированная для Kotlin. Учитывает null-safety, корутины и extension-функции.

import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import org.junit.jupiter.api.Test

class UserServiceTest {
    @Test
    fun `should call repository`() {
        val repo = mockk<UserRepository>()
        every { repo.findUser(1) } returns User("Alice")

        val service = UserService(repo)
        service.getUserName(1)

        verify { repo.findUser(1) }
    }
}

Ключевые возможности MockK:

  • Поддержка spy (частичное мокирование)
  • Работа с suspend-функциями и корутинами (coEvery, coVerify)
  • Удобные matcher-ы для аргументов (any(), capture())
  • Автоматическое зануление моков после теста

4. Spek — BDD-стиль тестирования

Spek — фреймворк для Behaviour-Driven Development. Позволяет описывать тесты в формате «Given-When-Then».

import org.spekframework.spek2.Spek
import org.spekframework.spek2.style.specification.describe

class CalculatorSpek : Spek({
    describe("Calculator") {
        val calc by memoized { Calculator() }

        context("addition") {
            it("returns sum of two numbers") {
                val result = calc.add(2, 3)
                assertEquals(5, result)
            }
        }
    }
})

Особенности Spek:

  • Читаемая структура тестов для бизнес-спецификаций
  • Поддержка вложенных контекстов и глобальных фикстур
  • Интеграция с JUnit Platform (запуск через Gradle)
  • Работает с Kotlin Multiplatform

5. Дополнительные инструменты

Mockito — классический Java-фреймворк, который также работает с Kotlin. Для лучшей совместимости используйте mockito-kotlin — обёртку с Kotlin-extension функциями.

Ktor Client Mock — утилита для тестирования

Рекомендаций