2010-08-18 14 views
5

Wiem, że to pytanie jest częścią kawałka wojny religijnej, ale mam następującą sytuację: mam obiektu, Responder który wywołuje metodę na obiekcie Updater w odpowiedzi na różne zdarzenia. Niedawno oddzieliłem testy w ten sposób: testy oparte na stanie dla samej metody Updater i testy oparte na zachowaniu dla Responder, która je wywołuje. Oznacza to, że próbuję Updater w testach Responder, tylko w celu zapewnienia, że ​​jest wywoływana.Zachowanie wobec państwa Based Testing

Czy nadal powinienem testować stan obiektów, które mają zostać zaktualizowane w testach Responder, a nie kpić z Updater? Podoba mi się to, co zrobiłem, ponieważ wymaga mniejszej konfiguracji i wydaje się, że lepiej izoluje testy. Wydaje się to jednak wiązać implementację i oczekiwane zachowanie Responder z Updater. Czy to zbyt kruche? To jest uproszczony przykład.

+0

Jaki rodzaj testów w zadowalający sposób podniesie poziom komfortu, z którego korzysta kod? Czy wystarczy test integracji? –

+0

Przypuszczam, że test integracyjny, który łączy to wszystko razem, zwiększy moją pewność siebie. Chciałbym jednak również wiedzieć, czy ludzie myślą, że jest to ważny sposób testowania na poziomie jednostki. –

Odpowiedz

8

Gdybym nie rozumiem Twoje pytanie, czego naprawdę potrzebujesz co najmniej dwa poziomy testowania:

  1. testów jednostkowych, gdzie próbują testować tylko jedną klasę i makiety wszystkich zależności (a więc w przypadku Należy tutaj wyśmiewać aktualizatora). Testy te pomagają w opracowaniu kodu (szczególnie jeśli korzystasz z TDD), upewnij się, że klasa zachowuje się zgodnie z przeznaczeniem, a nawet dokumentuje zachowanie tej klasy. Niemal każda klasa powinna mieć testy jednostkowe. Jednak, jak zauważyłeś, nawet jeśli masz 100% pokrycia testowego, nie masz gwarancji, że Twój program działa, a nawet uruchamia się!

  2. Akceptacja, integracja i testy end-to-end - testy te obejmują całą aplikację lub duże moduły i sprawdzają, czy wszystko działa razem. Ogólnie rzecz biorąc nie używasz makiet na tym poziomie (możesz jednak zablokować cały moduł/usługę internetową, zależnie od kontekstu). Testy te nie muszą sprawdzać każdego szczegółu implementacji (i nie powinny), ponieważ odbywa się to za pomocą testów jednostkowych. Dbają o to, aby wszystko było poprawnie połączone i współpracować. W twoim przypadku nie udałoby ci się sfotografować Updater.

Podsumowując, wydaje mi się, że naprawdę trzeba zrobić oba, aby odpowiednio przetestować swoją aplikację.

0

Myślę, że to zależy od tego, co/jak próbujesz przetestować.

Jeśli nie masz żadnej zależności w klasie Updater, nie ma innej możliwości niż przetestowanie jej stanu po wywołaniu testowanej metody. Jeśli istnieje jakaś zależność, możesz przetestować jej zachowanie, co do tego, co powinien zrobić (wywołując inne metody na innych klasach).

Odwrotnie, może to dotyczyć również klasy Responder. Możesz sprawdzić jego stan lub przetestować jego zachowanie tak jak przed chwilą. Testując jego stan, najprawdopodobniej użyjesz prawdziwej implementacji Aktualizatora, a nie wyśmiejesz go, lub użyjesz kodu pośredniczącego w swoim miejscu, który ma tylko minimum.

Podczas testowania zachowania i kpiny z wielu rzeczy, jeszcze bardziej konieczne jest przeprowadzenie testów akceptacji (regresja/integracja/koniec-koniec) w celu utworzenia kopii zapasowej testów jednostkowych, tak jak wspomina Grzenio. (Wygląda na to, że jest testerem "mockist" (behawioralnym))

Podczas przeprowadzania testów opartych głównie na stanie, używasz bardziej rzeczywistych implementacji i ich interakcji, a potrzeba ich utworzenia jest mniej istotna. Nie jest to jednak sposób na całkowite ich odrzucenie. Po prostu masz już pewną regresję/integrację w swoich testach.

Myślę, że nie powinieneś zbytnio rozdzielać testów, ponieważ może to ułatwić załamanie się rzeczy.

Nota prawna: Nie jestem guru tdd i nie popieram jednego z nich. Dobre informacje o zachowaniu klasycznym i zachowaniu można znaleźć w Internecie. Martin Fowler ma dobry punkt wyjścia na ten temat: Mocks Aren't Stubs

Obecnie czytam Growing Object Oriented Software, kierując się testami i pochylam się ku stronie mockist ogrodzenia. Ale myślę, że po obu stronach jest mały szary obszar.