Mam kilka testów jednostkowych Junit, które wymagają dużej ilości miejsca na sterty do uruchomienia - np. 1G. (Testują funkcje wymagające dużej ilości pamięci dla aplikacji webstart, która będzie działać tylko z wystarczającą ilością miejsca na sterty i będzie uruchamiana wewnętrznie na 64-bitowych maszynach Win 7 - więc przeprojektowanie testów nie jest praktyczną sugestią).
Rozwijam się w Intellij IDEA, więc wiem, że mogę ustawić parametry JVM (np. -Xmx1024M) dla klasy testowej. Jednak jest to tylko do uruchamiania całej klasy testowej - jeśli chcę uruchomić indywidualny test, muszę odtworzyć konfiguracje uruchamiania dla tej metody testowej.
Ponadto są one specyficzne dla IDE i boxów - więc jeśli zmienię skrzynki (tworzę na wielu komputerach) lub jeden z moich kolegów spróbuje uruchomić testy, te ustawienia nie zostaną przeniesione. (Również inne środowiska IDE, takie jak Eclipse i NetBeans, są używane przez moich kolegów.) FWIW, używamy Mercurial do kontroli kodu źródłowego.
W cyklu kompilacji używamy Mavena, więc wiem, jak określić parametry maszyny JVM.
A więc: - szukam sposobu na określenie parametrów JVM, które będą obowiązywały dla całej klasy testowej i poszczególnych metod testowych; oraz - chciałbym udostępnić tę specyfikację w IDE na dowolnym komputerze (po pobraniu kodu z repozytorium).
źródło
Odpowiedzi:
W IntelliJ można określić domyślne ustawienia dla każdej konfiguracji uruchamiania. W oknie dialogowym Uruchom / Debuguj konfigurację (tego, którego używasz do konfigurowania sterty na test) kliknij Domyślne i JUnit . Te ustawienia zostaną automatycznie zastosowane do każdej nowej konfiguracji testu JUnit. Myślę, że podobne ustawienie istnieje dla Eclipse.
Jednak nie ma prostej opcji przenoszenia takich ustawień (przynajmniej w IntelliJ) między środowiskami. Możesz wysłać pliki projektu IntelliJ do swojego repozytorium: może działać, ale nie polecam tego.
Wiesz, jak to ustawić
maven-surefire-plugin
. Dobry. Jest to najbardziej przenośny sposób (patrz przykład odpowiedzi Ptomli).Co do reszty - musisz pamiętać, że przypadki testowe JUnit to tylko kilka klas Javy, a nie samodzielny program. To zależy od biegacza (niech to będzie samodzielny biegacz JUnit, twoje IDE,
maven-surefire-plugin
aby ustawić te opcje. Mówiąc o tym, nie ma "przenośnego" sposobu ich ustawienia, więc ustawienia pamięci są stosowane niezależnie od biegacza.Aby dać ci przykład: nie możesz zdefiniować
Xmx
parametru podczas tworzenia serwletu - zdefiniowanie tego należy do kontenera. Nie możesz powiedzieć: „ten serwlet powinien być zawsze uruchamiany zXmx=1G
.źródło
W Maven możesz skonfigurować wtyczkę surefire
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.9</version> <configuration> <argLine>-Xmx256M</argLine> </configuration> </plugin>
Jeśli używasz Mavena do kompilacji, ta konfiguracja zostanie przeniesiona do drzewa źródłowego i zastosowana podczas przeprowadzania testów. Zobacz dokumentację Maven Surefire Plugin .
źródło
-Xmx256M
przekazanie do wiersza poleceń Java podczas wykonywania testów jednostkowych bezpośrednio z IntelliJ. To właśnie zmyliło mnie :-(Parametry można również ustawiać w locie.
mvn test -DargLine="-Dsystem.test.property=test"
Zobacz http://www.cowtowncoder.com/blog/archives/2010/04/entry_385.html
źródło
Zgodnie z tym pytaniem pomocy https://intellij-support.jetbrains.com/hc/en-us/community/posts/206165789-JUnit-default-heap-size-overridden-
argument -Xmx dla uruchomienia testowego IntelliJ junit będzie pochodził z wtyczki maven-surefire-plugin, jeśli jest ustawiona.
Ten fragment kodu pom.xml
wydaje się przekazywać argument -Xmx1024 do uruchomienia testowego junit z IntelliJ 2016.2.4.
źródło
Zgadzam się z innymi, którzy powiedzieli, że nie ma prostego sposobu na rozpowszechnianie tych ustawień.
W przypadku Eclipse: poproś współpracowników o ustawienie następujących elementów:
-Xmx1024m
Następnie wszystkie testy zostaną uruchomione,
-Xmx1024m
ale niestety ustawiłeś je w każdej instalacji Eclipse. Może mógłbyś stworzyć niestandardowy pakiet Eclipse, który zawiera to ustawienie i przekazać je swoim współpracownikom.Poniższy proces roboczy również może pomóc: Jeśli IDE nie może przeprowadzić testu, programista powinien sprawdzić, czy Maven może uruchomić ten test, czy nie.
źródło
Możesz użyć systemPropertyVariables (java.protocol.handler.pkgs to nazwa argumentu maszyny JVM):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.12.4</version> <configuration> <systemPropertyVariables> <java.protocol.handler.pkgs>com.zunix.base</java.protocol.handler.pkgs> <log4j.configuration>log4j-core.properties</log4j.configuration> </systemPropertyVariables> </configuration> </plugin>
http://maven.apache.org/surefire/maven-surefire-plugin/examples/system-properties.html
źródło
Specyficzna alternatywa dla eclipse ograniczona do parametru java.library.path JVM umożliwia ustawienie go dla określonego folderu źródłowego, a nie dla całego jdk, jak zaproponowano w innej odpowiedzi:
Osoby zainteresowane szczegółami, dlaczego tagi Maven argline powinny być preferowane w stosunku do systemowych właściwości, spójrz na przykład:
Odbierz natywne pliki JNI w teście Maven (lwjgl)
źródło
Jeśli ustawisz to w kodzie Java, możesz to ustawić w ten sposób
static { System.getProperties().setProperty("env", "test"); System.getProperties().setProperty("spring.application.name", "spring-example"); }
odniesienie:
https://stackoverflow.com/a/60654275/4712855
https://stackoverflow.com/a/10774432/4712855
źródło