Czy powinienem używać try catch w moich metodach testowych?


18

Robię testy jednostkowe.

Próbuję przetestować jedną funkcję.

Nazywam to z mojego komponentu testowego. Ale jeśli zdalna funkcja nie może obsłużyć wyjątku, mój komponent testujący również dostanie wyjątek, tak myślę.

Czy powinienem się martwić o uzyskanie wyjątku w moim komponencie testera?

Dzięki.

EDYTOWAĆ:

PS:

Zgłoszenie błędu jest dobre, ale tylko w przypadku innych funkcji, nie do użytkowników końcowych, dopóki nie jest to ostatnia opcja!

OMG Napisałem wycenę programowania !!


Jestem nowy w testowaniu i powinienem tylko testować zachowanie funkcji. Myślę, że nazywa się to testowaniem blackbox i whitebox. Och, pamiętam to. Studiowałem to na studiach!
Vikas,

Z jakiego języka i frameworku xUnit korzystasz konkretnie? W niektórych przypadkach twierdziłbym, że tak.
Greg K,

Używam MXUnit z MockBox i ColdBox dla języka ColdFusion.
Vikas,

Odpowiedzi:


23

Krótka odpowiedź: NIE.

Nie wychwytuj wyjątków w testach jednostkowych. Testujesz jednostki, aby znaleźć błędy i sytuacje, w których zgłaszane są wyjątki.

Struktura testów jednostkowych powinna obsługiwać wyjątki w rozsądny sposób. Większość (jeśli nie wszystkie) frameworki xUnit mają konstrukcję umożliwiającą oczekiwanie pewnych wyjątków, których używasz, gdy chcesz wywołać określony warunek wyjątku w testowanym systemie i mają pozytywny wynik testu, jeśli oczekiwany wyjątek zostanie zgłoszony, ale zawiodą, jeśli nie.


Myślę, że zaawansowana platforma testowania bardzo dobrze radzi sobie z wyjątkami, nawet uważam, że w Visual Studio możemy testować wyjątki, tak jak powiedziałeś „oczekiwany wyjątek”. Więc dobrze jest wiedzieć i dzielić się. Dzięki ..
Vikas

Czasami chcesz sprawdzić, czy zgłoszony został wyjątek, ponieważ dobre testy nie sprawdzają tylko przypadków, w których rzeczy działają, ale także przypadków, gdy zawodzą.
deadalnix,

1
CHCESZ wychwytywać wyjątki, tak jak TY chcesz przetestować sytuacje, w których zdarzają się wyjątki (szczególnie własne wyjątki). Jeśli napiszesz kod, który w pewnych warunkach ma się nie powieść z wyjątkiem, warunki te powinny być częścią zestawu testów, a zatem powinny zostać przetestowane. W ramach tych testów wyjątki te powinny zostać wychwycone i przeanalizowane.
jwenting

1
@Jwenting Przeczytaj drugi akapit - Ramy testów jednostkowych wychwytują wyjątki i zezwalają na zaliczenie testów, jeśli pewne wyjątki zostaną zgłoszone, a jeśli nie,
zakończą się niepowodzeniem

5

(W przeciwieństwie do odpowiedzi Mcottle'a) Długa odpowiedź: NIE ... przez większość czasu

Kiedy powiesz, że spodziewasz się, że test zgłosi określony wyjątek, będziesz wiedział, kiedy DOWOLNA linia w tym teście zgłosi ten wyjątek.

To nie całkiem to samo, co wiedząc, że testowana metoda zgłasza wyjątek.

Jeśli Twój test obejmuje ustawienie obiektu lub kontekstu (w ramach testu, a nie w twojej wersji frameworka SetUp ), lepiej opuść pojedynczą linię, którą faktycznie chcesz przetestować w try / catch, być może z pomocą pomocnika.

Na przykład,

public static class AssertHelper {
    public delegate void Thunk();

    public static void DoesNotThrow<T>(Thunk thunk, string message = "")
        where T: Exception {
        try {
            thunk.Invoke();
        } catch(T) {
            Assert.Fail(message);
        }
    }
}

i wtedy

[TestMethod]
public void assertHelperInAction() {
    // Random setup stuff here that's too annoying to put in my SetUp
    // method.
    AssertHelper.DoesNotThrow<IllegalArgumentException>(() =>
        {/* My random method under test */})
}

Jeśli ten test się nie powiedzie, wiem, że moja testowana metoda zgłosiła wyjątek, a nie coś w przypadkowej konfiguracji.

(Powinieneś unikać losowych ustawień instalacyjnych. Czasami łatwiej jest mieć jakiś kod instalacyjny w teście).


Dobry przykład! Staram się bardzo ostrożnie ograniczać fazę „testu” tylko do testu precyzyjnego, ale zapamiętam tę sztuczkę, gdy po prostu nie mogę znaleźć sposobu, aby to osiągnąć (np. Podczas testowania warunków wyścigowych i trzeba „ustawić” blisko „testu”, aby spełnić warunek).
Ethel Evans

1

Ogólnie rzecz biorąc, powinieneś po prostu zwolnić wyjątek, a środowisko testowe da ci fajny raport ze wszystkimi potrzebnymi informacjami.


Jednak w metodyce TDD oczekuje się, że wykonamy następujące kroki:

  1. Napisz test
  2. Zobacz, jak zawodzi, i spraw, aby błąd był zrozumiały
  3. Popraw kod
  4. Przeanalizuj kod i test

Po zwolnieniu wyjątku, jeśli błąd jest wyraźny, jest w porządku. Ale czasami wyjątek jest niejasny, a nawet mylący. Jak mogłeś pozwolić, by znalazło się to w twoim kodzie (dla ciebie później, kiedy zapomnisz lub dla członka zespołu, który straci dużo czasu na rozwikłanie problemu)? Zatem moja zasada brzmi: „ Jeśli konieczne jest usunięcie awarii, musisz złapać wyjątek ”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.