Подтвердить что ты не робот

Единичное тестирование метода со случайным поведением

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

  • Работает ли логика программы на всех возможных исходных позициях? Протестируйте это, поставив игрока в нерабочее положение на несколько позиций, пытаясь охватить все "особые случаи".
  • Является ли случайное позиционирование фактически случайным? Протестируйте это, вызвав логику позиционирования много раз, и сделайте некоторый статистический анализ.

Ответ 5

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

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

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

Ответ 6

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