2014-06-25 3 views
3

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

Примером библиотеки, использующей случайные числа, является java.util.Collections.shuffle(List<?> list), которая перемещает коллекцию объектов, следуя http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle.

Как написать тесты jUnit для кода с случайным выходом? Не только для перетасовки, но и для проверки случайности в целом.

+1

http://stackoverflow.com/questions/56411/how-to-test-randomness-case-in-point-shuffling –

+0

stackoverflow.com/questions/56411/... о перетасовке. Это часть этого вопроса. –

+0

@AlexandreSantos Почему нет приемлемого ответа на этот вопрос? – awksp

ответ

2

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

Ваш пример Collections.shuffle() также является плохим примером, потому что это встроенный метод JDK. Нет причин проверять встроенный метод JDK, авторы Java сделали это уже для вас, а также миллионы пользователей, которые использовали эти методы за последние 20 лет. У вас также есть тесты, чтобы подтвердить, что System.out.print() работает так же, как ожидалось?

Единичные испытания должны быть детерминированными. Повторное повторение одного и того же теста снова и снова должно давать одинаковые результаты КАЖДЫЙ раз. Если они этого не делают, и тест терпит неудачу, то он терпит неудачу, потому что код неисправен или потому что недетерминированный результат приводит к недопустимому вводу? Если при повторном тестировании результаты проходят, это потому, что ошибка была исправлена ​​или из-за того, что нам удалось получить случайный ввод, который сработал?

По этим причинам, ваши юнит-тесты должны пытаться издеваться или удалять любую случайность. Возможно, напишите несколько тестов, которые выполняют конкретные преобразования данных для проверки граничных условий. Например, для shuffle() может быть проведен тест, который переупорядочивает элементы в определенном порядке или сортирует элементы в порядке возрастания или убывания или тест, который фактически не делает никаких преобразований и т. Д. Это все допустимые результаты, которые могут произойти случайным образом.

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

EDIT Кажется, вы действительно хотите протестировать свой собственный генератор случайных чисел.

Ниже приведены ссылки, которые описывают статистические тесты, которые нужно сделать, чтобы увидеть, если это действительно случайно (или, по крайней мере, как случайное, насколько это возможно)

RANDOM.ORG statistical analysis

NIST statistical test suite

+0

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

+0

@AlexandreSantos добавил ссылки на фактические тесты RNG – dkatzel

+0

Мне было интересно то же самое. Я знаю, что мой метод работает, потому что я видел результаты в главном приложении. Хотя, я новичок в тестировании Junit, и мне было интересно, как можно определить, была ли колода карт перетасована с использованием теста Junit. Из вашего ответа, кажется, нет никакого возможного пути. Для парня с исходными вопросами я предлагаю вам использовать свой основной для запуска метода и просмотра вывода. Вот как я хорошо проверил способ Shuffle Cards – Sedrick

Смежные вопросы