Модульное тестирование для безопасной публикации
-
03-07-2019 - |
Вопрос
Как бы вы протестировали гарантию безопасной публикации на Java?
Если быть конкретным:
У меня есть интерфейс Cache, в котором есть метод getOrLoad (ключ K, загрузчик ObjectLoader).Дело в том, что если Cache не может найти объект по данному ключу, он должен загрузить его из экземпляра ObjectLoader.Однако кэш должен гарантировать, что процесс загрузки объекта из загрузчика и помещения его в кэш представляет собой безопасную публикацию.
Сейчас я пишу общий junit-тест для этого интерфейса Cache, и мне интересно, как мне проверить, соответствуют ли реализации Cache этой гарантии безопасной публикации.
Есть идеи?Фактический код находится в модуле test-systest в файле репозиторий кода на случай, если вы захотите покопаться в реальных файлах.
Решение 2
Я обнаружил Презентация JavaOne Билл Пью, Брайан Гетц и Клифф Нажмите на тему тестирования параллельного кода.Они предложили такой подход, и я думаю, что это лучшее, что я слышал:
Ряд производителей создают объекты с сохранением состояния и потокобезопасные объекты с реализацией hashCode, зависящей от состояния.Поскольку объекты передаются через предполагаемую точку синхронизации, хеш-коды суммируются (локально в потоке).Аналогично, потребители на другой стороне ворот суммируют хеш-коды.
В конце теста мы суммируем все результаты для производителей и потребителей соответственно.Если две суммы равны, тест пройден.
Мы также могли бы использовать XOR в качестве альтернативы суммированию.Фактически подойдет любая коммутативная операция.Просто имейте в виду, что сама тестовая обвязка не должна вводить никакой дополнительной синхронизации.
Другие советы
Может быть, вы можете использовать Конкурс чтобы хотя бы дать вам немного больше уверенности в правильности вашего кода.
Вам потребуется реализовать пару тестов, которые одновременно запускают несколько потоков.Затем ConTest увеличит вероятность того, что ошибка параллелизма действительно будет обнаружена путем инструментирования байт-кода (добавления эвристически контролируемых инструкций условного сна и выхода).
На самом деле получить ошибку из-за небезопасной публикации очень сложно (если кто знает как, подскажите).Статический анализ — лучший выбор для автоматизированного решения.Я бы придерживался проверки кода и не беспокоился об этом излишне.