목표는 shuffle()을 테스트하는 것입니다. shuffle()을 어떻게 생성했는지 알았으므로 생성 된 일련의 숫자를 알 수 있다면 초기 데크 대 셔플 데크의 결정적 단위 테스트가됩니다.
테스트 중에 메서드를 사용자의 Deck() 클래스에 삽입하면 셔플 함수가 결정적 일 수 있습니다.
기본적으로 random() 함수를 사용하도록 클래스를 작성하지만 주입시 미리 결정된 숫자 생성 함수를 사용하십시오. 예를 들어, 파이썬에서는 다음을 할 수 있습니다 :
class Deck():
def __init__(self, rand_func = random.random):
self._rand = rand_func
def rand(self):
return self._rand()
단순히 덱을 인자없이 사용하면 예상되는 난수를 얻게됩니다. 그러나 자신의 난수 함수를 만들면 미리 정해진 수열을 생성 할 수 있습니다.
이 구조를 사용하면 초기 데크 (원하는 크기)와 난수 목록 (다시 원하는 크기)을 작성할 수 있으며 출력으로 기대되는 것을 알 수 있습니다. 주입 된 버전과 진정한 랜덤 버전 사이에서 shuffle()이 변경되지 않으므로 런타임에 결정적으로 shuffle() 테스트 유닛을 테스트 할 수 있습니다. 테스트하려는 구석이있는 경우 여러 개의 숫자 시퀀스를 생성 할 수도 있습니다.
통계 모델링을 포함하는 다른 답변에 대해서는 다음과 같습니다. "shuffle"알고리즘의 정확성을 입증하는 승인 수준 테스트라고 생각하지만 기능 shuffle()의 구현을 결정적으로 테스트하지는 않습니다.
하나의 아이디어는 정렬 된 데크에서 셔플 러를 실행하고 거리 알고리즘을 실행하여 셔플이 멀리 떨어져있는 것을 확인하는 것입니다. (즉, 거리 요구 사항을 저하시키는 10-12 개의 셔플) 이전의 순열과 비교하여 그 값을 최적의 차이와 비교하십시오. 테스트를 거쳐 그 숫자를 직접 얻어야합니다. – Corazu