¿Cómo configurar los parámetros de JVM para las pruebas unitarias de Junit?

95

Tengo algunas pruebas unitarias de Junit que requieren una gran cantidad de espacio de almacenamiento para ejecutarse, es decir, 1G. (Ellos prueban la funcionalidad de uso intensivo de memoria para una aplicación webstart que solo se ejecutará con suficiente espacio en el montón y se ejecutará internamente en máquinas Win 7 de 64 bits, por lo que rediseñar las pruebas no es una sugerencia práctica).

Estoy desarrollando en Intellij IDEA, así que sé que puedo configurar los parámetros de JVM (por ejemplo, -Xmx1024M) para la clase de prueba. Sin embargo, esto es solo para ejecutar toda la clase de prueba; si quiero ejecutar una prueba individual, tengo que volver a crear las configuraciones de ejecución para ese método de prueba.

Además, esos son IDE y específicos de caja, por lo que si cambio de caja (desarrollo en varias máquinas) o uno de mis colegas intenta ejecutar las pruebas, esas configuraciones no se transfieren. (Además, mis colegas usan otros IDE como Eclipse y NetBeans). FWIW, estamos usando mercurial para el control del código fuente.

Para el ciclo de compilación, estamos usando Maven, así que sé cómo especificar los parámetros de JVM para eso.

Entonces: - Estoy buscando una forma de especificar los parámetros de JVM que se aplicarán a toda la clase de prueba y los métodos de prueba individuales; y - Me gustaría compartir esas especificaciones entre los IDE en cualquier máquina (habiendo recogido el código del repositorio).

amor
fuente
Dudo que sea factible. En todas las máquinas, para un IDE determinado, debería ser factible. Pero en IDE no veo cómo.
JB Nizet
@JBNizet - Me encantaría poder cruzar máquinas para un IDE determinado (siempre que sea Intellij IDEA).
amaidment

Respuestas:

48

En IntelliJ puede especificar la configuración predeterminada para cada configuración de ejecución. En el cuadro de diálogo de configuración Ejecutar / Depurar (el que usa para configurar el montón por prueba) haga clic en Valores predeterminados y JUnit . Esta configuración se aplicará automáticamente a cada nueva configuración de prueba JUnit. Supongo que existe una configuración similar para Eclipse.

Sin embargo, no existe una opción simple para transferir dicha configuración (al menos en IntelliJ) entre entornos. Puede enviar archivos de proyecto IntelliJ a su repositorio: podría funcionar, pero no lo recomiendo.

Sabes cómo configurarlos maven-surefire-plugin. Bueno. Esta es la forma más portátil (consulte la respuesta de Ptomli para ver un ejemplo).

