Модульное тестирование для безопасной публикации - PullRequest
4 голосов
/ 14 октября 2008

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

Чтобы быть конкретным:

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

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

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

Ответы [ 3 ]

1 голос
/ 14 октября 2008

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

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

1 голос
/ 14 октября 2008

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

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

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

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

0 голосов
/ 14 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...