2012-03-10 4 views
1

У меня есть метод, который называется shuffle, как тот, который я показал ниже, который перемешивает ArrayList целых чисел. Мне было интересно, мне нужно проверить этот метод?Метод для проверки целых чисел

public void shuffle(){ 
    Collections.shuffle(numbers); 
    } 

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

+1

Попробуйте создать случайное семя .. и примените к методу 'Collections.shuffle' ... что-то вроде:' long seed = System.nanoTime(); Collections.shuffle (числа, новые случайные (семя)); ' –

+1

В каком контексте? Если бы вы когда-либо использовали или редактировали этот метод, я бы просто испытал, что Collections.shuffle (numbers) делает то, что вы ожидаете. Если другие могут отредактировать этот метод в будущем, он может * заслуживать написания модульного теста, если они решают изменить вашу реализацию, но не понимают/не знают требования. Вы можете протестировать такие случаи, как, например, что делать в случайном порядке, когда заданы числа, содержащие дубликаты, или что происходит в случайном порядке, когда предоставляется коллекция, которая не поддерживает заданную операцию. –

+0

@ user1181847: обычно алгоритмы перетасовки по умолчанию недостаточно сильны для предотвращения атак. В те дни, по крайней мере, один сайт онлайн-покера имел свой алгоритм перетасовки, разработанный пиратами, который затем продолжил бить других игроков. Большинство онлайн-покерных сайтов в настоящее время используют очень продвинутые методы перетасовки, некоторые из них даже доходят до использования физического устройства, обеспечивающего «действительно» случайный источник.Чтобы предотвратить атаки, вам понадобится, по крайней мере, криптографически безопасный генератор псевдослучайных чисел (CSPRNG). * Collections.shuffle() * не подходит, если задействованы реальные деньги (например, сайты онлайн-покера) – TacticalCoder

ответ

3

Там это еще точка в тестировании тривиальные процедуры. Вы можете проверить, что

  • он делегирует Collections.shuffle, если это требование обычной
  • это на самом деле перемешивает

, который даст вам знать, что процедура по-прежнему поддерживает свой контракт, если вы хотите refactor позже.

У вас есть необходимо, чтобы проверить его? Нет. Это pragmatic для проверки? Возможно нет. Но каждый бит гарантии помогает проверить правильность вашей программы. В конечном счете, вам решать.


EDIT Это хорошая практика, чтобы разработать для тестирования. По сути, это легче проверить подпрограмму, которая не имеет побочных эффектов , т.е.

рутина, которая действует на своих входах, вычисляет значение и возвращает результат.

Теперь, поскольку Collections.shuffle изменяет существующий список, возвращаемое значение может показаться неоднозначным. Рассмотрим второй лучший вариант для контролируемости

public void shuffle(List<?> l) { 
    Collections.shuffle(l); 
} 

ли такая конструкция подходит или не вашего случае я оставляю вам судить. Это был просто общий fyi :)

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