Co to jest „Stub”?

116

Tak więc, kontynuując moje noworoczne postanowienie, aby uzyskać więcej w TDD, teraz zaczynam więcej pracować z Rhino Mocks .

Jedną rzeczą, którą chciałbym zrobić, jest upewnienie się, że naprawdę rozumiem, do czego zmierzam, więc chciałem sprawdzić, czy rozumiem to, co widziałem do tej pory (i pomyślałem, że dobrze by było, aby to tutaj ratunek).

Co to jest „Stub”?

Rob Cooper
źródło
6
najpierw zadajesz pytanie, a potem udzielasz odpowiedzi?
empi
17
Jak stwierdzono w pytaniu - szukam weryfikacji poprawności mojego rozumienia, chciałem, aby odpowiedź była tutaj (moja lub nie), aby zapewnić źródło informacji na to często zadawane, ale rzadko dobrze odpowiadane pytanie: )
Rob Cooper
42
Również udzielenie odpowiedzi na własne pytanie jest wskazane w FAQ jako właściwy sposób korzystania ze strony - właściwie należy do tego zachęcać.
Erik Forbes
Dobrze jest odpowiadać na własne pytania, chociaż samo pytanie jest trochę za dużo szumu (autobiografia) i nie pokazuje żadnego wysiłku, aby znaleźć odpowiedź, żadnej skłonności do tego, co osoba zrobiła, aby spróbować znaleźć odpowiedź.
eric

Odpowiedzi:

112

Martin Fowler napisał doskonały artykuł na ten temat. Z tego artykułu:

Meszaros używa terminu Test Double jako ogólnego terminu dla wszelkiego rodzaju udawanego obiektu używanego zamiast prawdziwego obiektu do celów testowych. Nazwa pochodzi od pojęcia Stunt Double w filmach. (Jednym z jego celów było uniknięcie używania jakiejkolwiek nazwy, która była już szeroko używana.) Meszaros zdefiniował następnie cztery szczególne rodzaje dubletów:

  • Atrapy są przekazywane dookoła, ale nigdy nie są używane. Zwykle służą do wypełniania list parametrów.
  • Fałszywe obiekty faktycznie mają działające implementacje, ale zwykle korzystają ze skrótów, co sprawia, że ​​nie nadają się do produkcji (dobrym przykładem jest baza danych w pamięci).
  • Stuby zapewniają gotowe odpowiedzi na połączenia wykonane podczas testu, zwykle nie odpowiadają w ogóle na nic poza tym, co jest zaprogramowane w teście. Stuby mogą również rejestrować informacje o połączeniach, takie jak skrót bramy poczty e-mail, który zapamiętuje wiadomości, które „wysłał”, lub może tylko liczbę wiadomości, które „wysłał”.
  • Mówimy tutaj o makietach: obiektach wstępnie zaprogramowanych z oczekiwaniami, które tworzą specyfikację wywołań, które mają otrzymać.

Ujmując to własnymi słowami: pozorowane obiekty „oczekują” wywołania pewnych metod i zazwyczaj powodują niepowodzenie testu jednostkowego, jeśli ich oczekiwania nie zostaną spełnione. Obiekty pośredniczące zapewniają odpowiedzi oparte na szablonach (i mogą być generowane automatycznie przez biblioteki pomocnicze), ale zazwyczaj nie powodują bezpośrednio niepowodzenia testu jednostkowego. Są one zwykle używane po prostu po to, aby testowany obiekt otrzymał dane potrzebne do wykonania swojej pracy.

Ross
źródło
2
Jaka jest różnica między fałszywymi przedmiotami a szwami? Jak powiedziałeś, mają tę samą rolę do zaimplementowania, prawda?
LKM
4
@LKM fałszywy obiekt to rzeczywisty obiekt, który implementuje rzeczywistą funkcjonalność i robi rzeczy. Stuby to po prostu „gotowe odpowiedzi”, np. zakodowane na stałe wyniki JSON, które naśladują to, co zostanie zwrócone z serwera WWW.
user3344977
31

„Odcinek” to implementacja interfejsu, który istnieje w celu dostarczania danych / odpowiedzi pewnego rodzaju. Na przykład:

  • zestaw danych
  • lista użytkowników
  • plik XML

Zwykle byłoby to zapewniane przez inną usługę (czy to usługę sieciową, inną aplikację, bazę danych), ale w celu poprawy możliwości testowania kodu wyniki są „sfałszowane”.

Główną zaletą tego jest to, że pozwala na tworzenie twierdzeń w testach jednostkowych na podstawie oczekiwanych danych. Jeśli błędy wynikają z błędów danych, można łatwo dodać testy, utworzyć nowy kod pośredniczący (replikujący błąd danych) i wygenerować kod w celu skorygowania błędu.

Stuby różnią się od Mocków tym, że są używane do reprezentowania i testowania stanu obiektu, podczas gdy Mock testuje jego interakcję .

