2009-09-26 13 views
8

Mam tę metodę w mojej klasie dostępu do danych i mam test jednostki, aby upewnić się, że działa poprawnie, ale mój test nie testuje wyjątku, więc moje pytanie jest czy powinienem utworzyć nowy test, aby wymusić wyjątek czy powinienem zaufać, że blok catch będzie działał dobrze w przypadku wyjątku? czy to jest warte wysiłku?Czy muszę wymuszać wyjątki, aby je przetestować?

Oto przykład:

public void UpdateProject(Project project) 
    { 
     using (var transaction = _session.BeginTransaction()) 
     { 
      try 
      { 
       _session.Update(project); 
       _session.Flush(); 
       transaction.Commit(); 
      } 
      catch (HibernateException) 
      { 
       transaction.Rollback(); 
       throw; 
      } 
     } 
    } 

Odpowiedz

11

Idealnie, należy spróbować przetestować każdą linijkę kodu, który można ... Oznaczałoby to, zmuszając wyjątek występuje do testowania obsługi wyjątku, i upewnić się, to działa poprawnie.

W praktyce zawsze będzie kilka linii kodu nie objętych - jednak wymuszałbym wyjątki przez kpiny w celu przetestowania obsługi wyjątków, która Twoim zdaniem jest krytyczna, szczególnie, lub która może się wydarzyć podczas produkcji.

+5

Zawsze fajnie jest debugować problem produkcyjny, w którym awaria znajduje się w bloku catch – Mark

+2

Jeśli to tylko rejestracja i ponowne wyrzucanie, nie zawracałbym sobie głowy. Prawdopodobnie. Dopóki testowałem logowanie w innym miejscu. Jeśli robi coś ważnego, zrobiłbym to. – serialhobbyist

+2

Tak - chociaż wycofanie transakcji może być (nie zawsze) bardzo ciężkim procesem, który, jak sądzę, powinien zostać przetestowany. W tym przypadku najprawdopodobniej przetestuję to. –

3

Możesz wysłuchać sesji, przedstawiając wyjątek, ale nie ma potrzeby sprawdzania, czy działa haczyk.

Nie jest źle napisać test, aby sprawdzić, czy transakcja zostanie wycofana, jeśli aktualizacja zgłasza wyjątek, ale na poziomie jelitowym uważam, że to za dużo.

Być może uzasadnia to bardziej rozbudowany przypadek.

Czy na dodatkowej notatce nie można wycofywać zmian w przypadku żadnego wyjątku?

1

Z nazwy wyjątku (HibernateException) uważam, że nie jest to wyjątkowy przypadek. Tak może się zdarzyć podczas normalnej pracy. W takim przypadku powinienem wykonać test, który spowoduje, że wyjątek sprawi, że zostanie poprawnie obsłużony.

9

W jądrze Linuksa 80% błędów w sterownikach jest w kodzie obsługi błędów.

Wyjątkowa obsługa jest źródłem wielu błędów, a na pewno należy przetestować wszystkie ścieżki wyjątków pod numerem.

Oczywiście nie można przetestować każdej linii kodu. Jednak statystyki mówią, że programiści zwracają mniejszą uwagę na obsługę wyjątków, więc musisz je dokładnie przetestować.

3

Mam nadzieję, że transakcja będzie Rollback, jeśli Displose() zostanie wywołana przed Commit(), więc czy w ogóle potrzebujesz haczyka?

Jeśli chodzi o inne przypadki, jeśli Twój połów ma więcej niż po prostu zaloguj problem, myślę, że powinien być testowany jednostkowo. Jednak nie pozwól, aby fakt, że nie możesz wykonywać testów jednostkowych zysku, powstrzymuje cię od przeprowadzenia testów jednostkowych.

1

Na pewno przetestuję każdy wyjątek, który jest przechwytywany i obsługiwany. Przynajmniej masz jakąś ścieżkę wykonawczą przez twój kod obsługi, który powinien dać ci pocieszenie, że nic dziwnego się nie stanie, gdy/kiedykolwiek spotkasz się z takim wyjątkiem w czasie wykonywania.

Pamiętaj, że musisz tylko przetestować kod, który chcesz pracować.

1

Mam nadzieję, że osobno przetestujesz transaction.Rollback() za pomocą testów, które wyczerpią wszystkie możliwe sytuacje, jakie możesz wymyślić. Jednak pod warunkiem, że testy były wyczerpujące, prawdopodobnie nie zawracałbym sobie głowy zgłaszaniem wyjątków, ponieważ nie ma w nich nic więcej.

4

Oto moje zasady idealnego badania zachowań awarii:

  • Jeśli używasz zależności, które mogą rzucać wyjątki, to należy obejmować testy jednostkowe że Nakręć mocks z nich rzucać wyjątki.
  • Jeśli pod pewnymi warunkami twój kod powinien wyrzucić wyjątek, powinieneś dołączyć testy jednostkowe, które ustanawiają takie warunki.

Pierwszy pozwala wiedzieć, co twój kod zachowuje się pod awarii zewnętrznej, a często prowadzi do zmian decyzji, co zrobić. We wszystkich sytuacjach dobrze jest zobaczyć, co się właściwie dzieje. Drugi tylko upewnia się, że dotrzymasz obietnic, jeśli chodzi o błędy, które Twój kod powinien wykryć i uznają za wyjątkowe. Nie różni się to od testowania innych funkcji w kodzie.

Przed przystąpieniem do zaliczenia zestawu testów jednostkowych należy zapoznać się z numerem kodowanego kodu kodu będącego przedmiotem testu. W przypadku nietrywialnego kodu prawie zawsze istnieje jeden sposób, w jaki moja gałąź kodu nie sprawdza moich testów jednostkowych lub, co gorsza, zachowań, których nie zamierzałem. Zaskakująco często rozwiązaniem jest usunięcie tego kodu, zamiast dodawania kolejnych testów. Po prostu pozostawiony w tyle, kiedy wcześniej go skrzydłowałem.

Niekoniecznie mówię, że należy osiągnąć 100% pokrycia, ale należy wykonać testy jednostkowe z pokryciem kodu, ponieważ jest to bardziej wizualny sposób na zrozumienie i ujawnienie zachowań kodu, który istnieje. Patrzenie na to może dać ci nowe pomysły na to, jak zmienić kod, aby osiągnąć Single Responsibility Principle i Separation of Concerns.

Powiązane problemy