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
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
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.
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.
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.
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
- 1. Czy jako "mockista" praktykujący TDD powinienem wyśmiewać inne metody w tej samej klasie, co testowana metoda?
- 2. Testowanie rozwoju opartego na iOS ... na TDD lub nie na TDD
- 3. Jak profilować klasyczną stronę ASP?
- 4. TDD i wyśmiewanie TcpClient
- 5. Architektura MVC + WCF + TDD lub DDD
- 6. Czy powinienem używać System.out.println() lub czegoś innego?
- 7. Czy powinienem używać odbiornika lub obserwatora?
- 8. czy powinienem używać urandom lub openssl_random_pseudo_bytes?
- 9. Czy powinienem używać nav lub ul
- 10. Czy powinienem się nauczyć Express.js lub Sails.js?
- 11. Czy powinienem używać dziedziczenia lub kompozycji?
- 12. Czy powinienem używać tutaj awakeFromNib lub initWithCoder?
- 13. Python - Czy mogę (lub powinienem) zmienić os.path.sep?
- 14. Java: Czy powinienem używać float lub Float?
- 15. Czy powinienem używać tsd lub typowania?
- 16. Czy powinienem używać libC++ lub libstdC++?
- 17. Czy powinienem używać rand() lub rand_s()?
- 18. Jak ćwiczyć formułę Haversine w ColdFusion
- 19. TDD z niejasnymi wymaganiami
- 20. TDD dla aplikacji OSX
- 21. Czy powinienem odkażać przecenę?
- 22. Pierwsze kroki z TDD?
- 23. Jaką klasyczną ścieżkę potrzebuję w Ant taskdef?
- 24. Czy powinienem ozdobić funkcję?
- 25. Dlaczego powinienem lub nie powinienem używać API camera2 w Androidzie?
- 26. Wymagana infrastruktura dla TDD?
- 27. Jaki jest najlepszy argument, aby przekonać programistów do nauki TDD?
- 28. F #: Jak napisać klasyczną funkcję zamiany?
- 29. Pobierz klasyczną zmienną ASP z posta JSON
- 30. Czy powinienem używać funkcji php mail lub phpmailer?
ma to coś wspólnego z tym ze funkcjonalny vs testów jednostkowych? – ken