Настройка стратегии тестирования
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 | | ------------------- |
Генерация сценариев
Параметр |
Значение по умолчанию |
Описание |
|---|---|---|
|
|
Количество генерируемых параллельных сценариев. |
|
|
Количество вызовов для каждого параллельного сценария. |
|
|
Количество потоков в каждом сценарии. |
|
|
Количество операций, вызываемых до параллельной части сценария. |
|
|
Количество операций в каждом потоке параллельной части сценария. |
|
|
Количество операций, вызываемых после параллельной части сценария. |
|
– |
Список пользовательских параллельных сценариев. Пользовательские сценарии выполняются перед случайно сгенерированными. |
Определение пользовательского сценария
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, ...). Операции внутри одного блока выполняются последовательно.
Обнаружение зависшего выполнения
Параметр |
Значение по умолчанию |
Описание |
|---|---|---|
|
|
Время ожидания вызова в миллисекундах, по истечении которого Lincheck сообщает о зависшем выполнении. |
|
|
Количество итераций цикла, после которого Lincheck сообщает о зависшем выполнении. |
|
|
Количество рекурсивных вызовов, после которого Lincheck сообщает о зависшем выполнении. |
Переключение потоков в циклах
Параметр |
Значение по умолчанию |
Описание |
|---|---|---|
|
|
Количество итераций цикла, которое поток может выполнить, прежде чем попытаться переключиться на другой поток. |
Проверка
Параметр |
Значение по умолчанию |
Описание |
|---|---|---|
|
|
Класс-проверяющий, используемый в ходе процесса проверки:
|
|
Как у тестируемой структуры данных. |
Последовательная версия тестируемой структуры данных. Эта структура используется в ходе процесса проверки. |
Гарантии прогресса
Параметр |
Значение по умолчанию |
Описание |
|---|---|---|
|
|
Задайте для этого параметра значение |
Анализ библиотек
Параметр |
Значение по умолчанию |
Описание |
|---|---|---|
|
|
По умолчанию Lincheck не проверяет поведение операций стандартной библиотеки и считает их потокобезопасными. Задайте для этого параметра значение |
|
– |
Определите гарантии для потокобезопасных или не имеющих отношения к анализу методов с помощью параметра |
Определение гарантии
Чтобы определить гарантию, используйте цепочку вызовов построителя: выберите классы, затем методы, а затем тип гарантии.
@Test
fun modelCheckingWithGuaranteesTest() = ModelCheckingOptions()
.addGuarantee(
forClasses("java.util.concurrent.ConcurrentHashMap")
.allMethods()
.treatAsAtomic()
)
.check(this::class)
-
Выберите классы с помощью одной из перегрузок
forClasses:forClasses(vararg fullClassNames: String)— выбирает классы, если их полное имя содержится в строкеfullClassNames.forClasses(vararg classes: KClass<*>)— выбирает классы по ссылке.forClasses(classPredicate: (fullClassName: String) -> Boolean)— выбирает классы с помощью предиката для полных имен классов.
-
Выберите методы, к которым нужно применить гарантию:
methods(methodNames: String)– выбирает методы, если их имя содержится в строкеmethodNames.methods(methodPredicate: (methodName: String) -> Boolean)– выбирает методы с помощью предиката.allMethods()– выбирает все методы выбранных классов.
-
Выберите тип гарантии:
-
treatAsAtomic()— рассматривает каждый метод как атомарную операцию. Lincheck не будет вставлять точки переключения внутри вызова метода, но может добавить их до или после вызова.Используйте
treatAsAtomic()для методов, которые заведомо являются потокобезопасными. -
ignore()— исключает методы из анализа. Lincheck не будет вставлять точки переключения внутри вызовов методов, до или после них.Используйте
ignore()для методов, не имеющих отношения к анализу, например для ведения журналов или отладки.
-
Дальнейшие действия
Узнайте, как настроить генерацию аргументов для операций, используемых в сценариях выполнения Lincheck.
См. также
© 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