Wie stelle ich JVM-Parameter für Junit Unit Tests ein?

94

Ich habe einige Junit-Unit-Tests, für deren Ausführung viel Heap-Speicherplatz erforderlich ist - dh 1G. (Sie testen speicherintensive Funktionen für eine Webstart-App, die nur mit ausreichend Heap-Speicherplatz ausgeführt wird und intern auf Win 7 64-Bit-Computern ausgeführt wird. Daher ist eine Neugestaltung der Tests kein praktischer Vorschlag.)

Ich entwickle in Intellij IDEA, daher weiß ich, dass ich die JVM-Parameter (z. B. -Xmx1024M) für die Testklasse festlegen kann. Dies gilt jedoch nur für die Ausführung der gesamten Testklasse. Wenn ich einen einzelnen Test ausführen möchte, muss ich die Ausführungskonfigurationen für diese Testmethode neu erstellen.

Diese sind auch IDE- und Box-spezifisch. Wenn ich also die Box wechsle (ich entwickle auf mehreren Computern) oder einer meiner Kollegen versucht, die Tests auszuführen, werden diese Einstellungen nicht übertragen. (Auch andere IDEs wie Eclipse und NetBeans werden von meinen Kollegen verwendet.) FWIW, wir verwenden Quecksilber für die Quellcodeverwaltung.

Für den Erstellungszyklus verwenden wir Maven, daher weiß ich, wie die JVM-Parameter dafür angegeben werden.

Also: - Ich suche nach einer Möglichkeit, die JVM-Parameter anzugeben, die für die gesamte Testklasse und die einzelnen Testmethoden gelten. und - ich möchte diese Spezifikation für alle IDEs auf jedem Computer freigeben (nachdem ich den Code aus dem Repository abgerufen habe).

Amaidment
quelle
Ich bezweifle, dass es machbar ist. Maschinenübergreifend sollte dies für eine bestimmte IDE möglich sein. Aber über IDEs hinweg sehe ich nicht wie.
JB Nizet
@JBNizet - Ich würde gerne Maschinen für eine bestimmte IDE übertragen (vorausgesetzt, es handelt sich um Intellij IDEA).
Amaidment

Antworten:

48

In IntelliJ können Sie Standardeinstellungen für jede Laufkonfiguration festlegen. In Run / Debug - Konfigurationsdialog (die Sie pro Test zu konfigurieren Heap verwenden) Klicken Sie auf Standardwerte und JUnit . Diese Einstellungen werden automatisch auf jede neue JUnit-Testkonfiguration angewendet. Ich denke, eine ähnliche Einstellung gibt es für Eclipse.

Es gibt jedoch keine einfache Möglichkeit, solche Einstellungen (zumindest in IntelliJ) über Umgebungen hinweg zu übertragen. Sie können IntelliJ-Projektdateien in Ihr Repository übertragen: Es funktioniert möglicherweise, aber ich empfehle es nicht.

Sie wissen, wie Sie diese einstellen maven-surefire-plugin. Gut. Dies ist der portabelste Weg (siehe Ptomlis Antwort für ein Beispiel).

