Spec-Zone.ru › Kotlin 2

Настройка стратегии тестирования

Lincheck поддерживает различные параметры настройки стратегий тестирования, включая генерацию сценариев, обнаружение зависшего выполнения, проверку и другие.

Как включить параметры

Чтобы включить параметр стратегии тестирования, задайте его в классе стратегии:

    @Test
    fun testWithIterations() = ModelCheckingOptions()
        .iterations(100) // Specify the number of generated scenarios
        .check(this::class)

Минимизация сценариев

По умолчанию Lincheck пытается минимизировать сценарий, завершившийся с ошибкой, удаляя операции, которые не меняют поведение теста.

Задайте для параметра minimizeFailedScenario значение false, чтобы увидеть полный сценарий, завершившийся с ошибкой.

| ------------------------- |
|    Thread 1    | Thread 2 |
| --------------------------|
| inc(): 1       |          |
| get(): 1       |          |
| get(): 1       |          |
| --------------------------|
| inc(): 4 [0,1] | inc(): 2 |
| get(): 4 [1,1] | inc(): 4 |
| get(): 4 [2,1] | get(): 4 |
| --------------------------|
| get(): 4       |          |
| get(): 4       |          |
| get(): 4       |          |
| --------------------------|
| ------------------- |
| Thread 1 | Thread 2 |
| ------------------- |
| inc(): 1 | inc(): 1 |
| ------------------- |

Генерация сценариев

Параметр

Значение по умолчанию

Описание

iterations

100

Количество генерируемых параллельных сценариев.

invocationsPerIteration

10_000

Количество вызовов для каждого параллельного сценария.

threads

2

Количество потоков в каждом сценарии.

actorsBefore

5

Количество операций, вызываемых до параллельной части сценария.

actorsPerThread

5

Количество операций в каждом потоке параллельной части сценария.

actorsAfter

5

Количество операций, вызываемых после параллельной части сценария.

customScenarios

–

Список пользовательских параллельных сценариев. Пользовательские сценарии выполняются перед случайно сгенерированными.

Определение пользовательского сценария

Lincheck использует предметно-ориентированный язык для определения пользовательских сценариев:

    @Test
    fun test() = StressOptions()
        .addCustomScenario {
            initial {
                actor(Structure::noArgsOp)
            }
            parallel {
                thread {
                    actor(Structure::argsOp, 1)
                    actor(Structure::argsOp, 2)
                }
                thread {
                    actor(Structure::argsOp, 3)
                }
            }
            post {
                actor(Structure::noArgsOp)
            }
        }
        // Report the scenarios even if the test has not failed
        // The custom scenario should be first in the list of scenarios
        .logLevel(LoggingLevel.INFO)
        .check(this::class)

Каждый сценарий состоит из трех необязательных секций:

  • initial – операции, выполняемые до параллельной части.

  • parallel – определения потоков. Потоки определяются с помощью блока thread. Параллельная секция может содержать несколько блоков thread.

  • post – операции, выполняемые после параллельной части.

Операции задаются с помощью функции actor(function, arg1, arg2, ...). Операции внутри одного блока выполняются последовательно.

Обнаружение зависшего выполнения

Параметр

Значение по умолчанию

Описание

timeoutMs

3000

Время ожидания вызова в миллисекундах, по истечении которого Lincheck сообщает о зависшем выполнении.

loopBound

50

Количество итераций цикла, после которого Lincheck сообщает о зависшем выполнении.
Увеличьте значение loopBound, если Lincheck ошибочно сообщает о зависшем выполнении при длительных циклах.

Этот параметр можно использовать только при проверке модели.

recursionBound

20

Количество рекурсивных вызовов, после которого Lincheck сообщает о зависшем выполнении.
Значение loopIterationsBeforeThreadSwitch должно быть меньше loopBound.

Этот параметр можно использовать только при проверке модели.

Переключение потоков в циклах

Параметр

Значение по умолчанию

Описание

loopIterationsBeforeThreadSwitch

10

Количество итераций цикла, которое поток может выполнить, прежде чем попытаться переключиться на другой поток.
Значение loopIterationsBeforeThreadSwitch должно быть меньше loopBound.

Этот параметр можно использовать только при проверке модели.

Проверка

Параметр

Значение по умолчанию

Описание

verifierClass

LinearizabilityVerifier

Класс-проверяющий, используемый в ходе процесса проверки:

  • LinearizabilityVerifier

  • SerializabilityVerifier

  • QuiescentConsistencyVerifier

sequentialSpecification

Как у тестируемой структуры данных.

Последовательная версия тестируемой структуры данных. Эта структура используется в ходе процесса проверки.

Гарантии прогресса

Параметр

Значение по умолчанию

Описание

checkObstructionFreedom

false

Задайте для этого параметра значение true, чтобы проверить гарантию отсутствия блокировок при конкуренции для операций структуры данных.

Этот параметр можно использовать только при проверке модели.

Анализ библиотек

Параметр

Значение по умолчанию

Описание

stdLibAnalysisEnabled

false

По умолчанию Lincheck не проверяет поведение операций стандартной библиотеки и считает их потокобезопасными. Задайте для этого параметра значение true, чтобы включить анализ функций и классов стандартной библиотеки.

Этот параметр можно использовать только при проверке модели.

addGuarantee

–

Определите гарантии для потокобезопасных или не имеющих отношения к анализу методов с помощью параметра addGuarantee, чтобы исключить их из проверки модели.

Этот параметр можно использовать только при проверке модели.

Определение гарантии

Чтобы определить гарантию, используйте цепочку вызовов построителя: выберите классы, затем методы, а затем тип гарантии.

    @Test
    fun modelCheckingWithGuaranteesTest() = ModelCheckingOptions()
        .addGuarantee(
            forClasses("java.util.concurrent.ConcurrentHashMap")
                .allMethods()
                .treatAsAtomic()
        )
        .check(this::class)
  1. Выберите классы с помощью одной из перегрузок forClasses:

    • forClasses(vararg fullClassNames: String) — выбирает классы, если их полное имя содержится в строке fullClassNames.

    • forClasses(vararg classes: KClass<*>) — выбирает классы по ссылке.

    • forClasses(classPredicate: (fullClassName: String) -> Boolean) — выбирает классы с помощью предиката для полных имен классов.

  2. Выберите методы, к которым нужно применить гарантию:

    • methods(methodNames: String) – выбирает методы, если их имя содержится в строке methodNames.

    • methods(methodPredicate: (methodName: String) -> Boolean) – выбирает методы с помощью предиката.

    • allMethods() – выбирает все методы выбранных классов.

  3. Выберите тип гарантии:

    • treatAsAtomic() — рассматривает каждый метод как атомарную операцию. Lincheck не будет вставлять точки переключения внутри вызова метода, но может добавить их до или после вызова.

      Используйте treatAsAtomic() для методов, которые заведомо являются потокобезопасными.

    • ignore() — исключает методы из анализа. Lincheck не будет вставлять точки переключения внутри вызовов методов, до или после них.

      Если метод использует внутри себя примитивы синхронизации (например, блоки synchronized), его игнорирование может привести к взаимной блокировке в Lincheck.

      Используйте ignore() для методов, не имеющих отношения к анализу, например для ведения журналов или отладки.

Дальнейшие действия

Узнайте, как настроить генерацию аргументов для операций, используемых в сценариях выполнения Lincheck.

См. также

  • Настройка параметров выполнения операций

  • Проверка гарантий неблокирующего прогресса

  • Определение последовательной спецификации алгоритма

15 августа 2026 г.
Стратегии тестированияОграничения генерации аргументов

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

Spec-Zone.ru

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