Comment définir les paramètres JVM pour les tests unitaires Junit?

95

J'ai quelques tests unitaires Junit qui nécessitent une grande quantité d'espace de tas pour fonctionner - c'est-à-dire 1G. (Ils testent les fonctionnalités gourmandes en mémoire pour une application de démarrage Web qui ne fonctionnera qu'avec un espace de stockage suffisant et qui sera exécutée en interne sur des machines Win 7 64 bits - la refonte des tests n'est donc pas une suggestion pratique.)

Je développe dans Intellij IDEA, donc je sais que je peux définir les paramètres JVM (par exemple -Xmx1024M) pour la classe de test. Cependant, ce n'est que pour exécuter toute la classe de test - 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, ceux-ci sont spécifiques à l'IDE et à la boîte - donc si je change de boîte (je développe sur plusieurs machines) ou si l'un de mes collègues essaie d'exécuter les tests, ces paramètres ne sont pas transférés. (De plus, d'autres IDE comme Eclipse et NetBeans sont utilisés par mes collègues.) FWIW, nous utilisons mercurial pour le contrôle du code source.

Pour le cycle de construction, nous utilisons Maven, donc je sais comment spécifier les paramètres JVM pour cela.

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

indemnité
la source
Je doute que ce soit faisable. Sur toutes les machines, pour un IDE donné, cela devrait être faisable. Mais à travers les IDE, je ne vois pas comment.
JB Nizet
@JBNizet - Je serais heureux de prendre en main des machines pour un IDE donné (à condition que ce soit Intellij IDEA).
indemnité du

Réponses:

48

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 Exécuter / Déboguer (celle que vous utilisez pour configurer le tas par test), cliquez sur Defaults et JUnit . Ces paramètres seront automatiquement appliqués à chaque nouvelle configuration de test JUnit. Je suppose qu'un paramètre similaire existe pour Eclipse.

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

Vous savez comment les définir 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 cas de test JUnit ne sont qu'un ensemble de classes Java, pas un programme autonome. C'est au runner (que ce soit un runner JUnit autonome, votre IDE, maven-surefire-pluginpour définir ces options. Cela étant dit, il n'y a pas de moyen "portable" de les définir, de sorte que les paramètres de mémoire soient appliqués quel que soit le runner.

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

Tomasz Nurkiewicz
la source
où se trouve la configuration Exécuter / Déboguer? Je ne vois pas cela dans les préférences ou le menu contextuel lorsque j'exécute le test?
Dean Hiller
2
Notez que cela ne modifiera PAS les configurations d'exécution JUnit existantes, mais uniquement celles qui sont créées après avoir modifié les valeurs par défaut. Vous devez modifier les existants manuellement.
MikeFHay
78

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 builds, cette configuration sera transportée dans l'arborescence des sources et appliquée lorsque les tests sont effectués. Consultez la documentation du plugin Maven Surefire .

ptomli
la source
1
@ptomli - Je me méfie toujours des commentaires qui commencent "Sûrement ...". L'intégration Intellij maven utilise la configuration du plugin pom lors de l'exécution de tâches sur le cycle de construction maven. L'exécution des tests unitaires dans l'EDI est un processus distinct et, par défaut, n'a aucune connaissance du processus de construction. À ma connaissance, il n'y a aucun moyen de les relier - même si je suis heureux qu'on me dise le contraire. Est-ce quelque chose dont vous avez connaissance / avez fait - dans quel cas, pouvez-vous expliquer comment le faire?
remboursement du
1
Je ne suis pas sûr que ce soit possible dans Intellij. TBH, même si c'était le cas, je ne voudrais pas utiliser cette approche, car il y a de fortes chances que si j'exécute les tests unitaires dans l'EDI, je souhaite profiter du débogueur IDE, ce que je ne pourrais pas faire en exécutant un test mvn.
indemnité du
5
En fait, l'intégration de Maven IntelliJ n'utilise la configuration Maven Surefire lors de l' exécution des tests unitaires individuels. L'utilisation de la configuration Maven ci-dessus entraînera le passage à la ligne de commande Java lors de l'exécution de vos tests unitaires directement à partir d'IntelliJ. Cela vient de me -Xmx256M
dérouter
1
FYI: Netbeans utilise également Maven Suefire pour exécuter ses tests
Ferrybig
1
L'intégration Maven de @Kkkev IntelliJ est différente de l'exécution d'un test individuel dans IntelliJ. Le premier utilise une configuration d'exécution Maven (et lit donc l'argument), le second utilise une configuration JUnit, TestNG ...
andresp
14

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 une exécution de test Junit IntelliJ proviendra du plugin maven-surefire-plugin, s'il est défini.

Cet extrait de code 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 au test junit, avec IntelliJ 2016.2.4.

Mark K.
la source
13

Je suis d'accord avec les autres qui disent qu'il n'y a 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 JRE / JDK approprié (ou faites-le pour tous)
  • Éditer
  • Arguments de VM par défaut: -Xmx1024m
  • Terminez, OK.

Après cela, tous les tests seront exécutés avec -Xmx1024mmais malheureusement, vous l'avez défini dans chaque installation d'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 l'EDI ne peut pas exécuter un test, le développeur doit vérifier que Maven peut exécuter ce test ou non.

  • Si Maven pouvait l'exécuter , la cause de l'échec est généralement les paramètres de l'IDE du développeur. Le développeur doit vérifier ces paramètres.
  • Si Maven ne pouvait pas non plus exécuter le test, le développeur sait que la cause de l'échec n'est pas l'EDI, donc il / elle pourrait utiliser l'IDE pour déboguer le test.
palacsint
la source
Dire que le projet doit être construit avec maven n'est pas très utile. (Nous construisons uniquement avec maven.) Cependant, implicitement dans votre suggestion est que nous ne devrions exécuter des tests que dans le cadre du cycle de construction maven - nous utilisons souvent les mêmes tests pour le débogage dans l'EDI. (Avec l'avantage supplémentaire qu'une fois quelque chose a été débogué il est facile de garder ces tests dans le cycle de construction.)
amaidment
ok - mais maintenant vous ne faites que répéter la réponse de Tomasz, mais avec les spécifications d'Eclipse ...
aide le
2

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

sendon1982
la source
1

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 enter pour ouvrir la page Propriétés de ce dossier
  3. sélectionnez natif dans le panneau de gauche
  4. Modifiez le chemin natif. Le chemin peut être absolu ou relatif à l'espace de travail, le second étant plus résilient aux changements.

Pour ceux qui s'intéressent aux détails sur les raisons pour lesquelles la balise maven argline devrait être préférée à la balise systemProperties, regardez, par exemple:

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

paswar
la source