Come impostare i parametri JVM per i test unitari Junit?


95

Ho alcuni unit test Junit che richiedono una grande quantità di spazio heap per essere eseguiti, ad esempio 1G. (Testano la funzionalità a uso intensivo di memoria per un'app Webstart che verrà eseguita solo con spazio heap sufficiente e verrà eseguita internamente su macchine Win 7 a 64 bit, quindi riprogettare i test non è un suggerimento pratico.)

Sto sviluppando in Intellij IDEA, quindi so di poter impostare i parametri JVM (ad esempio -Xmx1024M) per la classe di test. Tuttavia, questo è solo per l'esecuzione dell'intera classe di test: se voglio eseguire un singolo test, devo ricreare le configurazioni di esecuzione per quel metodo di test.

Inoltre, quelli sono specifici per IDE e box, quindi se cambio box (sviluppo su più macchine) o uno dei miei colleghi tenta di eseguire i test, quelle impostazioni non vengono trasferite. (Inoltre, altri IDE come Eclipse e NetBeans sono usati dai miei colleghi.) FWIW, stiamo usando mercurial per il controllo del codice sorgente.

Per il ciclo di compilazione, stiamo usando Maven, quindi so come specificare i parametri JVM per questo.

Quindi: - Sto cercando un modo per specificare i parametri JVM che si applicheranno all'intera classe di test e ai singoli metodi di test; e - mi piacerebbe condividere queste specifiche tra gli IDE su qualsiasi macchina (dopo aver preso il codice dal repository).


Dubito che sia fattibile. Su tutte le macchine, per un dato IDE, dovrebbe essere fattibile. Ma negli IDE non vedo come.
JB Nizet

@JBNizet - Sarei felice di accettare le macchine per un determinato IDE (a condizione che sia Intellij IDEA).
amaidment

Risposte:


48

In IntelliJ è possibile specificare le impostazioni predefinite per ciascuna configurazione della corsa. Nella finestra di dialogo di configurazione Esegui / Debug (quella che usi per configurare l'heap per test) fai clic su Default e JUnit . Queste impostazioni verranno applicate automaticamente a ogni nuova configurazione di prova JUnit. Immagino che esista un'impostazione simile per Eclipse.

Tuttavia non esiste un'opzione semplice per trasferire tali impostazioni (almeno in IntelliJ) tra ambienti. Puoi eseguire il commit dei file di progetto IntelliJ nel tuo repository: potrebbe funzionare, ma non lo consiglio.

Sai come impostarli per maven-surefire-plugin. Buona. Questo è il modo più portatile (vedi la risposta di Ptomli per un esempio).

Per il resto, devi ricordare che i casi di test JUnit sono solo un gruppo di classi Java, non un programma autonomo. Spetta al corridore (lascia che sia un corridore JUnit autonomo, il tuo IDE, maven-surefire-pluginper impostare quelle opzioni. Detto questo non esiste un modo "portatile" per impostarle, in modo che le impostazioni di memoria siano applicate indipendentemente dal corridore.

Per darti un esempio: non puoi definire Xmxparametri durante lo sviluppo di un servlet - spetta al contenitore definirlo. Non puoi dire: "questo servlet dovrebbe sempre essere eseguito con Xmx=1G.


dove si trova la configurazione Esegui / Debug? Non lo vedo nelle preferenze o nel menu contestuale quando eseguo il test?
Dean Hiller

2
Notare che questo NON cambierà le configurazioni di esecuzione JUnit esistenti, ma solo quelle che vengono create dopo aver modificato le impostazioni predefinite. Devi cambiare quelli esistenti manualmente.
MikeFHay

78

In Maven puoi configurare il plugin infallibile

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

Se usi Maven per le build, questa configurazione verrà trasportata nell'albero dei sorgenti e applicata quando vengono eseguiti i test. Consulta la documentazione del plug-in Maven Surefire .


1
@ptomli - Diffido sempre dei commenti che iniziano con "Sicuramente ...". L'integrazione di Intellij maven utilizza la configurazione del plug-in pom durante l'esecuzione di attività nel ciclo di compilazione di maven. L'esecuzione degli unit test nell'IDE è un processo separato e per impostazione predefinita non è a conoscenza del processo di compilazione. Per quanto ne so, non c'è modo di collegarli, anche se sono felice che mi venga detto il contrario. È qualcosa di cui sei a conoscenza / che hai fatto - nel qual caso, puoi condividere come farlo?
amaidment

1
Non sono sicuro che sia possibile in Intellij. TBH, anche se lo fosse, non vorrei usare quell'approccio, poiché è probabile che, se eseguo gli unit test nell'IDE, voglio sfruttare il debugger IDE, cosa che non potrei fare eseguendo un test mvn.
amaidment

5
In realtà, l'integrazione Maven di IntelliJ non usare la configurazione con Maven Surefire nell'eseguire test di unità individuali. L'utilizzo della configurazione Maven di cui sopra farà sì -Xmx256Mche venga passato alla riga di comando Java durante l'esecuzione dei test unitari direttamente da IntelliJ. Questo mi ha appena confuso :-(
Kkkev

1
FYI: Netbeans utilizza anche Maven Suefire per eseguire i suoi test
Ferrybig

1
L'integrazione Maven di @Kkkev IntelliJ è diversa dall'esecuzione di un test individuale in IntelliJ. Il primo utilizza una configurazione di esecuzione Maven (e quindi legge l'argomento), il secondo utilizza una configurazione JUnit, TestNG ....
andresp


14

Secondo questa domanda di supporto https://intellij-support.jetbrains.com/hc/en-us/community/posts/206165789-JUnit-default-heap-size-overridden-

l'argomento -Xmx per un'esecuzione di test junit IntelliJ verrà dal plug-in maven-surefire, se impostato.

Questo frammento pom.xml

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

sembra passare l'argomento -Xmx1024 all'esecuzione del test junit, con IntelliJ 2016.2.4.


13

Sono d'accordo con gli altri che hanno affermato che non esiste un modo semplice per distribuire queste impostazioni.

Per Eclipse: chiedi ai tuoi colleghi di impostare quanto segue:

  • Preferenze di Windows / Java / JRE installati:
  • Seleziona il JRE / JDK corretto (o fallo per tutti)
  • modificare
  • Argomenti VM predefiniti: -Xmx1024m
  • Fine, ok.

Dopodiché tutti i test verranno eseguiti con, -Xmx1024mma sfortunatamente lo hai impostato in ogni installazione di Eclipse. Forse potresti creare un pacchetto Eclipse personalizzato che contiene questa impostazione e darlo a voi colleghi.

Anche il seguente processo di lavoro potrebbe aiutare: Se l'IDE non può eseguire un test, lo sviluppatore dovrebbe verificare che Maven possa eseguire questo test o meno.

  • Se Maven potesse eseguirlo , la causa del fallimento di solito sono le impostazioni dell'IDE dello sviluppatore. Lo sviluppatore dovrebbe controllare queste impostazioni.
  • Se anche Maven non può eseguire il test, lo sviluppatore sa che la causa dell'errore non è l'IDE, quindi potrebbe utilizzare l'IDE per eseguire il debug del test.

Dire che il progetto deve essere costruito con Maven non è molto utile. (Stiamo solo costruendo con Maven.) Tuttavia, il tuo suggerimento implicito è che dovremmo eseguire i test solo come parte del ciclo di compilazione Maven - usiamo spesso gli stessi test per il debug nell'IDE. (Con l'ulteriore vantaggio che una volta che è stato eseguito il debug di qualcosa, è facile mantenere quei test nel ciclo di compilazione.)
amaidment

ok - ma ora stai solo ripetendo la risposta di Tomasz, ma con le specifiche Eclipse ...
amaidment

2

Puoi utilizzare systemPropertyVariables (java.protocol.handler.pkgs è il nome dell'argomento 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

Un'alternativa specifica di eclipse limitata al parametro JVM java.library.path consente di impostarla per una cartella di origine specifica piuttosto che per l'intero jdk come proposto in un'altra risposta:

  1. selezionare la cartella sorgente in cui risiede il programma da avviare (solitamente sorgente / test / java)
  2. digitare alt invio per aprire la pagina delle proprietà per quella cartella
  3. seleziona nativo nel pannello di sinistra
  4. Modifica il percorso nativo. Il percorso può essere assoluto o relativo all'area di lavoro, il secondo è più resistente al cambiamento.

Per chi è interessato ai dettagli sul motivo per cui il tag argline di maven dovrebbe essere preferito a quello systemProperties, guarda, ad esempio:

Raccogli i file JNI nativi nel test Maven (lwjgl)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.