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.
źródło
Odpowiedzi:
Wolę umieszczać klasy testowe w tym samym pakiecie, co klasy projektów, które testują, ale w innym katalogu fizycznym, na przykład:
W projekcie Maven wyglądałoby to tak:
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
Test
jako przyrostek. Pomaga to szybko je znaleźć - nie jest zbyt zabawne, aby spróbować przeszukać kilkaset klas testowych, z których każda zaczyna się odTest
...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ę.
źródło
public
) .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.
źródło
Używam Mavena . Struktura promowana przez Maven to:
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.
źródło
<class>Test.java
nieTest<class>.java
<class>Test.java
schemat 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
.