2010-08-03 12 views
5

Mam kod inicjalizacyjny do korzystania z mojego API. Inicjalizacja może się nie powieść i chciałbym ją przetestować w teście NUnit.Testy zależą od powszechnie używanej funkcjonalności z NUnit

Po inicjalizacji można użyć interfejsu API. Testuję również API, ale wszystkie moje metody testowe będą używały tego samego, wspólnego kodu inicjalizacyjnego.

Co bym najlepiej jak jest, jeśli to zachowanie:

  1. Test inicjalizacji jest uruchamiany.
  2. Pozostałe testy są uruchamiane, jeśli [1] się powiedzie.

We wszystkich przypadkach, w których [1] się nie powiedzie, zostaną wykonane wszystkie inne testy. Ale cenną informacją jest to, że [1] się nie udaje. Właśnie tam najprawdopodobniej znajdę problem. Byłoby miło, gdyby inne testy mogły być oznaczone? lub coś, co wskazuje, że nie zostały wykonane, ponieważ zależą od nich funkcjonalności, które nie przeszły testów.

Wiem, że testy nie powinny być kruche. Ale nie mogę ominąć faktu, że kod inicjujący jest niezbędny do poprawnego wykonywania innych funkcji.

Jest to bardziej ogólny problem, gdy niektóre funkcje zależą od innych funkcji. Gdzie "inna funkcjonalność" jest zbyt często używana, aby zapewnić jakąkolwiek prawdziwą wartość, nieudawiąc wszystkich testów w zależności od tego. Byłoby lepiej, gdyby "inną funkcjonalność" testowano osobno.

+0

+1. Moją pierwszą myślą było to, że istniejące testcases obejmujące twoją inicjalizację już działają. Tylko wtedy, gdy dokonasz refaktoryzacji kodu inicjalizacyjnego, będziesz musiał ponownie uruchomić te testery, aż znów staniesz się zielony. Moją drugą myślą było po prostu zamknąć się i spojrzeć na to, co inni wymyślą. Najprawdopodobniej to najlepszy pomysł, jaki miałem dzisiaj. –

+0

Wszystkie przypadki testowe są uruchamiane na naszym serwerze budowania.Zestaw musi być w stanie działać jako całość, ponieważ trudno jest coś przeoczyć, jeśli wykonujesz testy, które Twoim zdaniem mają na ciebie wpływ. Są to testy integracyjne, więc więcej niż jedna klasa jest testowana na raz. – Deleted

+0

dokładnie to, co miałem na myśli, ale nie byłem w stanie właściwie wyjaśnić. –

Odpowiedz

1

Byłem w kontakcie z programistami NUnit. W tej chwili nie jest to możliwe bez napisania dość skomplikowanej wtyczki. Funkcja pojawi się gdzieś w bazie kodu 3.x, ale nie pojawi się w wersji 2.5. Rozważę napisanie tego, ale nie na razie.

2

OK oto jak pójdę na ten temat ...

Put wspólnego inicjalizacji do metody instalacji, ponieważ jej potrzebne dla wszystkich testów. Jeśli inicjalizacji zgłasza błąd, można zobaczyć

  • Wszystkie testy w apartamencie upadającego (które zostały przeszkolone w czasie, aby uznać za wskazówkę, że może setup/porzuca został rzucony wyjątek).
  • ślad stosu dla testów niepowodzeń zawierających metodę instalacji.

Jeśli jest to zbyt niejawne, możesz (chociaż nie polecam go) dodać do tego samego zestawu pusty test z dobrą nazwą. Jeśli ten test jest zielony, możesz być pewien, że Setup/common init zakończył się pomyślnie.

[Test] 
public void VerifySetup() {} 

Aktualizacja: Wydaje się, że masz dość niszowe wymaganie. Nie znam żadnego mechanizmu w NUnit, który określałby taką warunkową realizację testów - np. Uruchom Test2 do 10 tylko wtedy, gdy Test1 przejdzie.

+0

Dziękuję za odpowiedź! Chociaż nie mogę powiedzieć, że identyfikuję to jako odpowiedź na moje pytanie. Więc -1. Dokładnie tego chcę uniknąć. Chcę, aby testy nie były uruchamiane, ponieważ nie zawierają dodatkowych informacji. Jeśli mój test z powszechną funkcjonalnością byłby jedyną wadą (a pozostałe uzyskały stan wykluczony lub coś podobnego), natychmiast doprowadziłbym do wspólnego kodu. Mogą istnieć scenariusze, w których istnieje wiele wspólnego kodu, na przykład w celu użycia różnych części interfejsu API. Aby użyć Instalatora, może pusta metoda wydaje się icky. – Deleted

+1

Z całym szacunkiem się nie zgadzam .. Wszystkie testy zakończone niepowodzeniem w pakiecie testowym dostarczają mi wskazówek, że instalacja/rozpad ma problem. Wyniki stackra pomogą mi to potwierdzić. Jeśli chodzi o ignorowanie testów, jeśli instalacja się nie powiodła, jak to ma znaczenie - po tym, jak wszystkie testy w pakiecie zawiodły, a jeden z testów o specjalnej nazwie zawiodł - faktem jest, że wszystkie testy w pakiecie są zepsute/niefunkcjonalne, a ktoś musi wziąć spojrzenie na to. Nie sądzę, że możesz włączać/wyłączać testy w środowisku wykonawczym w NUnit, przynajmniej nie bez komplikowania kodu testowego .. – Gishu

