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

96

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).

amaidment
źródło
Wątpię, żeby to wykonalne. Na wszystkich komputerach, dla danego IDE, powinno to być wykonalne. Ale w środowiskach IDE nie wiem, jak to zrobić.
JB Nizet
@JBNizet - Chętnie zabrałbym różne maszyny dla danego IDE (pod warunkiem, że jest to Intellij IDEA).
amaidment

Odpowiedzi:

48

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-pluginaby 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ć Xmxparametru podczas tworzenia serwletu - zdefiniowanie tego należy do kontenera. Nie możesz powiedzieć: „ten serwlet powinien być zawsze uruchamiany z Xmx=1G.

Tomasz Nurkiewicz
źródło
gdzie jest konfiguracja Run / Debug? Nie widzę tego w preferencjach ani w menu kontekstowym, kiedy uruchamiam test?
Dean Hiller
2
Należy pamiętać, że NIE spowoduje to zmiany istniejących konfiguracji uruchamiania JUnit, tylko te, które są tworzone po zmianie ustawień domyślnych. Musisz ręcznie zmienić istniejące.
MikeFHay
79

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 .

ptomli
źródło
1
@ptomli - zawsze nie ufam komentarzom zaczynającym się od „Z pewnością ...”. Integracja Intellij maven wykorzystuje konfigurację wtyczki pom podczas uruchamiania zadań w cyklu kompilacji maven. Uruchamianie testów jednostkowych w środowisku IDE jest oddzielnym procesem i domyślnie nie ma wiedzy o procesie kompilacji. O ile mi wiadomo, nie da się ich połączyć - chociaż cieszę się, że powiedziano mi inaczej. Czy jest to coś, o czym wiesz / zrobiłeś - w takim przypadku czy możesz podzielić się tym, jak to zrobić?
amaidment
1
Nie jestem pewien, czy jest to możliwe w Intellij. TBH nawet gdyby tak było, nie chciałbym stosować tego podejścia, ponieważ są szanse, że jeśli uruchomię testy jednostkowe w IDE, chcę skorzystać z debuggera IDE, czego nie mogłem zrobić przeprowadzając test MVN.
amaidment
5
Faktycznie, integracja IntelliJ za Maven ma użyć konfiguracji Maven Surefire podczas wykonywania poszczególnych testów jednostkowych. Użycie powyższej konfiguracji Maven spowoduje -Xmx256Mprzekazanie do wiersza poleceń Java podczas wykonywania testów jednostkowych bezpośrednio z IntelliJ. To właśnie zmyliło mnie :-(
Kkkev
1
FYI: Netbeans używa również Maven Suefire uruchomić swoje testy
Ferrybig
1
Integracja @Kkkev IntelliJ z Maven różni się od uruchamiania indywidualnego testu w IntelliJ. Pierwsza używa konfiguracji uruchamiania Mavena (i dlatego odczytuje argument), druga używa konfiguracji JUnit, TestNG ....
andresp 12-16
15

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

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

wydaje się przekazywać argument -Xmx1024 do uruchomienia testowego junit z IntelliJ 2016.2.4.

Mark K.
źródło
13

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:

  • Preferencje systemu Windows / Java / zainstalowane środowiska JRE:
  • Wybierz odpowiedni JRE / JDK (lub zrób to dla wszystkich)
  • Edytować
  • Domyślne argumenty maszyny wirtualnej: -Xmx1024m
  • Zakończ, OK.

Następnie wszystkie testy zostaną uruchomione, -Xmx1024male 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.

  • Jeśli Maven mógł go uruchomić , zwykle przyczyną niepowodzenia są ustawienia IDE dewelopera. Deweloper powinien sprawdzić te ustawienia.
  • Jeśli Maven również nie mógł uruchomić testu, programista wie, że przyczyną niepowodzenia nie jest IDE, więc może użyć IDE do debugowania testu.
palacsint
źródło
Stwierdzenie, że projekt musi zostać utworzony za pomocą mavena, nie jest zbyt pomocne. (Budujemy tylko za pomocą mavena). Jednak sugestia sugeruje, że powinniśmy uruchamiać testy tylko w ramach cyklu budowania mavena - często używamy tych samych testów do debugowania w IDE. (Z kolejną korzyścią, że gdy coś zostanie zdebugowane, łatwo jest zachować te testy w cyklu kompilacji.)
amaidment
ok - ale teraz tylko powtarzasz odpowiedź Tomasza, ale ze specyfikacjami Eclipse ...
amaidment
2

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

sendon1982
źródło
1

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:

  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 ścieżkę natywną. Ścieżka może być bezwzględna lub względna w stosunku do obszaru roboczego, druga jest bardziej odporna na zmiany.

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)

paswar
źródło