web-dev-qa-db-fra.com

Comment définir les paramètres de la machine virtuelle Java pour les tests unitaires Junit?

J'ai des tests unitaires Junit qui nécessitent une grande quantité d'espace mémoire pour s'exécuter, c'est-à-dire 1G. (Ils testent des fonctionnalités gourmandes en mémoire pour une application webstart qui ne s'exécutera qu'avec suffisamment d'espace disque et qui sera exécutée en interne sur des ordinateurs Windows 7 64 bits - par conséquent, la refonte des tests n'est pas une suggestion pratique.)

Je développe dans Intellij IDEA, je sais donc que je peux définir les paramètres de la machine virtuelle Java (par exemple -Xmx1024M) pour la classe de test. Cependant, ceci ne concerne que l'exécution de la classe de test entière. Si je veux exécuter un test individuel, je dois recréer les configurations d'exécution pour cette méthode de test.

En outre, ils sont IDE et spécifiques à une boîte - si je change de boîte (je développe sur plusieurs machines) ou si l'un de mes collègues tente d'exécuter les tests, ces paramètres ne sont pas transférés. Mes collègues utilisent également des IDE tels que Eclipse et NetBeans.) FWIW, nous utilisons Mercurial pour le contrôle du code source.

Pour le cycle de construction, nous utilisons Maven. Je sais donc comment spécifier les paramètres de la machine virtuelle Java.

Donc: - je cherche un moyen de spécifier les paramètres de la machine virtuelle Java qui s'appliqueront à l'ensemble de la classe de test et aux méthodes de test individuelles; et - j'aimerais partager ces spécifications entre IDE sur n'importe quelle machine (après avoir récupéré le code dans le référentiel).

88
amaidment

Dans IntelliJ, vous pouvez spécifier les paramètres par défaut pour chaque configuration d'exécution. Dans la boîte de dialogue de configuration Run/Debug (celle que vous utilisez pour configurer tas par test), cliquez sur Défaut et JUnit. Ces paramètres seront automatiquement appliqués à chaque nouvelle configuration de test JUnit. Je suppose que le même réglage existe pour Eclipse.

Cependant, il n'existe pas d'option simple pour transférer de tels paramètres (au moins dans IntelliJ) entre environnements. Vous pouvez valider des fichiers de projet IntelliJ dans votre référentiel: cela peut fonctionner, mais je ne le recommande pas.

Vous savez comment les configurer pour maven-surefire-plugin. Bien. C'est le moyen le plus portable (voir la réponse de Ptomli pour un exemple).

Pour le reste, vous devez vous rappeler que les tests JUnit ne sont qu'un groupe de classes Java, pas un programme autonome. C’est au coureur de choisir (qu’il s’agisse d’un coureur autonome JUnit, votre IDE). , maven-surefire-plugin pour définir ces options. Cela étant dit, il n’existe aucun moyen "portable" de les définir, de sorte que les paramètres de mémoire sont appliqués indépendamment du coureur.

Pour vous donner un exemple: vous ne pouvez pas définir le paramètre Xmx lors du développement d'un servlet - il appartient au conteneur de le définir. Vous ne pouvez pas dire: "cette servlet doit toujours être exécutée avec Xmx=1G.

47
Tomasz Nurkiewicz

Dans Maven, vous pouvez configurer le plugin surefire

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

Si vous utilisez Maven pour les constructions, cette configuration sera effectuée dans l’arborescence source et appliquée lors des tests. Voir la documentation Maven Surefire Plugin .

72
ptomli

Les paramètres peuvent également être définis à la volée.

mvn test -DargLine="-Dsystem.test.property=test"

Voir http://www.cowtowncoder.com/blog/archives/2010/04/entry_385.html

21
vpathak

Je suis d'accord avec les autres qui ont déclaré qu'il n'y avait pas de moyen simple de distribuer ces paramètres.

Pour Eclipse: demandez à vos collègues de définir les paramètres suivants:

  • Préférences Windows/Java/JRE installés:
  • Sélectionnez le bon JRE/JDK (ou faites-le pour tous)
  • Modifier
  • Par défaut VM arguments: -Xmx1024m
  • Terminer, d'accord.

Après cela, tout le test sera exécuté avec -Xmx1024m mais malheureusement, vous l’avez défini dans chaque installation Eclipse. Vous pourriez peut-être créer un package Eclipse personnalisé contenant ce paramètre et le donner à vos collègues.

Le processus de travail suivant pourrait également aider: Si le IDE ne peut pas exécuter de test, le développeur doit vérifier que Maven peut exécuter ce test ou non.

  • Si Maven peut s'exécuter, la cause de l'échec provient généralement des paramètres de l'EDI du développeur. Le développeur doit vérifier ces paramètres.
  • Si Maven également ne peut pas s'exécuter le test, le développeur sait que la cause de l'échec n'est pas l'EDI. Il/elle peut donc utiliser le IDE pour déboguer le test .
13
palacsint

Selon cette question d'assistance https://intellij-support.jetbrains.com/hc/en-us/community/posts/206165789-JUnit-default-heap-size-overridden-

l'argument -Xmx pour l'exécution d'un test IntelliJ junit proviendra du plugin maven-surefire-plugin, s'il est défini.

Cet extrait de pom.xml

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

semble passer l'argument -Xmx1024 à l'exécution du test junit, avec IntelliJ 2016.2.4.

12
Mark K.

Vous pouvez utiliser systemPropertyVariables (Java.protocol.handler.pkgs est le nom de votre argument 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

2
sendon1982

Une alternative spécifique à Eclipse limitée au paramètre JVM Java.library.path permet de le définir pour un dossier source spécifique plutôt que pour l'ensemble du jdk, comme proposé dans une autre réponse:

  1. sélectionnez le dossier source dans lequel réside le programme à démarrer (généralement source/test/Java)
  2. tapez alt entrer pour ouvrir la page de propriétés de ce dossier
  3. sélectionnez natif dans le panneau de gauche
  4. Editez le chemin natif. Le chemin peut être absolu ou relatif à l'espace de travail, le second étant plus résilient au changement.

Pour ceux qui sont intéressés par les raisons pour lesquelles maven argline tag devrait être préféré à celui de systemProperties, regardez, par exemple:

Récupérer les fichiers JNI natifs dans le test Maven (lwjgl)

1
paswar