Spec-Zone.ru › Kotlin 2

Lincheck в проектах Kotlin Multiplatform

Lincheck можно использовать с Kotlin Multiplatform для тестирования кода, предназначенного для JVM. В этой статье вы узнаете, как настроить тесты Lincheck в проекте Kotlin Multiplatform.

Вы:

  • Настроите проект для запуска тестов Lincheck на платформах, использующих JVM.

  • Создадите классы структур данных-счетчиков, общие для всех платформ.

  • Создадите общие для всех платформ тесты счетчиков, а также тесты, предназначенные только для JVM.

  • Запустите тесты.

Настройка проекта

  1. Создайте новый проект Kotlin Multiplatform в IntelliJ IDEA. При создании проекта убедитесь, что:

    • Установлен флажок Include tests.

    • В проекте есть цель на базе JVM (серверная, настольная или Android). Проверить, что код компилируется для JVM, можно, просмотрев файл shared/build.gradle.kts или core/build.gradle.kts:

      kotlin { 
          // ...
      
          jvm()
      
          // ...
      
          // If you have an Android target, the use of JVM is
          // configured in the `androidLibrary` section
          androidLibrary {
              // ...
      
              compilerOptions {
                  jvmTarget = JvmTarget.JVM_11
              }
      
          // ...
      
          }
      }
      

    Проекты Server/Desktop + Android и Server/Desktop + Android + iOS

    В настоящее время Kotlin не поддерживает совместное использование кода между целями JVM и Android. Вы не сможете создавать общие тесты для своих платформ, но по-прежнему сможете тестировать код с помощью Lincheck, используя тесты для конкретных платформ.

    Дополнительные сведения об общей настройке тестов Lincheck см. в статье Начало работы с Lincheck.

  2. Настройте папку для тестов и зависимость Lincheck в соответствии с целевыми платформами проекта:

    • Desktop/Android + iOS

    • Server + iOS, Server + Desktop, Server + Desktop + iOS

Desktop/Android + iOS

Каталог для тестов, предназначенных для конкретной платформы, автоматически создается плагином Kotlin Multiplatform. Например, для настольной цели это shared/src/jvmTest/kotlin.

Добавьте зависимость Lincheck для платформенного набора исходного кода для тестов и зависимость kotlin.test для набора исходного кода commonTest:

    // shared/build.gradle.kts
    kotlin {
        sourceSets {
            commonTest.dependencies {
                implementation(libs.kotlin.test)
            }
            jvmTest {
                implementation("org.jetbrains.lincheck:lincheck:3.7")
            }
        }
    }
    
    // shared/build.gradle.kts
    kotlin {
        sourceSets {
            commonTest.dependencies {
                implementation(libs.kotlin.test)
            }
            getByName("androidHostTest").dependencies {
                implementation("org.jetbrains.lincheck:lincheck:3.7")
            }
        }
    }
    

Server + iOS, Server + Desktop, Server + Desktop + iOS

  1. Создайте каталог core/src/jvmTest/kotlin. Gradle будет запускать тесты в этом каталоге для всех платформ, использующих JVM.

    В проектах с настольной целью также есть каталог shared/src/jvmTest/kotlin, который можно использовать вместо него. Однако рекомендуется размещать код, относящийся как к серверной, так и к настольной целям/iOS, в каталоге core.

    Если у вас есть настольная цель и вы создаете каталог core/src/jvmTest/kotlin, удалите каталог shared/src/jvmTest/kotlin.

  2. Добавьте зависимость Lincheck для набора исходного кода jvmTest и зависимость kotlin.test для набора исходного кода commonTest:

    // core/build.gradle.kts
    kotlin {
        // ...
        sourceSets {
            // ...
            commonTest.dependencies {
                implementation(libs.kotlin.test)
            }
            jvmTest.dependencies {
                implementation("org.jetbrains.lincheck:lincheck:3.7")
            }
        }
    }
    

Создание общих классов

Создайте классы, реализующие структуры данных-счетчики, общие для всех платформ:

  1. Создайте файл UnsafeCounter.kt в каталоге core/src/commonMain или shared/src/commonMain:

    class UnsafeCounter {
        private var value: Int = 0
    
        fun inc() = value++
    
        fun get(): Int = value
    }
    
  2. Создайте файл SafeCounter.kt в том же каталоге:

    import kotlin.concurrent.atomics.AtomicInt
    import kotlin.concurrent.atomics.ExperimentalAtomicApi
    
    @OptIn(ExperimentalAtomicApi::class)
    class SafeCounter {
        private var value = AtomicInt(0)
    
        fun inc() = value.addAndFetch(1)
    
        fun get(): Int = value.load()
    }