Rob Cooper
źródło
dziękuję za odpowiedź, ale nadal nie rozumiem: "implementacja interfejsu"?
BKSpurgeon
6

Uważam, że „stub” pochodzi ze STartUpBlock. jest używany w odniesieniu do części kodu, które są generowane automatycznie, aby pomóc programistom w rozpoczęciu pracy.

Kris
źródło
1
Myślę, że to nie jest poprawne. Prawdopodobnie wynika to z tej praktyki w budownictwie domu: hunker.com/12000314/what-is-a-stub-out
mattdm
3

Metoda „odgałęzienia” lub „metoda odgałęzienia” została zaprojektowana jako kod początkowy lub tymczasowy substytut kodu, który nie został jeszcze opracowany. Jest to wbudowany kod generowany przez IDE. Metody skrótowe to w rzeczywistości metody używane do testowania metod określonej klasy. Jest używany przez wprowadzenie pewnych wartości zmiennych lokalnych w twoich rzeczywistych metodach programowania i sprawdzenie, czy dane wyjściowe są poprawne. Jest to ważne przy znajdowaniu błędów w kodzie.

Nasserr
źródło
Ta odpowiedź byłaby lepsza, gdyby wyjaśniono ją bardziej szczegółowo: jaki jest cel metody odgałęzienia? Jak to jest używane? Dlaczego to jest ważne?
Evan Weissburg
Dzięki! Jestem nowy w programowaniu i właśnie zacząłem uczyć się o tworzeniu oprogramowania. Do tej pory to, co rozumiem o metodach pośredniczących. Nie jestem więc pewien, jaki jest jego cel, znaczenie i jak jest używany. Ale myślę, że metody pośredniczące są w rzeczywistości metodami używanymi do testowania metod określonej klasy. Jest używany przez wprowadzenie pewnych wartości zmiennych lokalnych w twoich rzeczywistych metodach programowania i sprawdzenie, czy dane wyjściowe są poprawne. Ważne jest, aby znaleźć błędy w swoich kodach. Jeśli masz coś jeszcze do dodania lub poprawienia, skomentuj. Właśnie uczę się testowania.
Nasserr
1
Świetnie, że się uczysz! Powinieneś zredagować swoją oryginalną odpowiedź, aby przyszli czytelnicy mogli się z niej łatwo uczyć, zamiast publikować w komentarzach. Dodatkowo - jeśli czegoś nie jesteś pewien, po co publikujesz autorytatywną odpowiedź na ten temat?
Evan Weissburg
1
To dobrze, jeśli sam się uczysz - w StackOverflow nie musisz publikować odpowiedzi, chyba że jesteś ich pewien. To nie jest standardowe forum. Zobacz: stackoverflow.com/tour
Evan Weissburg
1
Bardzo dziękuję za przewodniki i sugestie. Naprawdę to doceniam!
Nasserr,
3

Niedawno stanąłem przed tym pytaniem i stwierdziłem, że to porównanie między Stubem a Driver jest naprawdę jasne i pomocne:

Zasadniczo kody pośredniczące i sterowniki to procedury, które w rzeczywistości nie robią nic poza deklarowaniem samych siebie i akceptowanych parametrów. Pozostała część kodu może następnie pobrać te parametry i użyć ich jako danych wejściowych.

+ --------- + ------------------------------- + ------- ------------------------ +
| | Stub | Kierowca |
+ --------- + ------------------------------- + ------- ------------------------ +
| Wpisz | Kody fikcyjne | Kody fikcyjne |
+ --------- + ------------------------------- + ------- ------------------------ +
| Używany w | Integracja odgórna | Integracja oddolna |
+ --------- + ------------------------------- + ------- ------------------------ +
| Cel | Aby umożliwić testowanie cholewki | Aby umożliwić testowanie dolnego |
| | poziomy kodu, gdy | poziomy kodu, gdy |
| | niższe poziomy kodu to | górne poziomy kodu to |
| | jeszcze nie opracowany. | jeszcze nie opracowany. |
+ --------- + ------------------------------- + ------- ------------------------ +
| Przykład | A i B to komponenty. | A i B to komponenty. |
| | A ---> B | A ---> B |
| | | |
| | Został opracowany. | Nadal trzeba opracować. |
| | B nadal wymaga opracowania. | B został opracowany. |
| | Dlatego używany jest skrót | Dlatego używany jest sterownik |
| | zamiast B, aby go naśladować. | zamiast A, aby go naśladować |
| | | |
| | A ---> Stub | Sterownik ---> B |
+ --------- + ------------------------------- + ------- ------------------------ +

Z różnicy między Stubem a Driver

Vahid Hallaji
źródło
0

Po kilku badaniach i na podstawie plików pośredniczących, z którymi miałem do czynienia w życiu programisty, powiedziałbym, że plik pośredniczący to po prostu plik zawierający całość lub część implementacji pliku. Pomaga programistom w rozpoczęciu kodowania.

Deric Lima
źródło