Co To jest wyśmiewanie?

Co To jest wyśmiewanie?                                                                                                    .

Author: nes1983, 2010-04-19

8 answers

Prolog: jeśli spojrzysz na rzeczownik mock w słowniku znajdziesz, że jedną z definicji tego słowa jest coś stworzonego jako imitacja .


Szyderstwo jest stosowane przede wszystkim w testach jednostkowych. Testowany obiekt może mieć zależności od innych (złożonych) obiektów. Aby wyizolować zachowanie obiektu, należy zastąpić inne obiekty mockami, które symulują zachowanie rzeczywistych obiektów. Jest to przydatne, jeśli rzeczywiste obiekty są niepraktyczne do włączenie do testu jednostkowego.

Krótko mówiąc, wyśmiewanie to tworzenie obiektów, które symulują zachowanie rzeczywistych obiektów.


Czasami warto rozróżnić wyśmiewaniew przeciwieństwie do stubowanie. Może być trochę niezgody na ten temat, ale moja definicja stub jest" minimalnym " symulowanym obiektem. Element wstępny implementuje zachowanie na tyle, aby umożliwić testowanemu obiektowi wykonanie testu.

Mock jest jak stub, ale test również sprawdź, czy testowany obiekt wywołuje makietę zgodnie z oczekiwaniami. Częścią testu jest sprawdzenie, czy makieta została użyta prawidłowo.

Aby podać przykład: możesz stubować bazę danych, implementując prostą strukturę w pamięci do przechowywania rekordów. Testowany obiekt może następnie odczytywać i zapisywać rekordy do bazy danych, aby umożliwić mu wykonanie testu. Może to przetestować pewne zachowanie obiektu niezwiązanego z bazą danych, a stub bazy danych zostanie dołączony tylko po to, aby test uciekaj.

Jeśli zamiast tego chcesz zweryfikować, czy testowany obiekt zapisuje określone dane do bazy danych, będziesz musiał naśmiewać się z bazy danych. Twój test będzie następnie zawierać twierdzenia o tym, co zostało napisane do makiety bazy danych.

 461
Author: Martin Liversage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-25 08:49:13

Inne odpowiedzi wyjaśniają, czym jest wyśmiewanie. Pozwól, że przedstawię ci przykład . I uwierz mi, to jest o wiele prostsze niż myślisz.

Tl; dr to podklasa oryginalnej klasy. Ma inne dane wtryskiwane, więc unikasz testowania wtryskiwanych części i wyłącznie skup się na testowaniu reszty kodu.


Załóżmy, że piszesz aplikację na iOS i masz połączenia sieciowe.Twoim zadaniem jest przetestowanie twojego podania. Na przetestuj/określ, czy połączenia sieciowe działają zgodnie z oczekiwaniami, nie jest twoim obowiązkiem . Testowanie jest obowiązkiem innej strony (zespołu serwerów). Musisz usunąć tę zależność (sieciową) i nadal testować cały kod, który działa wokół.

Połączenie sieciowe może zwracać różne kody statusu 404, 500, 200, 303 itd. z odpowiedzią JSON.

Twoja aplikacja ma działać dla wszystkich z nich (w przypadku błędów, Twoja aplikacja powinna wyrzucić swoje oczekiwane błąd). To, co robisz z wyśmiewaniem, to tworzenie "wyimaginowanych-podobnych do rzeczywistych" odpowiedzi sieciowych (jak kod 200 z plikiem JSON) i testowanie kodu bez "wykonywania rzeczywistego połączenia sieciowego i czekania na odpowiedź sieciową". Ręcznie kodujesz / zwracasz odpowiedź sieciową dla wszystkich rodzajów odpowiedzi sieciowych i sprawdzasz, czy Twoja aplikacja działa zgodnie z oczekiwaniami. (ty nigdy nie zakładaj / testuj 200 z błędnymi danymi, ponieważ to nie jest twoja odpowiedzialność, Twoim obowiązkiem jest przetestowanie Aplikacja z poprawnym 200 lub w przypadku 400, 500, sprawdzasz, czy aplikacja wyrzuca prawidłowy błąd)

To tworzenie urojone-podobne do rzeczywistego znane jest jako wyśmiewanie.

Aby to zrobić, nie możesz użyć oryginalnego kodu (twój oryginalny kod nie ma wcześniej wstawionych odpowiedzi, prawda?). Musisz dodać coś do niego, wstrzyknąć / wstawić te atrapy danych, które nie są normalnie potrzebne (lub część twojej klasy).

