То же случайное число, сгенерированное при запуске в тестовой настройке Fixture

Я пытаюсь сгенерировать случайное число во время тестирования с помощью NUnit, но оно продолжает генерировать одно и то же число. Я использую следующую функцию для этой цели.

dim dCount As Integer = Math.Floor((High - Low + 1) * Rnd() + Low)
dim divName As String = "abc" & dCount

Любая идея, почему он это делает?

С уважением,

Сэм


person sam    schedule 26.02.2009    source источник
comment
Используйте 4, это гарантированно будет случайным; плюс вы сможете проверить это.   -  person garrow    schedule 26.02.2009


Ответы (1)


Предположительно, вы выполняете много тестов в быстрой последовательности. Я точно не знаю, что Rnd() делает в VB, но похоже, что у него типичная проблема "нового ГСЧ на вызов".

Создайте один экземпляр Random и используйте его многократно. Обратите внимание, что вашу математику можно заменить простой:

dim dCount as Integer = myRandom.Next(Low, High+1)

Одно предостережение — Random не является потокобезопасным. Если вам нужно генерировать случайные числа из разных потоков, либо используйте блокировку или статика потока.

С другой стороны: использование случайных чисел сделает ваши модульные тесты недетерминированными. Вы уверены, что должны? Иногда это уместно, но не часто IME.

person Jon Skeet    schedule 26.02.2009
comment
Rnd() возвращает один в диапазоне 0 ‹= r ‹ 1... и мне придется во-вторых, не использовать случайно сгенерированные данные в ваших модульных тестах. Гораздо лучше явно протестировать внутри и за пределами ожидаемого диапазона. - person Jim H.; 27.02.2009
comment
Лично я рекомендую случайные числа с фиксированным начальным числом (+, конечно, явные предельные случаи). Таким образом, вы можете легко протестировать большой массив данных и столкнуться с тонкими проблемами, которые вы могли пропустить, но всегда повторять один и тот же тест для целей регрессии. - person Kena; 27.02.2009