2008-10-08 11 views
34

Przeczytałem (i ponownie odczytam) Mocks Aren't Stubs Martina Fowlera. W nim definiuje two different approaches to TDD: "Classical" and "Mockist". Próbuje odpowiedzieć na pytanie "So should I be a classicist or a mockist?", ale przyznaje, że nigdy nie próbował maklera TDD na "czymkolwiek więcej niż zabawkami". Pomyślałem więc, że zadam to pytanie tutaj. Dobre odpowiedzi mogą powtórzyć argumenty Fowlera (ale, miejmy nadzieję, wyraźniej) lub dodać argumenty, o których nie myślał lub które wymyślili inni od czasu, gdy Fowler ostatnio zaktualizował esej w styczniu 2007.Czy powinienem ćwiczyć "mockistę" lub "klasyczną" TDD?

Odpowiedz

34

Nie sądzę, że trzeba wybrać jeden nad drugim. Oba mają swoje zalety i wady i oba są narzędziami do twojej skrzynki narzędziowej. "Mockist" tdd sprawia, że ​​jesteś trochę bardziej elastyczny w tym, co możesz przetestować, podczas gdy klasyczny TDD sprawia, że ​​twoje testy są trochę mniej kruche, ponieważ mają tendencję do patrzenia bardziej na dane wejściowe/wyjściowe, zamiast patrzenia na rzeczywistą implementację. Podczas testowania jednostek typu Mockist wydaje mi się, że więcej testów przerywa przy zmianie implementacji.

Staram się używać klasycznego tdd, gdy tylko jest to możliwe (chociaż często używam szyderczego frameworka do szybkiego przygotowania skrótów). Czasami zauważam, że zaczynam za dużo testować za jednym razem lub potrzebuję zbyt wielu obiektów, aby skonfigurować test. To wtedy testy testowania często pomagają w konfigurowaniu mniejszych testów.

To wszystko jest dość abstrakcyjny więc mam nadzieję, że sens

0

Jestem jeszcze stosunkowo nowy na TDD - ale sposób uczono mnie/wprowadzone do różnic było myśleć o tym w kategoriach testowania integracji pomiędzy klasy i aby nie były zależne od danych na żywo. Na przykład, jeśli mam klasę, która jest prawie niezależna - nie zależy od innych klas, które zbudowałem dla projektu i nie wychodzi do żywego środowiska danych/dev dla danych wejściowych (jak DB lub API do system), wtedy używałbym tylko klasycznych testów jednostkowych w czymś takim jak NUnit lub JUnit - ale kiedy zaczynam testować interakcję pomiędzy klasami zbudowanymi - wtedy to może być naprawdę przydatne do wyśmiewania innych niestandardowych klas i/lub interakcji na zewnątrz - tak, że może wydzielić i przetestować kod aktualnych klas bez prób ścigania potencjalnego błędu w innych klasach, do których dzwonisz.

+0

ma to coś wspólnego z tym ze funkcjonalny vs testów jednostkowych? – ken

19

Pytanie dotyczące klasyka lub klasycznego tdd dotyczy w dużej mierze tego, która część testowanej aplikacji dotyczy. Jeśli masz "standardową" architekturę warstwową (na przykład DDD), warstwa domeny jest zwykle dostosowana do klasycznego tdd, gdzie testujesz jednostkę, ustawiając testowany obiekt, wywołuje kilka metod i sprawdza wynik i/lub stan.

Z drugiej strony podczas testowania usług aplikacji, kontrolerów lub logiki prezentacji , które wymagają więcej pracy koordynującej, szyderstwa lub stubowania są często potrzebne, aby uzyskać dobre testy. Moje doświadczenie jest również takie, że te klasy mają tendencję do wywoływania innych warstw (usługa sieciowa, dane, ...), które naprawdę chcesz udawać lub stubować. Te testy jednostkowe również wymagają więcej kodu instalacyjnego, więc powinieneś tylko kpić, kiedy musisz.

Moja rada to pójść klasycznie, kiedy tylko możesz i udawaj, kiedy musisz.

+0

Czy Twoja odpowiedź nadal obowiązuje dzisiaj - prawie dziesięć lat później? +1. – w0051977

+0

Powiedziałbym tak. Ramy uległy zmianie, ale nadal testuję urządzenia w podobny sposób. – Dala

11

Możesz rozważyć przeglądanie naszej książki pod numerem http://www.growing-object-oriented-software.com/. Obejmuje rozszerzony przykład pracy. Kiedy to pisaliśmy, odkryliśmy, że rozróżnienie między stanem a interakcją jest w dużej mierze mylące, a chodzi bardziej o podejście do projektowania OO.

+0

Link jest uszkodzony. –

+0

naprawiony link do książki –

+5

Mogę polecić książkę Steves. – koen

3

bardzo pragmatyczne podejście zostało wystawione przez Sandi Metz:

Obiekt może komunikować do innych obiektów w wiadomościach wychodzących lub przychodzących. Wiadomości mogą być zapytaniami (zwraca coś) lub poleceniami (wykonuje coś).

Dostępne są cztery kombinacje.Wychodzące komunikaty kwerendy nie powinny być testowane (już testowane jako przychodzące zapytanie klasy zewnętrznej) Można użyć metody testowej mockist do wychodzących wiadomości zapytań i klasycznego testu do reszty. Sprawdź linki

http://jnoconor.github.io/blog/2013/10/07/the-magic-tricks-of-testing-by-sandi-metz/

https://speakerdeck.com/skmetz/magic-tricks-of-testing-ancientcityruby

Youtube

Powiązane problemy