unitarias unitaria una tutorial software será qué que pruebas prueba método indica framework español curso anotación java maven-2 maven surefire

java - unitaria - Surefire no está recogiendo pruebas de Junit 4



testing en java (11)

Por algún motivo, no puedo obtener el complemento Maven 2 Surefire para ejecutar la clase de prueba JUnit 4.

public class SimpleTest { @org.junit.Test public void simple() { System.out.println("foo"); } }

Sin embargo, si cambio esta clase para que sea como JUnit-3, como

public class SimpleTest extends junit.framework.TestCase { public void testBar() { System.out.println("bar"); } @org.junit.Test public void simple() { System.out.println("foo"); } }

luego se ejecuta. Esto es lo que hice:

  • versión verificada de Maven: Apache Maven 2.2.1 (r801777; 2009-08-06 20: 16: 01 + 0100)
  • versión verificada de Surefire: siguió this consejo
  • versión verificada de Surefire: comprobó jarras Surefire en mi ~/.m2/repository/org/apache/maven/surefire - todas ellas son la versión 2.4.2 o 2.4.3
  • hecho una mvn dependency:tree | grep junit mvn dependency:tree | grep junit para asegurarme de que solo dependo de la versión junit 4.7

El módulo en el que estoy teniendo este problema no tiene pruebas de JUnit 3.

¿Hay algo más que me estoy perdiendo?


¿Ha configurado su plugin maven-compile para el nivel de compilación correcto, como:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin>

De lo contrario, maven tendrá problemas con las anotaciones


1.) Incluye el siguiente plugin de surefire en pom.xml

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.20</version> <configuration> </configuration> </plugin>

2.) Por defecto, el plugin surefire selecciona la clase de prueba del paquete: - src / test / java / ....

Vaya a Build Path e incluya la carpeta de prueba en classpath como a continuación:

3.) Ir a -> Ejecutar como -> Prueba de Maven

