Czysty kod w testach jednostkowych

1

Testy jednostkowe to też jest kod, więc wypadałoby je pisać zgodnie z zasadami pisania czystego kodu. Ale jak to zrobić?

Załóżmy taki przykład - test dla metody klonującej obiekt (z jego podobiektami na kilku poziomach zagnieżdżeń) w odpowiedni sposób, tj. niektóre podobiekty (w tym niektóre kolekcje) jako referencje, a inne jako wartości.
W tym celu, w trzeba:

  1. utworzyć poszczególne obiekty, ustawić im wartości atrybutów;
  2. zapisać je w sesji (w sensie ormowym, w celu uzyskania id encji);
  3. złożyć z nich graf;
  4. wywołać testowaną metodę klonującą i odebrać jej wynik;
  5. wykonać zestaw asercji na atrybutach i podobiektach wyniku klonowania.

Punkty 1-3 łatwo można wydzielić do pomocniczych metod CreateAndSaveXYZ, ale co poza tym?
Utworzenie 20 obiektów nawet przy użyciu tych metod pomocniczych to 20 linijek kodu w metodzie testującej, do tego późniejsze kilkadziesiąt asercji sprawia, że metoda ma 70 linijek, czyli chyba trochę za dużo... Co z tym zrobić? Wydzielenie tworzenia całości danych testowych do oddzielnej metody sprawia, że traci się kontekst tego, co się testuje. Wydzielenie asercji do metod również spowoduje utracenie kontekstu.
Co byście zrobili w takiej sytuacji? Jak piszecie swoje testy? Czy są ładne w sensie czystego kodu, czy nie przejmujecie się tym w ogóle w testach?

0
  1. Mocki
  2. Mocki
  3. Mocki
    Tworzenie mocków pakujesz do jakiejś metody beforeTest a potem robisz jedną asercję na test

Tyle teorii, w praktyce jak ci wygodnie :P

0

Jak jedną asercją mam sprawdzić graf obiektów, bo trochę nie rozumiem?

0

Na przykład pisząc metodę equals() dla obiektu przechowującego graf a potem testując tą metodę?

0

A możesz jakoś to zobrazować? Bo ja nie piszę swojego equals, nie miałoby to raczej sensu w tym specyficznym przypadku.

0

Ach ok, nie do końca myślałem jak to wczoraj czytałem :P
Tutaj sporo zależy od tego jak ta metoda kopiująca wygląda. Moim zdaniem napisałeś ją tak że trudno ją testować i musisz zrobić refaktor - podzielić ją na mniejsze kawałki. Tak że np. metoda X() kopiuje jeden poziom i wywołuje inną metodę do kopiowania niższego poziomu etc (nie wiem jak to dokładnie wygląda więc trudno my tu coś więcej napisać) i potem testujesz to z użyciem mocków np. takich jakie daje PowerMock przez createNicePartialMockForAllMethodsExcept() ;)

0

@somekind
.NET ?

Ostatnio szukałem jak poprawić utrzymywanie testów i zmniejszyć ich rozmiar.
Jest open source'owe narzędzie, które automatycznie może dla Ciebie tworzyć obiekty i wypełniać je testowymi danymi. Oczywiście nie jest to pożądane w każdym przypadku, ale często nie interesuje nas jak obiekt jest tworzony.

Strona projektu: http://autofixture.codeplex.com/
Film instruktażowy: http://ndc2011.macsimum.no/mp4/Day3%20Friday/Track7%201500-1600.mp4

1 użytkowników online, w tym zalogowanych: 0, gości: 1