Я возился с CHESS , который кажется невероятно полезным инструментом.Однако по иронии судьбы я, похоже, имею дело с гейзенбагом в одном из моих методов испытаний.Результаты, о которых сообщает CHESS, когда я запускаю этот тест, непредсказуемы:
- Иногда тест проходит
- Иногда тест не пройден без дальнейшего описания (просто: «Тест не пройден»))
- Иногда тест завершается неудачно с инструкциями для дублирования *
- Иногда в тесте будет указано "CHESS обнаружил тупик"
Первоначально я думал, что это несоответствие должно бытьиз-за того, что тестирование предполагает использование Random
объектов.Должно быть, разные начальные значения давали разные результаты, верно?
Поэтому я обновил тест, чтобы просто запустить для предопределенного набора начальных значений (от 0 до 10).Локальные по потоку объекты Random
засеваются (псевдо) случайным значением, создаваемым общим Random
внутри блокировки.Код выглядит в основном точно следующим образом:
( Обновление : я запускаю это на.NET 3.5, поскольку CHESS поддерживает только VS 2008. Интересно, может ли проблема быть связана с this ?)
Насколько я понимаю, приведенный выше код должен быть довольно детерминированным.Поскольку sharedRandom
инициализируется с помощью известного начального числа (от 0 до 10), значения, создаваемые объектом localRandom
, принадлежащим каждому потоку, выполняющему код в вызове Parallel.For
, должны быть согласованы от одного запуска теста к следующему (какой поток получает, какое начальное число из sharedRandom
может отличаться между прогонами, но среди 5 итераций в пределах Parallel.For
те же 5 начальных чисел должны использоваться для localRandom
).
Вот как I понимаю это.Но из результатов CHESS я склонен полагать, что я что-то упускаю.
- Есть ли тупик в приведенном выше коде, который я слишком туп, чтобы видеть?
- Разве я не должен использовать класс
Random
в тестах, связанных с параллелизмом? - Для тех, кто имеет опыт использования CHESS: это надежный инструмент?Это иногда дает ложные срабатывания?На самом деле это большой случай, так как если выяснится, что этот сценарий является распространенным (противоречивые результаты тестов), то, возможно, было бы целесообразно, чтобы я пока вообще отказался от использования CHESS.
* ... который я не смог понять, как использовать - но это отдельная проблема.