[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.081 s - in com.bnym.dcm.api.controller.AccountControllerTest [INFO] Running com.bnym.dcm.api.controller.DCMApiControllerTest [INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - in com.bnym.dcm.api.controller.DCMApiControllerTest [INFO] [INFO] Results: [INFO] [INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] ---------------------------------------------------------------------- -- [INFO] BUILD SUCCESS


El complemento Surefire se da cuenta de qué proveedor de JUnit se debe utilizar según el classpath. Si hay varias versiones de JUnit en la ruta de clase, puede corregir la ruta de clase para tener solo una versión de JUnit en la ruta de clase (como se explicó anteriormente), o puede especificar explícitamente qué proveedor desea usar. Por ejemplo, especificando lo siguiente en tus fuerzas (POM) POM utilizando el proveedor más nuevo (por ejemplo, "surefire-junit47"):

[...] <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.8</version> <dependencies> <!-- Force using the latest JUnit 47 provider --> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.8</version> </dependency> </dependencies> [...]

Sin embargo, tenga en cuenta que Surefire 2.7 cambió la forma en que determina qué unidades de prueba se ejecutan. El nuevo comportamiento al utilizar Surefire 2.7 (o posterior) con JUnit 4 es que cualquier prueba sin una anotación @Test se omitirá automáticamente. Esto puede ser excelente si solo tiene pruebas de unidad JUnit 4, pero si tiene una combinación de pruebas de JUnit 3 y 4 unidades, usar el proveedor "surefire-junit47" no funcionará correctamente. En tales casos, es mejor elegir explícitamente el proveedor "surefire-junit4":

[...] <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.8</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <!-- Use the older JUnit 4 provider --> <artifactId>surefire-junit4</artifactId> <version>2.8</version> </dependency> </dependencies> [...]


La verificación que has hecho es buena, especialmente verificando que estás usando la versión 2.3+ del plugin surefire (de manera predeterminada, obtendrás la versión 2.4.3 con maven 2.1 super POM así que esto debería estar bien) y verificando que no tirando de la dependencia junit-3.8.1.jar transitiva.

Ahora, solo para validar que este no es un "problema global" (no lo creo tan TBH), ¿podrías crear un proyecto desde cero, por ejemplo ejecutando:

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=maven-junit4-testcase

Luego actualiza la dependencia junit:

<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency>

Y configure el nivel de compilación para 1.5+

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin>

Finalmente, coloque su SimpleTest.java junto a AppTest.java y ejecute mvn test .

Si la ejecución de la mvn test funciona bien para ese proyecto (y espero que se ejecute sin problemas), ¿podría actualizar su pregunta con la configuración POM que está utilizando (del proyecto que tiene problemas)?


No sé a qué te refieres con "no se puede ejecutar", pero ¿ayuda a establecer explícitamente las inclusiones utilizadas por maven-surefire-plugin ?

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.4.3</version> <configuration> <includes> <include>**/*Test.java</include> </includes> </configuration> </plugin>

Además, ¿ejecuta maven con el -X proporciona información útil?


Para alguna pobre alma que se pregunta por qué Maven no acepta las pruebas de JUnit.

Tengo tanto JUnit como TestNG como dependencias. Pero quiero ejecutar mis pruebas funcionales de manera segura utilizando TestNG y surefire para ejecutar mis pruebas unitarias usando JUnit.

Sin embargo, descubrí que surefire estaba intentando ejecutar mis pruebas unitarias usando TestNG y no encontré nada para ejecutar. Mis pruebas JUnit fueron omitidas.

Más tarde me encontré con este problema Maven y configuré surefire para ejecutar solo pruebas "JUnit" como esta:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <properties> <property> <name>junit</name> <value>true</value> </property> </properties> </configuration> </plugin>

Espero que esto ayude a alguien.


Para beneficio de Googlers, cuando tuve este problema fue porque había incluido una dependencia de PowerMock que atraía a TestNG, lo que no causaba que SureFire detectara [TestNG].

Utilicé la pestaña "Jerarquía de dependencias" de m2eclipse del editor POM para encontrar la dependencia y hacer clic derecho para generar una exclusión (ver XML a continuación).

Para completar (y para aquellos que no usan m2eclipse) aquí está el XML que excluye la dependencia: solo encontré esta característica de Maven al ver estas etiquetas generadas automáticamente:

<dependency> <groupId>org.powermock</groupId> <artifactId>powermock-mockito-release-full</artifactId> <version>1.4.9</version> <classifier>full</classifier> <exclusions> <exclusion> <artifactId>powermock-module-testng</artifactId> <groupId>org.powermock</groupId> </exclusion> </exclusions> </dependency>

(En mi caso, excluir "powermock-module-testng" fue suficiente, pero podrías excluir TestNG directamente si viene desde otro lugar).


Tuve un problema similar al intentar ejecutar pruebas de integración. Tenía una versión anterior del plugin surefire que intentaba ejecutar TestNG y no jUnit. Cambié el número de versión en el pom a 2.20 y funcionó.


Un pequeño cambio me ayudó ¡¡¡Extrañamente !!!

Cambié el nombre de la clase de MyClassTest a TestMyClass, recibí esta idea después de veryfing mi padre POM.xml contiene debajo de la línea

<test.include.pattern> **/Test*.java <test.include.pattern/>


Una causa más posible puede ser este error (cerrado con "No se solucionará"): https://issues.apache.org/jira/browse/SUREFIRE-587

Resumen breve: las pruebas que extienden TestCase (pero no usan anotaciones) no se recogerán si su nombre no termina con "Prueba".


mvn -X me ayudó a revelar lo siguiente:

... [INFO] [surefire:test {execution: default-test}] [DEBUG] dummy:dummy:jar:1.0 (selected for null) [DEBUG] org.apache.maven.surefire:surefire-booter:jar:2.4.3:runtime (selected for runtime) [DEBUG] org.apache.maven.surefire:surefire-api:jar:2.4.3:runtime (selected for runtime) [DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-booter/2.4.3/surefire-booter-2.4.3.jar [DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-api/2.4.3/surefire-api-2.4.3.jar [DEBUG] dummy:dummy:jar:1.0 (selected for null) [DEBUG] org.testng:testng:jar:jdk15:5.8:test (selected for test) [DEBUG] junit:junit:jar:3.8.1:test (selected for test) [DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/testng/testng/5.8/testng-5.8-jdk15.jar [DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar [DEBUG] dummy:dummy:jar:1.0 (selected for null) [DEBUG] Retrieving parent-POM: org.apache.maven.surefire:surefire-providers:pom:2.4.3 for project: null:surefire-testng:jar:null from the repository. [DEBUG] Adding managed dependencies for unknown:surefire-testng [DEBUG] org.apache.maven.surefire:surefire-api:jar:2.4.3 [DEBUG] org.apache.maven.surefire:surefire-booter:jar:2.4.3 [DEBUG] org.codehaus.plexus:plexus-utils:jar:1.5.1 [DEBUG] org.apache.maven.surefire:surefire-testng:jar:2.4.3:test (selected for test) [DEBUG] org.apache.maven:maven-artifact:jar:2.0:test (selected for test) [DEBUG] org.codehaus.plexus:plexus-utils:jar:1.0.4:test (selected for test) [DEBUG] junit:junit:jar:3.8.1:test (selected for test) [DEBUG] org.testng:testng:jar:jdk15:5.7:test (selected for test) [DEBUG] org.apache.maven.surefire:surefire-api:jar:2.4.3:test (selected for test) ... [DEBUG] Test Classpath : ... [DEBUG] /home/mindas/.m2/repository/junit/junit/4.7/junit-4.7.jar

Por lo tanto, parece que el problema proviene del jar testng requiere JUnit v3.8.1. Aunque Test Classpath estaba configurado para depender de JUnit 4, ya era demasiado tarde.

testng dependencia de testng estaba ubicada en mi POM:

<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>5.8</version> <scope>test</scope> <classifier>jdk15</classifier> </dependency>

Inmediatamente después de que lo comente, las pruebas comenzaron a ejecutarse.

Lecciones aprendidas:

  • mvn dependency:tree no siempre es suficiente, mvn -X es un amigo.
  • surefire no está hecho para el cielo de los desarrolladores (me he dado cuenta de esto mientras miraba los informes del proyecto JIRA). Esto es especialmente cierto ya que no hay otras alternativas si usa Maven.

Gracias a todos por su ayuda. Desafortunadamente no hay forma de dividir los puntos de respuesta entre Pascal y Kaleb, pero el consejo de Kaleb de usar mvn -X me ayudó a ir por el camino correcto, así que los puntos de respuesta correctos son para él.