Модульное тестирование метода со случайным поведением - PullRequest
22 голосов
/ 28 сентября 2010

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

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

Я не очень доволен этим, но я нене вижу выхода.Допустимо ли тестировать методы с частично случайным поведением?

Ответы [ 6 ]

28 голосов
/ 28 сентября 2010

Я предлагаю вам рассматривать ваш источник случайности (генератор случайных чисел или что-то еще) как зависимость.Затем вы можете проверить его с известными входными данными, предоставив поддельный ГСЧ или один с известным затравочным материалом.Это удаляет случайность из теста, сохраняя его в реальном коде.

Если вы фальсифицируете ГСЧ, вы можете проверить, что произойдет, если он естественным образом поставит игрока на препятствие - как он вытеснит игрокаконечно, и т. д. Конечно, это зависит от знания того, как класс использует ГСЧ, но лично я достаточно доволен модульными тестами, действующими как «тесты белого ящика» с некоторыми внутренними знаниями.

5 голосов
/ 28 сентября 2010

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

3 голосов
/ 28 сентября 2010

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

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

Я должен проверить все ситуациив одном тестовом случае.

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

2 голосов
/ 28 сентября 2010

Здесь нужно проверить две разные вещи, и вы должны проверить их отдельно:

  • Работает ли логика программы для всех возможных начальных позиций? Проверьте это, расположив игрока non-randomy на нескольких позициях, пытаясь охватить все «особые случаи».
  • Является ли случайное расположение действительно случайным? Проверьте это, много раз вызывая только логику позиционирования, и проведите какой-то статистический анализ.
1 голос
/ 28 сентября 2010

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

Единственные ситуации, когда мне приходилось иметь дело с недетерминированным кодом, - это когда использовалась многопоточность. Тогда вы зависите от планировщика операционной системы.

В этих случаях я пишу юнит-тест в виде цикла, который тысячи раз повторяет код теста.

0 голосов
/ 28 сентября 2010

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

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