Jak wspomniano w najczęściej głosowanej odpowiedzi, Martin Fowler omawia te rozróżnienia w Mocks Aren't Stubs , a w szczególności w podtytule The Difference Between Mocks and Stubs , więc przeczytaj ten artykuł.
Zamiast skupiać się na jak te rzeczy są różne, myślę, że to bardziej skupić się na oświecenie dlaczego są różne koncepcje. Każdy istnieje w innym celu.
Podróbki
Fałszywy jest implementacją, która zachowuje się w sposób „naturalny”, ale nie jest „prawdziwy”. Są to rozmyte pojęcia, więc różni ludzie rozumieją, co czyni je fałszywymi.
Jednym z przykładów podróbki jest baza danych w pamięci (np. Używanie sqlite ze :memory:
sklepem). Nigdy nie użyłbyś tego do produkcji (ponieważ dane nie są utrwalane), ale jest to całkowicie wystarczające jako baza danych do użycia w środowisku testowym. Jest również znacznie lżejszy niż „prawdziwa” baza danych.
Jako inny przykład, być może używasz jakiegoś magazynu obiektów (np. Amazon S3) w produkcji, ale w teście możesz po prostu zapisać obiekty do plików na dysku; wówczas implementacja „zapisz na dysku” byłaby fałszywa. (Lub możesz nawet sfałszować operację „zapisz na dysku”, używając zamiast tego systemu plików w pamięci).
Jako trzeci przykład wyobraź sobie obiekt, który udostępnia interfejs API pamięci podręcznej; obiekt, który implementuje poprawny interfejs, ale który po prostu nie wykonuje buforowania, ale zawsze zwraca brak pamięci podręcznej, byłby rodzajem fałszywki.
Celem podróbki nie jest wpływanie na zachowanie testowanego systemu , ale uproszczenie implementacji testu (poprzez usunięcie zbędnych lub ciężkich zależności).
Stuby
Stub jest implementacją, która zachowuje się „nienaturalnie”. Jest wstępnie skonfigurowany (zwykle przez konfigurację testową), aby reagować na określone dane wejściowe za pomocą określonych danych wyjściowych.
Celem kodu pośredniczącego jest doprowadzenie testowanego systemu do określonego stanu. Na przykład, jeśli piszesz test na kod, który wchodzi w interakcję z interfejsem API REST, możesz zlikwidować interfejs API REST za pomocą interfejsu API, który zawsze zwraca odpowiedź standardową lub który odpowiada na żądanie interfejsu API z określonym błędem. W ten sposób możesz napisać testy, które zawierają stwierdzenia o tym, jak system reaguje na te stany; na przykład testowanie odpowiedzi uzyskiwanej przez użytkowników, jeśli interfejs API zwraca błąd 404.
Kod pośredniczący jest zwykle implementowany, aby reagować tylko na dokładne interakcje, na które kazałeś mu odpowiedzieć. Ale kluczową cechą, która sprawia, że coś jest odgałęzieniem, jest jego cel : w odgałęzieniu chodzi o skonfigurowanie twojego przypadku testowego.
Makiety
Makiety jest podobna do zalążek, ale z weryfikacji dodanej. Celem mock jest, aby twierdzenia dotyczące konfiguracji urządzeń w ramach testu w interakcję z uzależnienia .
Na przykład, jeśli piszesz test systemu, który przesyła pliki do strony internetowej, możesz zbudować próbkę, która akceptuje plik i której możesz użyć, aby potwierdzić, że przesłany plik jest poprawny. Lub, na mniejszą skalę, często używa się makiety obiektu, aby sprawdzić, czy testowany system wywołuje określone metody kpionego obiektu.
Próbki są powiązane z testowaniem interakcji , które jest specyficzną metodologią testowania. Ludzie, którzy wolą testować stan systemu niż interakcje systemowe, będą używać próbnych , jeśli w ogóle, oszczędnie.
Test podwaja się
Podróbki, odcinki i makiety należą do kategorii podwójnych testów . Podwójny test to dowolny obiekt lub system używany w teście zamiast czegoś innego. Większość zautomatyzowanych testów oprogramowania wymaga użycia podwójnych testów. Niektóre inne rodzaje deblu testowych obejmują wartości nieużywane , szpiegów i I / O blackholes .