Rozdzielenie klas JUnit na specjalny pakiet testowy?

118

Koncepcji programowania sterowanego testami uczę się czytając artykuły Craftsman (kliknij Craftsman pod Według tematu ) zalecane w odpowiedzi na moje poprzednie pytanie „Przykładowy projekt do nauki JUnita i właściwej inżynierii oprogramowania” . Póki co bardzo mi sie do podoba!

Ale teraz chcę usiąść i spróbować sam. Mam pytanie, na które mam nadzieję, będzie potrzebna tylko prosta odpowiedź.

Jak organizujesz klasy testowe JUnit i rzeczywisty kod? Mówię głównie o strukturze pakietu, ale wszelkie inne warte uwagi koncepcje też byłyby pomocne.

Czy umieszczasz klasy testowe w org.myname.project.test. *, A normalny kod w org.myname.project. *? Czy umieszczasz zajęcia testowe obok zwykłych zajęć? Czy wolisz poprzedzać nazwy klas słowem Test, a nie sufiksować je?

Wiem, że wydaje mi się, że to coś, o co nie powinienem się tak szybko martwić, ale jestem osobą bardzo skupioną na organizacji. Jestem prawie typem osoby, która spędza więcej czasu na szukaniu metod śledzenia tego, co należy zrobić, niż na faktycznym wykonywaniu zadań.

Mam projekt, który jest obecnie zgrabnie podzielony na pakiety, ale projekt stał się bałaganem. Zamiast próbować wszystko refaktoryzować i pisać testy, chcę zacząć od nowa, najpierw testy. Ale najpierw muszę wiedzieć, gdzie idą moje testy.


edycja: Zupełnie zapomniałem o Mavenie, ale wygląda na to, że większość z was go używa! W przeszłości miałem szczególny przypadek użycia, w którym Maven całkowicie się zepsuł, ale Ant dał mi elastyczność, której potrzebowałem, więc w końcu przywiązałem się do Anta, ale myślę, że może po prostu obrałem niewłaściwe podejście. Myślę, że spróbuję jeszcze raz Maven, ponieważ wygląda na to, że będzie dobrze pasował do rozwoju opartego na testach.

Ricket
źródło

Odpowiedzi:

154

Wolę umieszczać klasy testowe w tym samym pakiecie, co klasy projektów, które testują, ale w innym katalogu fizycznym, na przykład:

myproject/src/com/foo/Bar.java
myproject/test/com/foo/BarTest.java

W projekcie Maven wyglądałoby to tak:

myproject/src/main/java/com/foo/Bar.java
myproject/src/test/java/com/foo/BarTest.java

Głównym punktem jest to, że moje klasy testowe mogą uzyskiwać dostęp (i testować!) Do klas i elementów członkowskich w zakresie pakietu.

Jak pokazuje powyższy przykład, moje klasy testowe mają nazwę testowanej klasy plus Testjako przyrostek. Pomaga to szybko je znaleźć - nie jest zbyt zabawne, aby spróbować przeszukać kilkaset klas testowych, z których każda zaczyna się od Test...

Aktualizacja zainspirowana komentarzem @ Ricketa: w ten sposób klasy testowe (zazwyczaj) pojawiają się zaraz po sprawdzonym kumplu w alfabetycznej liście nazw klas według projektu. (Zabawne, że czerpię korzyści z tego dnia po dniu, nie zdając sobie świadomie sprawy, jak ...)

Aktualizacja2: Wielu programistów (w tym ja) lubi Maven, ale wydaje się, że jest co najmniej tyle samo deweloperów, którzy tego nie robią. IMHO jest to bardzo przydatne dla "mainstreamowych" projektów Java (w tej kategorii umieściłbym około 90% projektów ... ale pozostałe 10% to nadal spora mniejszość). Jest łatwy w użyciu, jeśli akceptuje się konwencje Mavena; jeśli jednak nie, to czyni życie nieszczęśliwą walką. Maven wydaje się być trudny do zrozumienia dla wielu ludzi socjalizujących się na Ant, ponieważ najwyraźniej wymaga zupełnie innego sposobu myślenia. (Ja, ponieważ nigdy nie korzystałem z Anta, nie mogę ich porównać.) Jedno jest pewne: sprawia, że ​​testowanie jednostek (i integracji) jest naturalnym, pierwszorzędnym krokiem w procesie, co pomaga programistom przyjąć tę zasadniczą praktykę.

