Jak ustawić parametry JVM dla testów jednostkowych Junit?

Mam kilka testów jednostkowych Junit, które wymagają dużej ilości miejsca na stercie do uruchomienia - np. 1G. (testują one funkcjonalność wymagającą pamięci dla aplikacji webstart, która będzie działać tylko z wystarczającą ilością miejsca na stercie 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. Jest to jednak tylko do prowadzenia całej klasy testowej-jeśli chcę wykonać indywidualny test, muszę odtworzyć konfiguracje run dla tej metody testowej.

Również te są specyficzne dla IDE i box - więc jeśli przełączam skrzynki (rozwijam na wielu komputerach) lub jeden z moich kolegów próbuje uruchomić testy, te ustawienia nie są przenoszone. (Również inne IDE, takie jak Eclipse i NetBeans są używane przez moich kolegów.) FWIW, używamy mercurial do kontroli kodu źródłowego.

Do cyklu budowania używamy Mavena, więc wiem, jak określić JVM parametry do tego.

Więc: - Szukam sposobu na określenie parametrów JVM, które będą miały zastosowanie dla całej klasy testowej i poszczególnych metod testowych; oraz - Chciałbym udostępnić te specyfikacje w IDE na dowolnym komputerze (po odebraniu kodu z repozytorium).

Author: Tomasz Nurkiewicz, 2011-09-28

7 answers

W IntelliJ możesz określić domyślne ustawienia dla każdej konfiguracji uruchomienia. W oknie dialogowym Uruchom/Debug konfiguracja (to, którego używasz do konfiguracji sterty na test) Kliknij Defaults i JUnit . Ustawienia te zostaną automatycznie zastosowane do każdej nowej konfiguracji testowej JUnit. Wydaje mi się, że podobne ustawienie istnieje dla Eclipse.

Nie ma jednak prostej opcji przeniesienia takich ustawień (przynajmniej w IntelliJ) między środowiskami. Możesz tworzyć pliki projektu IntelliJ do repozytorium: może działać, ale nie polecam.

Wiesz, jak ustawić je dla maven-surefire-plugin. Dobrze. Jest to najbardziej przenośny sposób (zobacz odpowiedź Ptomli na przykład).

Co do reszty-pamiętaj, że przypadki testowe JUnit to tylko kilka klas Javy, a nie samodzielny program. Ustawienie tych opcji zależy od runnera (niech to będzie samodzielny JUnit runner, Twoje IDE, maven-surefire-plugin. To powiedziawszy, nie ma" przenośnego " sposobu ich ustawiania, więc ustawienia pamięci są stosowany niezależnie od biegacza.

Podam przykład: nie możesz zdefiniować parametru Xmx podczas tworzenia serwletu - to do kontenera należy zdefiniowanie tego. Nie można powiedzieć: "ten servlet powinien być zawsze uruchamiany z Xmx=1G.

 45
Author: Tomasz Nurkiewicz,
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-06-11 19:43:01

W Mavenie 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, to ta konfiguracja zostanie przeprowadzona w drzewie źródłowym i zastosowana podczas testów. Zobacz dokumentację Maven Surefire plugin .

 59
Author: ptomli,
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-04-08 16:20:00

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

 16
Author: vpathak,
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
2014-07-22 16:03:10

Zgadzam się z innymi, którzy powiedzieli, że nie ma prostego sposobu na rozpowszechnienie tych ustawień.

Dla Eclipse: poproś kolegów o ustawienie:

  • Windows Preferences / Java / Installed JREs:
  • Wybierz odpowiednie JRE / JDK (lub zrób to dla wszystkich)
  • Edytuj
  • domyślne argumenty maszyny wirtualnej: -Xmx1024m
  • / Align = "left" /

Po tym wszystkie testy będą uruchamiane z -Xmx1024m ale niestety Ustawiłeś je w każdej instalacji Eclipse. Może ty może stworzyć niestandardowy pakiet Eclipse, który zawiera To ustawienie i przekazać go współpracownikom.

Następujący proces roboczy również może pomóc: jeśli IDE nie może uruchomić testu, deweloper powinien sprawdzić, czy Maven może uruchomić ten test, czy nie.

  • Jeśli Maven mógłby uruchomić to przyczyną awarii są zazwyczaj ustawienia IDE programisty. Programista powinien sprawdzić te ustawienia.
  • Jeśli Maven również nie może uruchomić test, który programista zna że przyczyną awarii nie jest IDE, więc może użyć IDE do debugowania testu.
 13
Author: palacsint,
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
2011-09-28 12:02:53

Zgodnie z tym pytaniem wsparcia https://intellij-support.jetbrains.com/hc/en-us/community/posts/206165789-JUnit-default-heap-size-overridden-

Argument-Xmx dla uruchomienia testowego IntelliJ junit pochodzi z wtyczki maven-surefire-plugin, jeśli jest ustawiony.

Ten pom.XML snippet

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <argLine>-Xmx1024m</argLine>
            </configuration>
        </plugin>

Wydaje się przekazać argument-Xmx1024 do uruchomienia testowego junit, z IntelliJ 2016.2.4.

 7
Author: Mark K.,
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
2016-10-06 02:50:39

Alternatywa specyficzna dla eclipse ograniczona do Javy.biblioteka.parametr path JVM pozwala ustawić go dla określonego folderu źródłowego, a nie dla całego jdk, jak zaproponowano w innej odpowiedzi:

  1. Wybierz folder źródłowy, w którym znajduje się program do uruchomienia (Zwykle source/test/java)
  2. wpisz alt enter, aby otworzyć stronę Właściwości dla tego folderu
  3. Wybierz natywny w lewym panelu
  4. edytuj natywną ścieżkę. Ścieżka może być bezwzględna lub względna workspace, druga jest bardziej odporna na zmiany.

Dla zainteresowanych szczegółami, dlaczego znacznik Maven argline powinien być preferowany od systemuproperties one, poszukaj na przykład:

Pobieranie natywnych plików JNI w teście Maven (lwjgl)

 1
Author: paswar,
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
2017-05-23 12:10:12

Możesz użyć systemPropertyVariables (java.protokół.handler.pkgs to nazwa argumentu 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

 1
Author: sendon1982,
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
2016-05-23 20:45:51