Написание общих тестов

Напишите тесты, которые запускаются для всех платформ:

  1. Создайте файл UnsafeCounterTest.kt в каталоге core/src/commonTest или shared/src/commonTest:

    import kotlin.test.Test
    import kotlin.test.assertEquals
    
    class UnsafeCounterTest {
        @Test
        fun testIncrement() {
            val counter = UnsafeCounter()
            assertEquals(0, counter.get(), "Initial value should be 0")
            counter.inc()
            assertEquals(1, counter.get(), "Value after one increment should be 1")
        }
    }
  2. Создайте файл SafeCounterTest.kt в том же каталоге:

    import kotlin.test.Test
    import kotlin.test.assertEquals
    
    class SafeCounterTest {
        @Test
        fun testIncrement() {
            val counter = SafeCounter()
            assertEquals(0, counter.get(), "Initial value should be 0")
            counter.inc()
            assertEquals(1, counter.get(), "Value after one increment should be 1")
        }
    }

Написание тестов для JVM

Напишите тесты, которые запускаются только на платформах, предназначенных для JVM:

  1. Создайте файл UnsafeCounterConcurrentTest.kt в каталоге тестов для тестов, предназначенных только для JVM:

    • Android + iOS — shared/src/androidHostTest/kotlin

    • Desktop + iOS — shared/src/jvmTest/kotlin

    • Любой проект с серверной целью — core/src/jvmTest/kotlin

    import org.jetbrains.lincheck.datastructures.ModelCheckingOptions
    import org.jetbrains.lincheck.datastructures.Operation
    import kotlin.test.Test
    
    class UnsafeCounterConcurrentTest {
        private val c = UnsafeCounter()
    
        @Operation
        fun inc() = c.inc()
    
        @Operation
        fun get() = c.get()
    
        @Test
        fun modelCheckingTest() {
            ModelCheckingOptions().check(this::class)
        }
    }
  2. Создайте файл SafeCounterConcurrentTest.kt в том же каталоге:

    import org.jetbrains.lincheck.datastructures.ModelCheckingOptions
    import org.jetbrains.lincheck.datastructures.Operation
    import kotlin.test.Test
    
    class SafeCounterConcurrentTest {
        private val c = SafeCounter()
    
        @Operation
        fun inc() = c.inc()
    
        @Operation
        fun get() = c.get()
    
        @Test
        fun modelCheckingTest() {
            ModelCheckingOptions().check(this::class)
        }
    }

Запуск тестов

На этом этапе в проекте должны быть общая реализация структур данных-счетчиков, общие тесты и тесты счетчиков, предназначенные только для JVM. Структура каталогов проекта должна выглядеть так:

A screenshot of the project file structure for the Android and iOS platforms.
A screenshot of the project file structure for the server and iOS platforms.
A screenshot of the project file structure for the desktop and iOS platforms.
A screenshot of the project file structure for the server, desktop, and iOS platforms.

Можно запускать отдельные тесты из контекстного меню, с помощью сочетания клавиш или запустив задачу Gradle. Если запустить задачу Gradle allTests, будут выполнены все тесты проекта с помощью соответствующего средства запуска тестов:

A screenshot of the Gradle plugin in IntelliJ IDEA with the Tasks | Verification | allTests task highlighted.

Например, тесты, предназначенные только для JVM, выполняются с помощью средства запуска тестов JVM:

A screenshot of the test execution report. The Lincheck tests are marked with a jvm tag.

Поддержка платформ, отличных от JVM

Маловероятно, что в будущем Lincheck будет поддерживать другие платформы.

Lincheck в значительной степени полагается на JVM для манипуляций с байт-кодом, что затрудняет реализацию модельной проверки на других платформах. Кроме того, одновременное применение модельной проверки для нескольких платформ не дает существенных преимуществ, поскольку Lincheck тестирует код в детерминированной изолированной среде, и результаты тестов не зависят от платформы.

См. также

  • Узнайте больше о Kotlin Multiplatform

  • Ознакомьтесь с документацией Lincheck

15 августа 2026 г.
Модельная проверкаСправочники API

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/lincheck-kmp.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API