So you subclass the oryginalna klasa i dodać cokolwiek (tutaj jest HTTPResponse sieci, dane lub w przypadku awarii, przekazać poprawne errorString, HTTPResponse) trzeba go, a następnie "przetestować podklasę" czyli wyśmiewany klasy.
Nie testujesz już oryginalnej klasy. Podklasa jest testowana w imieniu oryginalnej klasy

Krótko mówiąc, wyśmiewanie polega na uproszczeniu i ograniczeniu tego, co testujesz, a także nakarmieniu tego, od czego zależy Klasa. W w tym przykładzie można uniknąć testowania sieć nazywa siebie, a zamiast tego przetestować czy aplikacja działa zgodnie z oczekiwaniami z wstrzykiwanymi wyjściami/odpowiedziami -- przez wyśmiewając klasy

nie trzeba dodawać, że każdą odpowiedź sieci testujesz osobno.


Teraz pytanie, które zawsze miałem w głowie, brzmiało: Kontrakty / punkty końcowe i zasadniczo odpowiedź JSON moich interfejsów API są stale aktualizowane. Jak mogę napisać jednostkę testy, które biorą to pod uwagę?

Aby rozwinąć więcej na ten temat: powiedzmy, że model wymaga klucza / pola o nazwie username. Przetestujesz to i zdasz egzamin. 2 tygodnie później backend zmienia nazwę klucza na id. Twoje testy nadal przechodzą. prawda? czy nie?

Czy jest to odpowiedzialność programisty zaplecza, aby zaktualizować mocks. Czy powinno być częścią naszej umowy, że dostarczają zaktualizowane kpiny?

Odpowiedź na powyższy problem brzmi: testy jednostkowe + proces rozwoju jako programista po stronie Klienta powinien / mógłby złapać nieaktualną wyśmiewaną odpowiedź. Jeśli zapytasz mnie jak? odpowiedź brzmi:

Nasza rzeczywista aplikacja zawiedzie (lub nie zawiedzie jeszcze nie ma pożądanego zachowania) bez użycia zaktualizowanych interfejsów API...jeśli to się nie powiedzie...wprowadzimy zmiany w naszym kodzie deweloperskim. Co ponownie prowadzi do niepowodzenia naszych testów....co będziemy musieli poprawić. (Właściwie, jeśli mamy poprawnie wykonać proces TDD, nie powinniśmy pisać żadnego kodu o polu, chyba że napiszemy dla niego test...oraz zobacz, że się nie powiedzie, a następnie idź i napisz dla niego rzeczywisty kod rozwoju.

To wszystko oznacza, że backend nie musi mówić: "Hej, zaktualizowaliśmy mocki" ... to W końcu dzieje się poprzez rozwój/debugowanie kodu.ّ Ponieważ to wszystko jest częścią procesu rozwoju! Chociaż jeśli backend zapewnia wyśmiewaną odpowiedź dla Ciebie, jest to łatwiejsze.

Mój cały punkt w tym jest nieefektywne, aby wymyślić jakiś skrypt, aby uzyskać zaktualizowaną makietę interfejsów API. Ani umieszczenie 100% twój wysiłek na uzyskanie rzeczy zrobić automatycznie i bez jakiejkolwiek ludzkiej interakcji jest to, co TDD jest o. Częścią procesu jest ręczne aktualizacje Jsonów i krótkie spotkania, aby upewnić się, że ich wartości są aktualne.

ten dział został napisany dzięki luźnej dyskusji w naszej grupie CocoaHead meetup


Tylko dla programistów iOS:

Bardzo dobrym przykładem wyśmiewania jest ta praktyczna rozmowa Nataszy zorientowana na protokół Muraschev po prostu przejdź do minuty 18: 30.

Bardzo podoba mi się ta część z transkrypcji:

Ponieważ to jest testowanie...chcemy mieć pewność, że funkcja get z Gettable jest wywoływana, , ponieważ może zwracać i funkcja może teoretycznie przypisać tablicę artykułów spożywczych z dowolnego miejsca. My trzeba się upewnić, że jest wywołana;

 36
Author: Honey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-06 18:23:46

Jest mnóstwo odpowiedzi na SO i dobrych postów w sieci o wyśmiewaniu. Jednym z miejsc, które warto zacząć szukać, jest post Martina Fowlera Mocks are ' T Stubs , w którym omawia wiele pomysłów na wyśmiewanie.

W jednym akapicie-Mocking jest jedną z technik pozwalających na testowanie jednostki kodu, która nie jest zależna od zależności. Ogólnie rzecz biorąc, to, co odróżnia mocking od innych metod, to to, że mock obiekty używane do zastępowania zależności kodu będą Pozwól na ustawienie oczekiwań-obiekt będzie wiedział, jak ma być wywołany przez Twój kod i jak zareagować.


Twoje oryginalne pytanie wspominało o TypeMock, więc zostawiłam odpowiedź na to poniżej:

TypeMock jest nazwą komercyjnego frameworka szyderczego .

Oferuje wszystkie funkcje darmowych frameworków, takich jak RhinoMocks i Moq, a także kilka bardziej zaawansowanych opcji.

Czy potrzebujesz TypeMock jest wysoce dyskusyjne - możesz zrobić większość kpi z darmowych bibliotek kpiących, a wielu twierdzi, że możliwości oferowane przez TypeMock często odciągają cię od dobrze zamkniętego projektu.

Jak stwierdzono w innej odpowiedzi "TypeMocking" nie jest w rzeczywistości zdefiniowanym pojęciem, ale może być rozumiane jako typemocking, który oferuje TypeMock, używając profilera CLR do przechwytywania wywołań. Net w czasie wykonywania, dając znacznie większą zdolność do fałszywych obiektów (Nie wymagania, takie jak interfejsy lub wirtualne metody).

 26
Author: David Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-30 11:35:10

Mock jest metodą / obiektem, który symuluje zachowanie rzeczywistej metody / obiektu w kontrolowany sposób. Makiety obiektów są używane w testach jednostkowych.

Często metoda testowa wywołuje inne zewnętrzne usługi lub metody wewnątrz niej. Są to tzw. zależności. Po wyśmianiu zależności zachowują się tak, jak je zdefiniowaliśmy.

Z zależnościami kontrolowanymi przez mocks, możemy łatwo przetestować zachowanie metody, którą zakodowaliśmy. To testy jednostkowe.

Co to jest przeznaczenie makiety obiektów?

Mocks vs stubs

Testy jednostkowe vs testy funkcjonalne

 5
Author: Venkat Kotra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:54

Celem wyśmiewania typów jest zerwanie zależności w celu wyizolowania testu do określonej jednostki. Stuby są prostymi surogatami, podczas gdy mocki są surogatami, które mogą zweryfikować użycie. Framework mocking to narzędzie, które pomoże Ci generować stuby i mocki.

EDIT: skoro w oryginale mowa jest o "typowaniu", odniosłem wrażenie, że odnosi się to do Typemocka. Z mojego doświadczenia wynika, że ogólne określenie to po prostu "wyśmiewanie". Prosimy o zignorowanie poniższych informacji konkretnie na TypeMock.

TypeMock Isolator różni się od większości innych szyderczych frameworków tym, że działa on w locie. Pozwala to na makiety typów I instancji, których większość innych frameworków nie może makiety. Aby wyśmiewać te typy/instancje z innymi frameworkami, musisz podać własne abstrakcje i wyśmiewać je.

TypeMock oferuje dużą elastyczność kosztem czystego środowiska uruchomieniowego. Jako efekt uboczny sposobu, w jaki TypeMock osiąga swoje wyniki, będziesz czasami uzyskują bardzo dziwne wyniki podczas korzystania z TypeMock.

 4
Author: Brian Rasmussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-19 11:46:14

Myślę, że użycie typemock isolator mocking framework byłoby TypeMocking.

Jest to narzędzie, które generuje mocki do wykorzystania w testach jednostkowych, bez konieczności pisania kodu z myślą o IoC.

 2
Author: Oded,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-19 07:39:11

Mocking to generowanie pseudo-obiektów symulujących rzeczywiste zachowanie obiektów do testów

 2
Author: LOL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-14 19:05:36

Jeśli twój mock wiąże się z żądaniem sieciowym, inną alternatywą jest posiadanie prawdziwego serwera testowego do trafienia. Za pomocą tej usługi można wygenerować żądanie i odpowiedź na testy. http://testerurl.com/

 1
Author: foobar8675,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-20 18:19:28