Im Übrigen müssen Sie bedenken, dass JUnit-Testfälle nur eine Reihe von Java-Klassen sind und kein eigenständiges Programm. Es ist Sache des Läufers (es sei ein eigenständiger JUnit-Läufer, Ihre IDE, maven-surefire-plugindiese Optionen festzulegen. Es gibt jedoch keine "tragbare" Möglichkeit, sie festzulegen, sodass die Speichereinstellungen unabhängig vom Läufer angewendet werden.

Um Ihnen ein Beispiel zu geben: Sie können Xmxbei der Entwicklung eines Servlets keine Parameter definieren - es liegt am Container, dies zu definieren. Sie können nicht sagen: "Dieses Servlet sollte immer mit ausgeführt werden Xmx=1G.

Tomasz Nurkiewicz
quelle
Wo befindet sich die Run / Debug-Konfiguration? Ich sehe dies nicht in den Einstellungen oder im Kontextmenü, wenn ich den Test ausführe.
Dean Hiller
2
Beachten Sie, dass dadurch vorhandene JUnit-Laufkonfigurationen NICHT geändert werden, sondern nur solche, die nach dem Ändern der Standardeinstellungen erstellt werden. Sie müssen vorhandene manuell ändern.
MikeFHay
77

In Maven können Sie das todsichere Plugin konfigurieren

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.9</version>
    <configuration>
        <argLine>-Xmx256M</argLine>
    </configuration>
</plugin>

Wenn Sie Maven für Builds verwenden, wird diese Konfiguration im Quellbaum übernommen und bei der Durchführung von Tests angewendet. Siehe die Dokumentation zum Maven Surefire Plugin .

ptomli
quelle
1
@ptomli - Ich misstraue immer Kommentaren, die mit "Sicher ..." beginnen. Die Intellij Maven-Integration verwendet die POM-Plugin-Konfiguration, wenn Aufgaben im Maven-Erstellungszyklus ausgeführt werden. Das Ausführen der Komponententests in der IDE ist ein separater Prozess und kennt den Erstellungsprozess standardmäßig nicht. Meines Wissens gibt es keine Möglichkeit, diese miteinander zu verbinden - obwohl ich froh bin, etwas anderes zu erfahren. Ist dies etwas, von dem Sie wissen / getan haben - in welchem ​​Fall können Sie uns mitteilen, wie es geht?
Amaidment
1
Ich bin mir nicht sicher, ob das in Intellij möglich ist. TBH, selbst wenn dies der Fall wäre, würde ich diesen Ansatz nicht verwenden, da ich wahrscheinlich, wenn ich die Komponententests in der IDE ausführe, den IDE-Debugger nutzen möchte, was ich nicht konnte durch Ausführen eines MVN-Tests.
Amaidment
5
Eigentlich IntelliJ die Maven Integration ist die Maven Surefire - Konfiguration verwenden , wenn einzelne Komponententests ausführen. Wenn Sie die oben beschriebene Maven-Konfiguration verwenden, wird -Xmx256Mdiese an die Java-Befehlszeile übergeben, wenn Sie Ihre Komponententests direkt von IntelliJ aus ausführen. Das hat mich nur verwirrt :-(
Kkkev
1
Zu Ihrer Information: Netbeans verwendet auch Maven Suefire, um seine Tests durchzuführen
Ferrybig
1
Die Maven-Integration von @Kkkev IntelliJ unterscheidet sich von der Ausführung eines einzelnen Tests in IntelliJ. Der erste verwendet eine Maven-Run-Konfiguration (und liest daher das Argument), der zweite verwendet eine JUnit-, TestNG ... -Konfiguration.
andresp
14

Laut dieser Support-Frage https://intellij-support.jetbrains.com/hc/en-us/community/posts/206165789-JUnit-default-heap-size-overridden-

Das Argument -Xmx für einen IntelliJ-Junit-Testlauf stammt vom Maven-Surefire-Plugin, sofern es festgelegt ist.

Dieses pom.xml-Snippet

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

scheint das Argument -Xmx1024 mit IntelliJ 2016.2.4 an den Junit-Testlauf zu übergeben.

Mark K.
quelle
13

Ich stimme den anderen zu, die sagten, dass es keinen einfachen Weg gibt, diese Einstellungen zu verteilen.

Für Eclipse: Bitten Sie Ihre Kollegen, Folgendes festzulegen:

  • Windows-Einstellungen / Java / Installierte JREs:
  • Wählen Sie das richtige JRE / JDK aus (oder machen Sie es für alle)
  • Bearbeiten
  • Standard-VM-Argumente: -Xmx1024m
  • Fertig, OK.

Danach werden alle Tests mit ausgeführt, -Xmx1024maber leider haben Sie sie in jeder Eclipse-Installation festgelegt. Vielleicht könnten Sie ein benutzerdefiniertes Eclipse-Paket erstellen, das diese Einstellung enthält, und es Ihren Mitarbeitern geben.

Der folgende Arbeitsprozess kann ebenfalls hilfreich sein: Wenn die IDE keinen Test ausführen kann, sollte der Entwickler prüfen, ob Maven diesen Test ausführen kann oder nicht.

  • Wenn Maven es ausführen kann, liegt die Fehlerursache normalerweise in den Einstellungen der Entwickler-IDE. Der Entwickler sollte diese Einstellungen überprüfen.
  • Wenn Maven den Test auch nicht ausführen konnte , weiß der Entwickler, dass die Fehlerursache nicht die IDE ist, sodass er die IDE zum Debuggen des Tests verwenden kann.
Palacsint
quelle
Zu sagen, dass das Projekt mit Maven erstellt werden muss, ist nicht sehr hilfreich. (Wir erstellen nur mit Maven.) Ihr Vorschlag impliziert jedoch, dass wir Tests nur als Teil des Maven-Erstellungszyklus ausführen sollten - wir verwenden häufig dieselben Tests für das Debuggen in der IDE. (Mit dem weiteren Vorteil, dass es nach dem
Debuggen
ok - aber jetzt wiederholst du nur Tomasz 'Antwort, aber mit Eclipse-Spezifikationen ...
amaidment
2

Sie können systemPropertyVariables verwenden (java.protocol.handler.pkgs ist Ihr JVM-Argumentname):

<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
quelle
1

Eine Eclipse-spezifische Alternative, die auf den JVM-Parameter java.library.path beschränkt ist, ermöglicht das Festlegen für einen bestimmten Quellordner und nicht für das gesamte JDK, wie in einer anderen Antwort vorgeschlagen:

  1. Wählen Sie den Quellordner aus, in dem sich das zu startende Programm befindet (normalerweise source / test / java).
  2. Geben Sie alt enter ein, um die Seite Eigenschaften für diesen Ordner zu öffnen
  3. Wählen Sie im linken Bereich native aus
  4. Bearbeiten Sie den nativen Pfad. Der Pfad kann absolut oder relativ zum Arbeitsbereich sein, der zweite ist widerstandsfähiger gegen Änderungen.

Für diejenigen, die sich für Details darüber interessieren, warum das Maven-Argline-Tag dem SystemProperties-Tag vorgezogen werden sollte, schauen Sie zum Beispiel:

Nimm native JNI-Dateien im Maven-Test auf (lwjgl)

Paswar
quelle