Стратегии тестирования
Lincheck предоставляет две стратегии тестирования параллельных структур данных: проверку модели и стресс-тестирование.
В этой статье вы узнаете, чем отличаются эти стратегии и что следует учитывать при выборе стратегии тестирования.
Проверка модели
При проверке модели Lincheck моделирует возможные чередования потоков и сообщает о тех из них, которые приводят к некорректному поведению.
Чтобы тестировать структуру данных с помощью проверки модели, объявите тестовую функцию с помощью ModelCheckingOptions():
@Test
fun test() = ModelCheckingOptions().check(this::class)
При использовании стратегии проверки модели Lincheck вставляет явные инструкции переключения потоков в точках доступа к общей памяти (read и write) или в точках синхронизации, например при захвате и освобождении блокировки, park/unpark, wait/notify и других.
Контроль переключения потоков позволяет Lincheck:
Детерминированно исследовать различные возможные расписания выполнения программы.
Предоставлять подробные трассировки выполнения.
В настоящее время для проверки модели Lincheck предполагает, что при выполнении используется модель последовательной согласованности памяти. Это означает, что Lincheck не моделирует и не может обнаружить ошибки, связанные с переупорядочиванием инструкций, поведением кэша памяти и другими подобными эффектами, возникающими при ослабленной модели памяти Java.
Стресс-тестирование
При стресс-тестировании Lincheck выполняет каждый сценарий несколько раз, чтобы повысить вероятность обнаружения ошибки.
Чтобы использовать стресс-тестирование, объявите тестовую функцию с помощью StressOptions():
@Test
fun stressTest() = StressOptions().check(this::class)
В отличие от проверки модели, Lincheck не контролирует и не отслеживает переключения потоков. Благодаря этому стресс-тестирование выполняется быстрее и Lincheck не требуется делать какие-либо предположения о модели памяти. Однако при стресс-тестировании тесты нельзя воспроизвести, а 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.html