Péter Török
źródło
6
Zgadzam się również z uwagą dotyczącą przyrostka. Ponieważ klasy testowe są podzielone na inny folder fizyczny, nie ma potrzeby próbować poprzedzać przedrostkiem Test, aby oszukać sortowanie alfabetyczne w grupach i myślę, że SomeClassTest czyta lepiej.
Ricket
Doskonałe konwencje +1
whiskeysierra
1
Jedna rzecz dotycząca umieszczania klas testowych w tym samym pakiecie: chociaż pozwala na użycie prywatnych członków pakietu (dlatego też używam tego schematu), nie pozwala również na automatyczne testowanie widoczności, zwł. jeśli używasz TDD i pozwól swojemu IDE wygenerować potrzebne kody pośredniczące metod. Może generować je z widocznością prywatnych pakietów (NetBeans, patrzę na ciebie), co sprawia, że ​​test przebiega idealnie (po tym, jak faktycznie umieścisz implementację w tych kodach pośredniczących), ale może zawieść w rzeczywistym użyciu (jeśli zapomniałeś dodać public) .
Siergiej Tachenov
Chociaż ta konwencja jest interesująca, co robisz, gdy zestaw testów rośnie? Np. Powiedzmy, że masz 6 metod w klasie, każda metoda ma 10 testów. Czy masz w klasie 60 testów? Zwykle dzielę klasę testów (jedna klasa testowa na metodę). Problem polega na tym, że możesz znaleźć wiele klas w swoim pakiecie testowym.
mmalmeida
1
@Thick_propheT w Eclipse: kliknij prawym przyciskiem myszy nazwę projektu, kliknij Nowy - Inne ..., a następnie w folderze Java wybierz Folder źródłowy. nazwij go „test”. Następnie, jeśli chcesz postępować zgodnie z powyższą konwencją, dodaj nowy pakiet do tego folderu testowego o tej samej nazwie, co pakiet klasy, dla której chcesz napisać przypadek testowy, a następnie w pakiecie dodaj nowy przypadek testowy JUnit (znajdujący się w folder Java / Junit podczas wykonywania polecenia New-Other ...). w tym nowym kreatorze możesz określić testowaną klasę i nazwać przypadek testowy taką samą nazwą z sufiksem „Test”
wrześniu
15

Umieszczam moje klasy testowe w tym samym pakiecie, co testowane, ale w innym folderze źródłowym lub projekcie . Zorganizowanie mojego kodu testowego w ten sposób pozwala mi łatwo skompilować i spakować go osobno, tak aby produkcyjne pliki jar nie zawierały kodu testowego. Umożliwia również kodowi testowemu dostęp do prywatnych pól i metod pakietu.

ChrisH
źródło
12

Używam Mavena . Struktura promowana przez Maven to:

src/main/java/org/myname/project/MyClass.java

src/test/java/org/myname/project/TestMyClass.java

tj. klasa testowa z Test dołączonym do nazwy testowanej klasy znajduje się w strukturze katalogów równoległych do głównego testu.

Jedną z zalet posiadania klas testowych w tym samym pakiecie (choć niekoniecznie w katalogu) jest możliwość wykorzystania metod zakresu pakietu do inspekcji lub wstrzykiwania pozorowanych obiektów testowych.

Jaskółka oknówka
źródło
18
Myślałem, że to <class>Test.javanieTest<class>.java
Mike Rylander
2
Maven zaakceptuje każdy wzorzec, zgodnie z dokumentacją wtyczki Maven Surefire .
Elijah Woodward
3
Twierdzę, że <class>Test.javaschemat nazewnictwa sprawia, że ​​zarówno klasa główna, jak i klasa testowa są wyświetlane blisko podczas korzystania z funkcji wyszukiwania IDE, co czyni go nieco lepszym niż Test<class>.java.
christopheml
1
@christopheml Zgadzam się, to właśnie robię teraz.
Martin
To zadziałało dla Intellij. MyClassTest.java nie działa.
user2761431