Модульное тестирование для безопасной публикации

StackOverflow https://stackoverflow.com/questions/201078

Вопрос

Как бы вы протестировали гарантию безопасной публикации на Java?

Если быть конкретным:

У меня есть интерфейс Cache, в котором есть метод getOrLoad (ключ K, загрузчик ObjectLoader).Дело в том, что если Cache не может найти объект по данному ключу, он должен загрузить его из экземпляра ObjectLoader.Однако кэш должен гарантировать, что процесс загрузки объекта из загрузчика и помещения его в кэш представляет собой безопасную публикацию.

Сейчас я пишу общий junit-тест для этого интерфейса Cache, и мне интересно, как мне проверить, соответствуют ли реализации Cache этой гарантии безопасной публикации.

Есть идеи?Фактический код находится в модуле test-systest в файле репозиторий кода на случай, если вы захотите покопаться в реальных файлах.

Это было полезно?

Решение 2

Я обнаружил Презентация JavaOne Билл Пью, Брайан Гетц и Клифф Нажмите на тему тестирования параллельного кода.Они предложили такой подход, и я думаю, что это лучшее, что я слышал:

Ряд производителей создают объекты с сохранением состояния и потокобезопасные объекты с реализацией hashCode, зависящей от состояния.Поскольку объекты передаются через предполагаемую точку синхронизации, хеш-коды суммируются (локально в потоке).Аналогично, потребители на другой стороне ворот суммируют хеш-коды.

В конце теста мы суммируем все результаты для производителей и потребителей соответственно.Если две суммы равны, тест пройден.

Мы также могли бы использовать XOR в качестве альтернативы суммированию.Фактически подойдет любая коммутативная операция.Просто имейте в виду, что сама тестовая обвязка не должна вводить никакой дополнительной синхронизации.

Другие советы

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

Вам потребуется реализовать пару тестов, которые одновременно запускают несколько потоков.Затем ConTest увеличит вероятность того, что ошибка параллелизма действительно будет обнаружена путем инструментирования байт-кода (добавления эвристически контролируемых инструкций условного сна и выхода).

На самом деле получить ошибку из-за небезопасной публикации очень сложно (если кто знает как, подскажите).Статический анализ — лучший выбор для автоматизированного решения.Я бы придерживался проверки кода и не беспокоился об этом излишне.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top