Por lo demás, debe recordar que los casos de prueba de JUnit son solo un grupo de clases de Java, no un programa independiente. Depende del corredor (deje que sea un corredor JUnit independiente, su IDE, maven-surefire-pluginpara configurar esas opciones. Dicho esto, no hay una forma "portátil" de configurarlas, por lo que la configuración de memoria se aplica independientemente del corredor.

Para darle un ejemplo: no se puede definir un Xmxparámetro cuando se desarrolla un servlet, depende del contenedor definirlo. No se puede decir: "este servlet siempre debe ejecutarse con Xmx=1G.

Tomasz Nurkiewicz
fuente
¿Dónde está la configuración Ejecutar / Depurar? ¿No veo esto en las preferencias o en el menú contextual cuando ejecuto la prueba?
Dean Hiller
2
Tenga en cuenta que esto NO cambiará las configuraciones de ejecución de JUnit existentes, solo las que se crean después de cambiar los valores predeterminados. Tienes que cambiar los existentes manualmente.
MikeFHay
78

En Maven puedes configurar el complemento surefire

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

Si usa Maven para compilaciones, esta configuración se incluirá en el árbol de fuentes y se aplicará cuando se realicen las pruebas. Consulte la documentación del complemento Surefire de Maven .

ptomli
fuente
1
@ptomli - Siempre desconfío de los comentarios que comienzan con "Seguramente ...". La integración de Intellij maven utiliza la configuración del complemento pom cuando se ejecutan tareas en el ciclo de compilación de maven. La ejecución de las pruebas unitarias en el IDE es un proceso independiente y, de forma predeterminada, no tiene conocimiento del proceso de compilación. Que yo sepa, no hay forma de conectarlos, aunque me alegra que me digan lo contrario. ¿Es esto algo de lo que tiene conocimiento / ha hecho? En cuyo caso, ¿puede compartir cómo hacerlo?
Admisión
1
No estoy seguro de que eso sea posible en Intellij. TBH, incluso si lo fuera, no querría usar ese enfoque, ya que lo más probable es que si estoy ejecutando las pruebas unitarias en el IDE, quiero aprovechar el depurador del IDE, lo cual no podría hacer. ejecutando una prueba mvn.
Admisión el
5
En realidad, la integración Maven de IntelliJ no utilizar la configuración Maven éxito seguro al ejecutar pruebas unitarias individuales. El uso de la configuración de Maven anterior hará -Xmx256Mque se pase a la línea de comandos de Java al ejecutar sus pruebas unitarias directamente desde IntelliJ. Esto me ha confundido
muchísimo
1
FYI: Netbeans también usa Maven Suefire para ejecutar sus pruebas
Ferrybig
1
La integración de Maven de @Kkkev IntelliJ es diferente de ejecutar una prueba individual en IntelliJ. El primero usa una configuración de ejecución de Maven (y por lo tanto lee el argumento), el segundo usa una configuración JUnit, TestNG ...
andresp
14

Según esta pregunta de soporte https://intellij-support.jetbrains.com/hc/en-us/community/posts/206165789-JUnit-default-heap-size-overridden-

el argumento -Xmx para una ejecución de prueba junit de IntelliJ vendrá del complemento maven-surefire-plugin, si está configurado.

Este fragmento de pom.xml

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

parece pasar el argumento -Xmx1024 a la ejecución de prueba junit, con IntelliJ 2016.2.4.

Mark K.
fuente
13

Estoy de acuerdo con los demás que dijeron que no hay una forma sencilla de distribuir estos ajustes.

Para Eclipse: pida a sus colegas que configuren lo siguiente:

  • Preferencias de Windows / Java / JRE instalados:
  • Seleccione el JRE / JDK adecuado (o hágalo para todos)
  • Editar
  • Argumentos de VM predeterminados: -Xmx1024m
  • Termina, de acuerdo.

Después de eso, todas las pruebas se ejecutarán con -Xmx1024m pero desafortunadamente lo ha configurado en cada instalación de Eclipse. Tal vez podría crear un paquete Eclipse personalizado que contenga esta configuración y entregárselo a sus compañeros de trabajo.

El siguiente proceso de trabajo también podría ayudar: Si el IDE no puede ejecutar una prueba, el desarrollador debe verificar que Maven pueda ejecutar esta prueba o no.

  • Si Maven pudo ejecutarlo , la causa de la falla generalmente es la configuración del IDE del desarrollador. El desarrollador debe verificar esta configuración.
  • Si Maven tampoco pudo ejecutar la prueba, el desarrollador sabe que la causa de la falla no es el IDE, por lo que podría usar el IDE para depurar la prueba.
palacsint
fuente
Decir que el proyecto tiene que construirse con maven no es muy útil. (Solo estamos construyendo con maven). Sin embargo, su sugerencia está implícita en que solo deberíamos ejecutar pruebas como parte del ciclo de compilación de maven; a menudo usamos las mismas pruebas para depurar en el IDE. (Con la ventaja, además, que una vez que algo se ha depurado es fácil mantener esas pruebas en el ciclo de acumulación.)
amaidment
ok - pero ahora solo está repitiendo la respuesta de Tomasz, pero con las especificaciones de Eclipse ...
respuesta
2

Puede usar systemPropertyVariables (java.protocol.handler.pkgs es el nombre de su argumento 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
fuente
1

Una alternativa específica de eclipse limitada al parámetro de JVM java.library.path permite configurarlo para una carpeta de origen específica en lugar de para todo el jdk como se propone en otra respuesta:

  1. seleccione la carpeta de origen en la que reside el programa para iniciar (generalmente source / test / java)
  2. escriba alt enter para abrir la página de Propiedades para esa carpeta
  3. seleccione nativo en el panel izquierdo
  4. Edite la ruta nativa. La ruta puede ser absoluta o relativa al espacio de trabajo, siendo el segundo más resistente al cambio.

Para aquellos interesados ​​en los detalles sobre por qué la etiqueta maven argline debe preferirse a la de systemProperties, mire, por ejemplo:

Recoger archivos JNI nativos en la prueba de Maven (lwjgl)

paswar
fuente