Java testy jednostkowe, układ katalogów
Kiedy budujemy zestaw testów jednostkowych dla kodu Javy, czy istnieje konwencja, gdzie umieścić kod testowy w stosunku do kodu źródłowego?
Na przykład, jeśli mam katalog /java
, który zawiera kilka plików źródłowych .java
, Czy lepiej umieścić przypadki testowe w samym /java
lub użyć czegoś w rodzaju /java/test
.
Jeśli ten ostatni jest preferowany, jak przetestować wewnętrzne elementy kodu, gdy private
/protected
Członkowie klasy nie są dostępni poza pakietem?
6 answers
Możesz umieścić testy w tym samym pakiecie co oryginalne klasy, nawet jeśli kod źródłowy znajduje się w katalogu głównym:
PROJECT_ROOT
+--- src/
+----test/
Możesz zadeklarować klasę com.foo.MyClass
pod src
i jej test com.foo.MyClassTest
pod test
.
Jeśli chodzi o dostęp do prywatnych użytkowników, możesz użyć reflection do wywołania metod (zmiana ich dostępności poprzez Class.getDeclaredMethod.setAccessible
), lub możesz użyć czegoś takiego jak testng/junit5, aby umieścić kilka testów opartych na adnotacjach na samym kodzie źródłowym (osobiście uważam, że to zły pomysł).
Dlaczego nie sprawdzić niektóre projekty na java.net
, aby zobaczyć, jak zorganizowali rzeczy, na przykład swinglabs (repozytorium SVN jest dość powolne, obawiam się)?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-09 08:02:17
Zalecam stosowanie się do standardowej struktury katalogów Apache Software Foundation , co daje:
module/
src/
main/
java/
test/
java/
To utrzymuje testy oddzielnie od źródła, ale na tym samym poziomie w strukturze katalogów. Jeśli przeczytasz, w jaki sposób Apache definiuje ich strukturę, zobaczysz, że pomaga również dzielić inne problemy, w tym zasoby, pliki konfiguracyjne, inne języki itp.
Ta struktura umożliwia również testy jednostkowe do testowania metod poziomu pakietu i chronionego jednostki testowane, zakładając, że umieścisz swoje przypadki testowe w tym samym opakowaniu, co to, co testują. Jeśli chodzi o testowanie prywatnych metod - nie zawracałbym sobie głowy. Coś innego, publiczne, pakietowe lub chronione wywołuje je i powinieneś być w stanie uzyskać pełny zasięg testowania tych rzeczy.
Nawiasem mówiąc, powyższy link jest do Maven, standardowego narzędzia do budowania Apache ' a. Każdy projekt Java jest zgodny z tym standardem, jak również każdy napotkany przeze mnie projekt Zbudowany z Maven.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-08 21:01:18
Większość razy robi się tak:
<SOME_DIR>/project/src/com/foo/Application.java
<SOME_DIR>/project/test/com/foo/ApplicationTest.java
Tak więc, zachowujesz je osobno i nadal możesz przetestować pakiet / chronioną funkcjonalność, ponieważ test znajduje się w tym samym pakiecie.
Nie możesz testować prywatnych rzeczy, chyba że zostaną zadeklarowane wewnątrz klasy it self.
Po dostarczeniu wystarczy spakować .class
wygenerowane przez src, a nie testy
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-09 14:24:49
Właściwie to ma sens rozdzielenie projektów produkcyjnych i testowych na dwa oddzielne podmioty, ale mają taką samą strukturę pakietów w obu projektach.
Więc jeśli mam projekt 'mój-projekt' to również tworzę 'mój-projekt-test', więc mam następującą strukturę katalogów:
my-project
+--- src/com/foo
my-project-test
+---test/com/foo
Takie podejście zapewnia, że zależności kodu testowego nie zanieczyszczają kodu produkcyjnego.
Moim zdaniem Pakiety prywatne i chronione powinny być testowane jak i publiczne metody. Dlatego chcę, aby moje zajęcia testowe były w tym samym pakiecie, co zajęcia produkcyjne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-09 15:41:44
Tak to ustawiamy i lubimy.
build/
src/
test/build/
test/src/
Cały kod testowy kompiluje się do własnego katalogu kompilacji. Dzieje się tak, ponieważ nie chcemy, aby produkcja przez pomyłkę zawierała klasy testowe.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-02 03:04:40
Podczas tworzenia biblioteki Java moduł w Android Studio tworzy domyślną klasę Pod:
[module]
+ src/main/java/[com/foo/bar]
Jeśli zajrzysz do pliku [module].iml
, znajdziesz tę ścieżkę, jak również ścieżkę do testów, którą możesz wykorzystać. Poniżej znajduje się podsumowanie:
<module>
<component>
<content>
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
</content>
</component>
</module>
Możesz w szczególności utworzyć katalog testów o następującej strukturze:
[module]
+ src/main/java/[com/foo/bar]
+ src/test/java/[com/foo/bar]
Powyższa struktura zostanie rozpoznana przez Android Studio , a Twoje pliki pod spodem będą zawarte w module.
Zakładam, że ta struktura jest zalecanym układem dla kodu i testów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 12:50:12