99 votes

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

J'ai quelques tests unitaires Junit qui nécessitent une grande quantité d'espace heap pour s'exécuter - c'est-à-dire 1G. (Ils testent des fonctionnalités gourmandes en mémoire pour une application webstart qui ne fonctionnera qu'avec un espace de tas suffisant, et seront exécutés en interne sur des machines Win 7 64-bit - donc redessiner les tests n'est 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, cela ne sert qu'à exécuter l'ensemble de 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.

De plus, ces paramètres sont spécifiques à l'IDE et à la boîte, donc si je change de boîte (je développe sur plusieurs machines) ou si un de mes collègues essaie d'exécuter les tests, ces paramètres ne sont pas transférés. (Par ailleurs, mes collègues utilisent d'autres IDE comme Eclipse et NetBeans.) Pour information, 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 de la JVM pour cela.

Ainsi : - 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 entre les IDE sur n'importe quelle machine (après avoir récupéré le code dans le référentiel).

0 votes

Je doute que ce soit faisable. D'une machine à l'autre, pour un IDE donné, cela devrait être faisable. Mais entre les IDE, je ne vois pas comment.

0 votes

@JBNizet - Je serais heureux de prendre en charge plusieurs machines pour un IDE donné (à condition qu'il s'agisse d'Intellij IDEA).

81voto

ptomli Points 5778

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 portée dans l'arbre des sources et appliquée lorsque les tests seront effectués. Voir la page Plugin Maven Surefire documentation.

0 votes

L'OP dit : " Pour le cycle de construction, nous utilisons Maven, donc Je sais comment spécifier les paramètres de la JVM pour cela. . "

0 votes

Eh bien, le amaidment semble être plus intéressé par le transfert des paramètres de l'IDE que par celui de maven (qu'il a déjà configuré). Tant pis, nous verrons bien.

0 votes

@ptomli - pouvez-vous expliquer en quoi cela répond à ma question initiale ? Si j'exécute des tests dans mon IDE (ce que nous faisons pour le débogage, en plus de faire partie du cycle de construction), comment cela récupère-t-il la configuration JVM de Maven ?

49voto

Tomasz Nurkiewicz Points 140462

Dans IntelliJ, vous pouvez spécifier des paramètres par défaut pour chaque configuration d'exécution. Dans Exécuter/Déboguer (celui que vous utilisez pour configurer le tas par test) cliquez sur Valeurs par défaut y 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 (du moins dans IntelliJ) d'un environnement à l'autre. Vous pouvez livrer les fichiers du projet IntelliJ à votre référentiel : cela peut fonctionner, mais je ne le recommande pas.

Vous savez comment les régler 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 scénarios de test JUnit ne sont qu'un ensemble de classes Java, et non un programme autonome. C'est au runner (que ce soit un runner JUnit autonome, votre IDE, maven-surefire-plugin pour définir ces options. Cela dit, il n'existe pas de moyen "portable" de les définir, de sorte que les paramètres de mémoire soient appliqués indépendamment du coureur.

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

0 votes

Où se trouve la configuration Run/Debug ? Je ne la vois pas dans les préférences ou dans le menu contextuel lorsque je lance le test ?

2 votes

Notez que cela ne modifiera PAS les configurations d'exécution de JUnit existantes, seulement celles qui sont créées après que vous ayez modifié les valeurs par défaut. Vous devez modifier les configurations existantes manuellement.

25voto

vpathak Points 158

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

13voto

palacsint Points 9823

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

Pour Eclipse : demandez à vos collègues de définir les éléments suivants :

  • Préférences Windows / Java / JREs installés :
  • Sélectionner le JRE/JDK approprié (ou le faire pour tous)
  • Modifier
  • Arguments VM par défaut : -Xmx1024m
  • Terminé, OK.

Après cela, tous les tests seront exécutés avec -Xmx1024m mais malheureusement vous l'avez défini dans chaque installation d'Eclipse. Peut-être pourriez-vous créer un paquet Eclipse personnalisé qui contient ce paramètre et le donner à vos collègues.

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

  • Si Maven pourrait courir 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 a également ne pouvait pas fonctionner le développeur sait que la cause de l'échec n'est pas l'IDE, il peut donc utiliser l'IDE pour déboguer le test.

0 votes

Dire que le projet doit être construit avec maven n'est pas très utile. (Nous ne construisons qu'avec maven.) Cependant, implicitement, votre suggestion est que nous ne devrions exécuter les tests que dans le cadre du cycle de construction de maven - nous utilisons souvent les mêmes tests pour le débogage dans l'IDE. (Avec l'avantage supplémentaire qu'une fois que quelque chose a été débogué, il est facile de garder ces tests dans le cycle de construction).

0 votes

Ok - mais maintenant vous ne faites que répéter la réponse de Tomasz, mais avec les spécifications d'Eclipse...

1voto

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électionner le dossier source dans lequel se trouve le programme à lancer (généralement source/test/java)
  2. tapez alt enter pour ouvrir la page des propriétés de ce dossier
  3. sélectionnez native dans le panneau de gauche
  4. Modifier le chemin d'accès natif. Le chemin peut être absolu ou relatif à l'espace de travail, le second étant plus résistant aux changements.

Pour ceux qui sont intéressés par le détail de la raison pour laquelle la balise maven argline devrait être préférée à celle de systemProperties, regardez, par exemple :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X