Co w programowaniu oznacza „odgiąć”?


117

Na przykład, co to oznacza w tym cytacie?

Integracja z zewnętrznym API to prawie gwarancja w każdej nowoczesnej aplikacji internetowej. Aby skutecznie przetestować taką integrację, trzeba skrótową go. Dobry kod pośredniczący powinien być łatwy do utworzenia i stale aktualizowany z rzeczywistymi, aktualnymi odpowiedziami API. W tym poście przedstawimy strategię testowania przy użyciu kodów pośredniczących dla zewnętrznego interfejsu API.


9
Czy spojrzałeś na zaakceptowaną odpowiedź w Co to jest „Stub”? ?
Nick

Odpowiedzi:


104

Kod pośredniczący jest kontrolowanym zamiennikiem istniejącej zależności (lub współpracownika) w systemie. Używając kodu pośredniczącego, możesz przetestować kod bez zajmowania się bezpośrednio zależnością.

Zależność zewnętrzna - istniejąca zależność:
jest to obiekt w systemie, z którym testowany kod współdziała i nad którym nie masz kontroli. (Typowe przykłady to systemy plików, wątki, pamięć, czas itd.)

Na przykład w poniższym kodzie:

public void Analyze(string filename)
    {
        if(filename.Length<8)
        {
            try
            {
                errorService.LogError("long file entered named:" + filename);
            }
            catch (Exception e)
            {
                mailService.SendEMail("admin@hotmail.com", "ErrorOnWebService", "someerror");
            }
        }
    }

Chcesz przetestować metodę mailService.SendEMail () , ale aby to zrobić, musisz zasymulować wyjątek w swojej metodzie testowej, więc wystarczy utworzyć obiekt Fake Stub errorService, aby zasymulować żądany wynik, a następnie kod testowy będzie w stanie przetestować metodę mailService.SendEMail () . Jak widzisz, musisz zasymulować wynik, który pochodzi z innego obiektu Dependency, który jest obiektem klasy ErrorService (obiekt Existing Dependency).


9
Język angielski? Co to jest istniejąca zależność?
Jwan622

17
@ Jwan622 W kategoriach laików: wszystko, czego używa kod. Pomocne może być zrozumienie, jeśli ponownie przeczytasz i zastąpisz „zależność” słowem „klasa” lub „funkcja” lub czymkolwiek innym (w zależności od twojego tła). Czasami użycie istniejącej klasy / funkcji nie jest realną opcją i potrzebujesz kodu pośredniczącego (np. W zautomatyzowanych testach jednostkowych funkcji, które opierają się na środowisku, takich jak bieżąca data i czas w systemie).
MasterMastic

101

Stub , w tym kontekście oznacza mock wdrożenia.

Oznacza to prostą, fałszywą implementację, która jest zgodna z interfejsem i ma być używana do testowania.


3
Więcej szczegółów można znaleźć w słynnym artykule Martina Fowlera Mocks Aren't Stubs : „Ale tak często, jak nie widzę fałszywych obiektów, które są słabo opisane.
pba

61

Warunki Laymana to fikcyjne dane (lub fałszywe dane, dane testowe ... itd.), Których możesz użyć do testowania lub rozwijania kodu, dopóki Ty (lub druga strona) nie będziecie gotowi do prezentowania / odbierania prawdziwych danych. To "Lorem Ipsum" programisty.

Baza danych pracowników nie jest gotowa? Wymyśl proste z Jane Doe, John Doe ... itd. API nie jest gotowe? Zrób fałszywy, tworząc statyczny plik .json zawierający fałszywe dane.


1
Dziękuję za przykład :)
CapturedTree

8

W tym kontekście słowo "stub" jest używane zamiast "mock", ale dla jasności i precyzji autor powinien był użyć "mock", ponieważ "mock" to rodzaj odgałęzienia, ale do testowania. Aby uniknąć dalszych nieporozumień, musimy zdefiniować, czym jest kod.

W ogólnym kontekście, kod pośredniczący to fragment programu (zwykle funkcja lub obiekt), który zawiera złożoność wywołania innego programu (zwykle znajdującego się na innej maszynie, maszynie wirtualnej lub procesie - ale nie zawsze może to być również lokalny obiekt). Ponieważ rzeczywisty program do wywołania zwykle nie znajduje się w tej samej przestrzeni pamięci, wywołanie go wymaga wielu operacji, takich jak adresowanie, wykonanie rzeczywistego zdalnego wywołania, uporządkowanie / serializacja danych / argumentów do przekazania (i to samo z potencjalnym wynikiem), może nawet zajmując się uwierzytelnianiem / bezpieczeństwem i tak dalej. Należy zauważyć, że w niektórych kontekstach kody pośredniczące są również nazywane proxy (na przykład dynamiczne proxy w Javie).

