Często mówi się, że interfejsy sprawiają, że kpiny i testy jednostkowe są łatwiejsze. Jak pomagają w tym interfejsy?W jaki sposób interfejsy ułatwiają testowanie jednostkowe i kpiny?
Odpowiedz
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.
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.
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.
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.
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.
- 1. W jaki sposób wdrażasz testowanie jednostkowe w dużych projektach C++?
- 2. Testowanie jednostkowe javascript: w jaki sposób monitorujesz wszystkie testy, które napisałeś i jaki masz zasięg kodu?
- 3. Wiosna jdbcTemplate testowanie jednostkowe
- 4. Cel C - Testowanie jednostkowe i Wyśmiewanie obiektu?
- 5. Testowanie jednostkowe z Oracle
- 6. Testowanie jednostkowe - odgałęzienie SqlDataReader
- 7. Kiedy należy przerwać testowanie jednostkowe?
- 8. Testowanie jednostkowe dla projektów iOS
- 9. Yii testowanie jednostkowe działanie kontrolera bez selenu
- 10. W jaki sposób mogę testować widoki jednostkowe i atrybuty autoryzacyjne mojej aplikacji mvc asp.net w nUnit?
- 11. W jaki sposób weryfikujesz interfejsy oparte na kaczkach w pythonie?
- 12. Testowanie jednostkowe kodu C++ za pomocą Javy
- 13. Testowanie jednostkowe z tSQLt na kolumnach obliczeniowych
- 14. Połączyć kodowane interfejsy użytkownika Testowanie dzienników HTML?
- 15. Testowanie jednostkowe za pomocą Moq, Silverlight i NUnit
- 16. W jaki sposób interfejsy Java są implementowane wewnętrznie? (vtables?)
- 17. W jaki sposób publiczne interfejsy API zarządzają obciążeniami?
- 18. Testowanie jednostkowe kontrolera korzystającego z $ http
- 19. Używanie django-nose i django-selekcji razem - testowanie jednostkowe
- 20. Jednostkowe i funkcjonalne testowanie aplikacji opartej na PySide?
- 21. testowanie jednostkowe klas abstrakcyjnych i chronionych metod wewnątrz nich
- 22. Metoda prywatna Testowanie jednostkowe z Jasmine
- 23. Testowanie jednostkowe w Spring and the Jersey Test Framework
- 24. Złap lib (testowanie jednostkowe) i CTest (CUpewnij) integracja
- 25. Python - ułatwiają powtarzane if
- 26. Domyślne metody i interfejsy rozszerzające inne interfejsy
- 27. Scala: Kpiny i wzór ciasta
- 28. Testowanie jednostkowe Aplikacje sprężynowe z wykorzystaniem specyfikacji Scala
- 29. Testowanie jednostkowe (nie Qt) kodu C++ w Qt Creator?
- 30. Testowanie jednostek w CSLA? W jaki sposób? Co?
Zobacz objaśnienie dynamicznych makiet: http://stackoverflow.com/questions/1972831/to-mock-an-object-does-it-have-to- be-either-implementing-an-interface-lub- oznaczone/1973482 # 1973482 –