Właściwie nazywamy nasze pakiety testowe tak, jak ich odpowiedniki do testowania. W rezultacie otrzymujemy następującą strukturę:
src/main/java
com.hello.world
helloWorld.java
src/test/java
com.hello.world
helloWorldTest.java
Zawsze czułem, że nie jest to zbyt mądre, ponieważ nie można odróżnić „test” od „testowania”, jeśli podano tylko nazwę pakietu. Z drugiej strony tak naprawdę nie znalazłem przypadku, w którym to ma znaczenie. Czy dobrą praktyką jest stosowanie tych samych konwencji nazewnictwa dla obu pakietów (dla przypadków testowych i klas źródłowych)? Jeśli nie, jakie byłoby lepsze podejście?
XXXTest()
wcom.hello.world.test.helloWorldTest.java
. Zaleca się, aby „Test” pojawiał się tylko raz na ścieżce, więc albo (a) użyj testu w nazwie pakietu (i nazwij plik testowy tak samo jak testowany plik) lub (b) ustaw nazwę pakietu na to samo i dodaj „test” do nazwy pliku / klasy.Odpowiedzi:
To dobra konwencja.
Czasami chcesz pisać testy jednostkowe również dla klas i metod prywatnych. Nie będziesz mógł wywoływać ich z klasy testów jednostkowych umieszczonych w innym pakiecie.
Nie powinno być żadnych wątpliwości co do posiadania klas testów jednostkowych w tej samej przestrzeni nazw, ponieważ nie powinny one znajdować się w ścieżce klas podczas kompilacji lub uruchamiania kodu produkcyjnego.
Oto przykład małego modułu z publicznym interfejsem, publiczną klasą fabryki i dwiema klasami implementacji pakietów:
Ukrywanie implementacji interfejsu Transmogrifier może być dobrym wyborem projektowym. Być może za wybór implementacji odpowiada klasa fabryczna.
Ponieważ implementacje są prywatne dla pakietów, należy umieścić klasy testów jednostkowych w tym samym pakiecie, jeśli chcesz je przetestować bezpośrednio. Jeśli masz klasy testów jednostkowych w jakimś innym pakiecie, masz bezpośredni dostęp do interfejsu publicznego i klasy fabrycznej z testów.
źródło
MapTransmogrifier
aListTransmogrifier
i zdecydować, mogą one być wykonane w jednej klasie, więc tworzyćListMapTransmogrifier
, modyfikować fabrykę do korzystania z tego i usunąć dwie klasy. Kod się teraz nie kompiluje, więc musisz zmodyfikować każdy test w obuMapTransmogrifierTest
iListTransmogrifierTest
uzyskać kompilację. Test kończy się niepowodzeniem. Czy to ze względu na zmianę testów lub tworzenieListMapTransmogrifier
? Wychodzi debugger, aby dowiedzieć się ... alternatywnie, gdy testy wykorzystują fabrykę, robisz ten refaktor i wszystko wciąż się kompiluje ...