Ваша цель - проверить случайность (). Поскольку вы знаете, как вы создали shuffle (), это было бы детерминистическим юнит-тестом вашей начальной колоды против перетасованной колоды, если бы вы могли знать серию сгенерированных чисел.
Это тот случай, когда внедрение метода в ваш класс Deck () во время тестирования может сделать вашу функцию перемешивания детерминированной.
Создайте свой класс для использования функции random () по умолчанию, но для использования предопределенной функции генерации чисел при введении. Например, в Python вы можете сделать:
class Deck():
def __init__(self, rand_func = random.random):
self._rand = rand_func
def rand(self):
return self._rand()
Когда вы просто используете Deck без аргументов, вы получите ожидаемое случайное число. Но если вы создадите свою собственную функцию случайных чисел, вы можете сгенерировать заранее заданную последовательность чисел.
С помощью этой конструкции вы можете теперь создать начальную колоду (любого размера) и список случайных чисел (опять же, любого размера), и вы будете знать, чего ожидать в качестве результата. Поскольку shuffle () не изменяется между введенной версией и действительно случайной версией, вы можете детально детектировать shuffle () и при этом иметь случайное поведение во время выполнения. Вы даже можете создать несколько разных числовых последовательностей, если есть угловые случаи, которые вы хотите проверить.
Что касается ответов других, связанных со статистическим моделированием: я думаю, что это тесты приемлемого уровня, чтобы доказать правильность алгоритма "shuffle", но он не детерминистически тестирует реализацию функции shuffle ().