Ruby: Использование rand () в коде, но написание тестов для проверки вероятностей

У меня есть код, который доставляет вещи на основе взвешенного случайного числа. Вещи с большим весом, скорее всего, будут выбраны случайным образом. Теперь, будучи хорошим рубистом, я, наверное, хочу покрыть весь этот код тестами. И я хочу проверить, что все происходит в соответствии с правильными вероятностями.

Итак, как мне это проверить? Создание тестов для чего-то, что должно быть случайным, очень затрудняет сравнение фактического и ожидаемого. Несколько идей, которые у меня есть, и почему они не работают хорошо:

  • Stub Kernel. И в моих тестах возвращать фиксированные значения. Это круто, но rand () вызывается несколько раз, и я не уверен, что смогу оснастить это достаточным контролем, чтобы проверить, что мне нужно.

  • Получите случайный элемент ОГРОМНОЕ количество раз и сравните фактическое соотношение с ожидаемым соотношением. Но если я не смогу запускать его бесконечное количество раз, он никогда не будет идеальным и может периодически выходить из строя, если мне не повезет с ГСЧ.

  • Используйте постоянное случайное начальное число. Это делает ГСЧ повторяемым, но по-прежнему не дает мне никакой проверки, что элемент А будет выполняться в 80% случаев (например).

Итак, какой подход я могу использовать для написания тестового покрытия для случайных вероятностей?

7
задан Alex Wayne 20 May 2011 в 21:21
поделиться