+0

+1. Nie mogę mówić za NUnit, ale z DUnit na pewno byłoby możliwe uruchomienie testów lub nie, w zależności od wyników innych testów. Widzę 2 problemy z tym, to komplikuje kod testowy, jak wspomniałeś, i w czystym testowaniu jednostkowym, testcases nie powinny być zależne od siebie nawzajem (ściśle mówiąc, nie byłoby to zależnością). –

0

Spróbuj tego:

  1. Określenie "test inicjujących" jako TestCase

  2. Dokonaj wszystkich innych testów podklasę tej TestCase

  3. Tworzenie Suite kursujący swoje testy w określonej kolejności, tak aby twój "test inicjalizacji" był pierwszy.

+0

-1. Nie uniemożliwi to wykonania innych przypadków testowych, jeśli mój test inicjalizacji nie powiedzie się. – Deleted

+0

@ Binary255. "Jeśli mój test ze wspólną funkcją ... [nie powiedzie się], natychmiast doprowadziłby mnie do wspólnego kodu". To rozwiązuje twój problem. Nie musi to być test ** **, chyba że twierdzisz, że nie możesz odczytać logów lub czegoś podobnego. Najwyraźniej masz mózg. Ty ** możesz ** przeczytać dzienniki. Powszechne rzeczy będą wyraźnie oznaczone jako wadliwe. –

+0

Pewnie. Nie sądzę, że to duży problem. Ale nie tego szukam. Chcę, aby niektóre testy zostały zignorowane, jeśli inne zawiodą. Gdyby to było tylko zamówienie, nie mógłbym najpierw umieścić testu inicjalizacyjnego i oddzielić rzeczywisty kod inicjujący od prywatnej (nie testowej) metody pomocniczej? Monitorujemy każdy przypadek testowy i generowanie statystyk. Jeśli kod inicjalizacyjny nie powiedzie się, chcemy, aby to było wyświetlane podczas testowania kodu inicjalizacyjnego. Po teście inicjalizacji testujemy części interfejsu API. Chcemy przeprowadzić testy, gdy mają szansę na odniesienie sukcesu. – Deleted

-1

Myślę, że to całkiem jasne cięcie.Problem polega na tym, że masz trudności z oddzieleniem obowiązków związanych z interfejsem API. Ty masz dwa. Inicjalizacja wykonania API i API. Pisanie testów, aby mieć taki rodzaj zależności, może cię zabić.

Zalecam więc, aby interfejs API utworzył obiekt inicjujący, a następnie różne obiekty poleceń, aby uruchomić interfejs API. Obiekty poleceń będą znajdować się w jakimś sklepie lub można je tworzyć w locie.

Interfejs API użyje wyśmiewanego obiektu inicjalizacyjnego i użyje wyśmianych obiektów poleceń.

Obiekt inicjujący naprawdę nie ma żadnych zależności oprócz tego, co jest potrzebne do zainicjowania.

Obiekty poleceń będą wymagały wyśmiewanego obiektu inicjalizacyjnego.

[EDIT]

Istnieją dwie drogi, aby uzyskać inne testy na niepowodzenie, jeśli test inicjalizacji nie

  1. Dodaj zmiennej prywatnej przypadku testowego. private isInitialized = false;. Następnie wszystkie inne testy sprawdzają stan tej zmiennej, jeśli nie są prawdziwe, a następnie zawodzą.

  2. Poszerz swoją walizkę testową o klasę API. Dodaj prywatną funkcję, która analizuje stan inicjalizacji.

Odkurzacz z nimi jest 2. Najszybszy realizacja to 1.

IMHO Może to być zapach kod kiedy trzeba kilka swoich badań w taki sposób. Jeśli, jak powiedziałeś, jest to test integracyjny. Dlaczego masz osobny test do inicjalizacji. Integracja polega bardziej na uruchomieniu akcji przeciwko Twojemu API. Dlatego każdy test integracyjny musi zainicjować interfejs API.

Może zajść potrzeba ponownego przemyślenia scenariusza awarii kaskady. Może to być zbyt duży hałas po zakończeniu testów.

[EDIT1a]

Jedynym sposobem, widzę, aby zaspokoić wymagania jest extend NUnit. W szczególności zajrzyj do producentów obudów testowych i Dekoratory testowe.

Link jest datowany na marzec 2008, więc mam nadzieję, że nie jest już nieaktualny.

+0

-1. Kiedy piszę test integracji, nie chcę niczego drwić. Byłoby inaczej, gdybym napisał test jednostkowy. A czasami rzeczy muszą być wykonane w kolejności, nie zawsze jest to oznaką złego projektu. – Deleted

+0

@ Binary255 - Niestety nie widzę żadnych istotnych informacji dotyczących testowania integracji. Twój tag to testowanie jednostkowe. Zobacz moją edycję po więcej ... – Gutzofter

+0

Ach, przepraszam za to. Zauważam teraz, że nie wspominałem, że przeprowadzam testy integracji w dowolnym miejscu. :-(Zmieniono znacznik – Deleted

Powiązane problemy