Twoim celem jest przetestowanie shuffle(). Ponieważ wiesz, jak skonstruowałeś shuffle(), byłby to deterministyczny test jednostkowy twojej początkowej talii w porównaniu z tasowaniem, gdybyś mógł poznać serię wygenerowanych liczb.
Jest to przypadek, w którym wstrzyknięcie metody do swojej klasy Deck() podczas testu może spowodować, że twoja funkcja shuffle będzie deterministyczna.
Twórz klasę, aby domyślnie używać funkcji random(), ale użyj wcześniej określonej funkcji generowania liczb po wstrzyknięciu. Na przykład w Pythonie możesz:
class Deck():
def __init__(self, rand_func = random.random):
self._rand = rand_func
def rand(self):
return self._rand()
Używając po prostu Deck bez argumentów otrzymasz losową liczbę. Ale jeśli tworzymy własną funkcję liczb losowych, możesz wygenerować z góry ustaloną sekwencję liczb.
Dzięki tej konstrukcji możesz teraz zbudować początkową talię (o dowolnym rozmiarze) i listę liczb losowych (ponownie, niezależnie od tego, jaki rozmiar potrzebujesz) i będziesz wiedział, czego się spodziewać jako wynik. Ponieważ tryb shuffle() nie zmienia się między wersją wstrzykiwaną a wersją prawdziwie losową, można testować losowo test shuffle(), a jednocześnie zachowywać losowo w środowisku wykonawczym. Można nawet generować wiele różnych sekwencji liczb, jeśli istnieją przypadki narożne, które chcesz przetestować.
W odniesieniu do odpowiedzi innych dotyczących modelowania statystycznego: Myślę, że są to testy poziomu akceptacji, aby udowodnić poprawność algorytmu "shuffle", ale nie deterministycznie testuje on funkcję funkcji shuffle().
Jednym z pomysłów byłoby uruchomienie tasownika na posortowanej talii i uruchomienie algorytmu odległości, aby zobaczyć, jak "daleko" pojawia się przetasowanie; i ciągle biegnij i porównuj z poprzednimi permutacjami z powrotem do pewnego punktu (powiedzmy 10-12 tasowania z poniżającymi wymaganiami odległości), a następnie porównaj te wartości z optymalną różnicą - będziesz musiał przetestować i zdobyć te liczby samemu. – Corazu