Mock to bardzo specyficzny i restrykcyjny rodzaj kodu pośredniczącego, ponieważ mock zastępuje inną funkcję lub obiekt do testowania. W praktyce często używamy mocków jako programów lokalnych (funkcji lub obiektów) w celu zastąpienia zdalnego programu w środowisku testowym. W każdym przypadku makieta może symulować rzeczywiste zachowanie zastępowanego programu w ograniczonym kontekście.

Najbardziej znane rodzaje pośredników są oczywiście przeznaczone do programowania rozproszonego, gdy trzeba wywołać procedury zdalne ( RPC ) lub obiekty zdalne ( RMI , CORBA ). Większość platform / bibliotek programowania rozproszonego automatyzuje generowanie kodów pośredniczących, dzięki czemu nie trzeba ich ręcznie pisać. Stuby mogą być generowane na podstawie definicji interfejsu, napisanej za pomocą IDL na przykład w (ale możesz także użyć dowolnego języka do definiowania interfejsów).

Zwykle w RPC, RMI, CORBA i tak dalej rozróżnia się kody pośredniczące po stronie klienta , które głównie zajmują się organizowaniem / serializacją argumentów i wykonywaniem zdalnego wywołania, oraz kody pośredniczące po stronie serwera , które głównie zajmują się cofaniem / deserializacją argumenty i faktycznie wykonaj zdalną funkcję / metodę. Oczywiście kody pośredniczące klienta znajdują się po stronie klienta, podczas gdy kody pośredniczące serwerów (często nazywane szkieletami) znajdują się po stronie serwera.

Pisanie dobrych, wydajnych i ogólnych kodów pośredniczących jest dość trudne w przypadku odwołań do obiektów. Większość rozproszonych struktur obiektowych, takich jak RMI i CORBA, obsługuje odniesienia do obiektów rozproszonych, ale jest to coś, czego większość programistów unika na przykład w środowiskach REST. Zwykle w środowiskach REST programiści JavaScript tworzą proste funkcje pośredniczące w celu hermetyzacji wywołań AJAX (serializacja obiektów jest obsługiwana przez JSON.parsei JSON.stringify). Projekt Swagger Codegen zapewnia rozległą obsługę automatycznego generowania kodów pośredniczących REST w różnych językach.


4

Stub to definicja funkcji, która ma poprawną nazwę funkcji, poprawną liczbę parametrów i daje fikcyjny wynik poprawnego typu.

Pomaga w napisaniu testu i służy jako rodzaj rusztowania umożliwiającego uruchamianie przykładów jeszcze przed zakończeniem projektowania funkcji


3

Masz również bardzo dobre frameworki testowe do tworzenia takiego kodu. Jednym z moich ulubionych jest Mockito Jest też EasyMock i inne ... Ale Mockito jest świetne, powinieneś to przeczytać - bardzo elegancki i potężny pakiet


3

To zdanie jest prawie na pewno analogią do etapu budowy domu - „zgaszenia” kanalizacji. Podczas budowy, gdy ściany są jeszcze otwarte, wykonuje się szorstką instalację wodno-kanalizacyjną. Jest to konieczne, aby budowa mogła być kontynuowana. Następnie, kiedy wszystko dookoła jest już gotowe, wraca się i dodaje krany i toalety oraz rzeczywisty produkt końcowy. (Zobacz na przykład Jak zainstalować króciec rurowy ).

Kiedy „wyrzucasz” funkcję w programowaniu, tworzysz jej wystarczająco dużo, aby obejść ją (do testowania lub pisania innego kodu). Następnie wrócisz później i zastąpisz ją pełną implementacją.


0

Zaślepki RPC

  • Zasadniczo kod pośredniczący po stronie klienta jest procedurą, która wygląda dla klienta tak, jakby była wywoływalną procedurą serwera.
  • Kod pośredniczący po stronie serwera wygląda dla serwera tak, jakby był klientem wywołującym.
  • Program klienta myśli, że dzwoni do serwera; w rzeczywistości wywołuje kod klienta.
  • Program serwera myśli, że jest wywoływany przez klienta; w rzeczywistości jest wywoływana przez kod pośredniczący serwera.
  • Odcinki wysyłają do siebie komunikaty, aby wywołać RPC.

Źródło


0

„Usunięcie funkcji oznacza, że ​​napiszesz tylko tyle, aby pokazać, że funkcja została wywołana, pozostawiając szczegóły na później, gdy będziesz mieć więcej czasu”.

Od: SAMS Naucz się C ++, Jesse Liberty i Bradley Jones

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.