2010-03-03 8 views

Odpowiedz

4

Jest to natura interfejsów do zapewnia wiele implementacji, umożliwiając w ten sposób wyśmiewanie.

Szczególnie w testach integracyjnych możesz podać swoją wersję makiety systemu zależności (np. Serwis internetowy). Zamiast faktycznie dzwoni system zależny lub nawet moduł lub skomplikowane i trudne do instancji typu można zapewniają najprostszy wdrożenie interfejsu, która zapewni potrzebne wyniki dla testów jednostkowych, aby zakończyć poprawnie.

Poza tym, podczas korzystania w testowanie jednostkowe, rzeczywiste zależny typ (nazywają to BigGraph) ukrywa skomplikowanego modelu obiektowego za nim, jesteś w rzeczywistości zrobić testowanie integracja nie testów jednostkowych. Twój test może się łatwo zepsuć, jeśli występuje błąd w którymkolwiek z zależnych typów (BigGraph), a nie testowany typ, a więc nie testowanie jednostkowe. Korzystanie z makiet upraszcza ryzyko wystąpienia tego zdarzenia.

Widziałem wiele ciągłych systemów integracji pokazujących dziesiątki błędów dla jednego błędu, kiedy powinny pokazywać jedno, lub co najwyżej kilka, wszystko z powodu zbyt skomplikowanych modeli obiektów i niepoprawnie napisanych testów jednostkowych - nieużywanie makiety.

Dzisiejsze szydercze frameworki są bardziej wyrafinowane (modyfikacja kodu bajtowego itp.) Niż dawniej, więc czasami interfejsy, a nawet metody wirtualne nie zawsze są potrzebne, ale pozwalają na to interfejsy pozbawione zniekształceń.

Interfejsy nie pomogą jeśli obiekt modelu jest zbyt skomplikowane i zaśmiecone (np Twój interfejs opiera się głównie na innych rodzajach/Interfaces); następnie implementacja/kpina wszystko to jest ból.

2

Jeśli nie jesteś związany konkretną implementacją, możesz zmienić zachowanie za interfejsem.

Jeśli Twoje zajęcia implementują interfejsy, możesz drwić z zachowań.

Na przykład nie musisz spamować wszystkich klientów w bazie danych, aby sprawdzić, czy działa algorytm powiadamiania o poczcie. Stworzysz próbę dla swojego interfejsu IMailSender i liczysz tylko liczbę wysłanych e-maili. Następnie przetestujesz rzeczywistą implementację, która faktycznie wysyła wiadomości e-mail na jeden adres e-mail i wiesz, że działa cały proces powiadamiania.

W tym konkretnym przykładzie test używa fałszywej implementacji IMailSender, która zlicza tylko wysłane wiadomości e-mail, a rzeczywisty kod produkcyjny użyje implementacji implementującej IMailSender, która faktycznie wysyła e-maile za pośrednictwem serwera SMTP.

3

Jeśli masz kilka obiektów, które mają inną implementację, ale oferują te same metody na zewnątrz, dzielenie się tymi samymi interfejsami umożliwia napisanie jednego testu jednostkowego i uruchomienie go względem wszystkich implementacji.

Jeśli masz klasę, która mówi, że publikuje materiały na końcu strony internetowej, a następnie pobiera testowanie jednostek odpowiedzi, co może być problematyczne, ponieważ nieudane połączenie internetowe może spowodować niepowodzenie testu. Dlatego definiujesz interfejs dla tej klasy, a następnie możesz napisać drugą implementację, która rejestruje rzeczy, które powinny zostać wysłane i dostarcza poprawną odpowiedź. W ten sposób możesz przetestować klasy, które działają z odpowiedzią z zaplecza bez polegania na połączeniu internetowym podczas testu.

3

Jeśli masz klasę, można mieć wiele zależności jak

  • Insane konstruktorów (wiele argumentów, czy potrzebuje jakieś inne klasy, która potrzebuje trzeciej klasy, która potrzebuje czwartą klasę, która musi poprawnym połączenie z bazą danych)

  • Aby użyć klasy w jakikolwiek sposób, należy go zainicjować poprawnie (na przykład, należy przekazać go kilka innych obiektów, które muszą być ważne, zbyt)

  • Klasa ma stan. Ten stan może się zmienić podczas testu z jakiegoś powodu.

  • Klasa może mieć lub użyj pola statyczne

Te zależności są zazwyczaj nieistotne podczas wielu swoich badań i nie wolałbym mieć do czynienia z nimi.

Za pomocą interfejsu można utworzyć prostą próbną klasę, która implementuje tylko kilka metod, których potrzebujesz. Większość szyderczych frameworków ma wbudowaną obsługę tego. "Wdrożenie" oznacza zwykle "zwracanie ustalonej wartości". W ten sposób możesz szybko zbudować środowisko, którego potrzebuje testowana klasa.

Na przykład, jeśli twoja klasa musi czytać rekordy z bazy danych, możesz zamiast tego udawać, że ResultSet właśnie zwraca wiersze. Dlatego nie musisz mieć prawdziwej bazy danych, nie musisz tworzyć połączenia (które jest powolne i może z wielu powodów zawieść), nie musisz przejmować się danymi w bazie danych (więc trzeba usuwać/upuszczać tabele i wypełniać je ponownie danymi testowymi), itp.

0

Podczas testowania zachowania, które przecina port, posiadanie interfejsu dla adaptera może pomóc w wstrzyknięciu innej implementacji podczas testowania (tj. test double).

Na przykład obiekt DAO, który wywołuje bazę danych lub usługę internetową, może zostać zastąpiony przez implementację, która zwraca zgikłane dane.

Powiązane problemy