2010-02-12 23 views
29

Deseo poder ejecutar todas las pruebas en un proyecto mediante programación. Sé que Eclipse tiene una configuración de "Ejecutar como prueba JUnit" que de alguna manera toma todas las pruebas en un proyecto y las ejecuta. ¿Hay alguna forma de que también tome la lista de pruebas programáticamente y las ejecute? ¿O hay alguna buena manera de construir un conjunto de pruebas que contenga todos los casos de prueba sin enumerar manualmente cada uno (más de 700) de ellos?Ejecutar todas las pruebas en Junit 4

he probado el "Nuevo ... -> Test Suite" opción en Eclipse, pero que parece que funciona sólo para JUnit 3, la identificación de pruebas por su TestCase se extiende desde

Las clases de prueba son JUnit 4 , por lo que su única característica distintiva es la anotación, sin convención de nomenclatura, sin subclases de TestCase.

¡Gracias de antemano!

+2

Vea si esto ayuda: http://burtbeckwith.com/blog/?p=52 –

Respuesta

20

Aunque en realidad no resuelve su problema inmediato, creo que es una práctica general muy útil crear suites y suites de suites, p. para un paquete como PackageFooSuite etc. y ensamblar estas suites en una o más suites nuevamente, como ModuleFooSuite y tener una suite de nivel superior, como AllTestsSuite. De esta manera es fácil de ejecutar tanto todas las pruebas en un solo paso, así como pruebas submódulo para el paquete de trabajo actualmente en (y tienen las pruebas se ejecutan más rápido que si yo siempre correr todos ellos):

@RunWith(Suite.class) 
@Suite.SuiteClasses({ PackageFooSuite.class, PackageBarSuite.class}) 
public final class AllTestsSuite {} // or ModuleFooSuite, and that in AllTests 
+1

Tiendo a estar de acuerdo contigo. Desafortunadamente las personas que estaban trabajando en esto antes que yo no lo hicieron y dejaron tal vez 700 o más testcases que no estoy interesado en unir manualmente a mano – alexloh

+0

@alexloh: Sí, bastante comprensible. Quizás sea realmente posible automatizar esto sin demasiada molestia, como por ejemplo: para cada paquete/directorio, cree una clase suite formada por los nombres de todos los archivos en el paquete/directorio actual. Si comienza desde el directorio inferior, también podría ser relativamente simple incluir las suites generadas para un subpaquete en el nivel anterior. –

3

Usted puede hacer esto con bastante facilidad desde dentro experta en el uso de la surefire plugin: Normalmente limpia/compilar/instalar mis proyectos desde la línea de comandos antes de compararlos para el uso de Eclipse (mvn eclipse:clean eclipse:eclipse) y puede definir un conjunto de pruebas en su pom cuales enumera todas las pruebas que desea ejecutar en masa cada vez que ejecuta mvn install. No los está llamando programáticamente, exactamente, pero ciertamente puede llamarlos en masa.

+0

Hmm ... No uso Maven, pero lo intentaré si resuelve mi problema. Voy a marcar esto si encuentro que funciona. ¡¡Gracias!! – alexloh

2

de la parte superior de la cabeza utilizando Spring:

  • Implementar un TypeFilter que coincide con las clases con métodos anotados con @test (no se olvide de tener en cuenta las superclases)
  • de exploración ruta de clase de invocación en su parte superior la mayoría de pruebas paquete
  • invoque el JUnitRunner con los resultados del análisis

Más información sobre los filtros de tipo de exploración y personalizados de ruta de clases here

0

También se recomienda el uso de las anotaciones JUnit Suite. Siga el link for more detail.

+0

esto suena como el listado manual OP explícitamente quería evitar. – eis

2

Con Eclipse Indigo (posiblemente también Helios) en el cuadro de diálogo Configuraciones de ejecución, ahora puede ejecutar todas las pruebas en un proyecto, paquete o carpeta de origen seleccionados.

También una buena referencia de Eclipse es el artículo Java Unit testing with JUnit 4.x in Eclipse.

13

Ninguna de las otras respuestas lo hizo por mí. Tenía 40k pruebas que necesitaba ejecutar, por lo que enumerar manualmente cada clase no era una opción.

Lo hice con ClasspathSuite.Un conjunto de pruebas que se ejecuta todos los casos de prueba junit4 y Junit3 en la ruta de clase es el siguiente:

import org.junit.extensions.cpsuite.ClasspathSuite; 
import org.junit.extensions.cpsuite.ClasspathSuite.*; 
import org.junit.runner.RunWith; 
import org.junit.runner.JUnitCore; 
import static org.junit.extensions.cpsuite.SuiteType.*; 

@RunWith(ClasspathSuite.class) 
@SuiteTypes({ JUNIT38_TEST_CLASSES, TEST_CLASSES }) 
public class RunAllSuite { 
     /* main method not needed, but I use it to run the tests */ 
     public static void main(String args[]) { 
       JUnitCore.runClasses(RunAllSuite.class); 
     } 
} 

que necesitaba para ejecutarlo desde la línea de comandos, así que esto es lo que hice:

  1. Downloaded cp-1.2.6.jar
  2. Crear el ya mencionado RunAllSuite
  3. compilar la clase, javac RunAllSuite.java -cp cpsuite-1.2.6.jar;junit-4.8.1.jar
  4. plazo con las pruebas de destino en la ruta de clase, java -cp cpsuite-1.2.6.jar;junit-4.8.1.jar;path/to/runallsuite/folder;target/classes;target/test-classes RunAllSuite

Y eso es todo. Con RunAllSuite arriba, en cualquier parte de tu código, puedes hacer JUnitCore.runClasses (RunAllSuite.class), que ejecuta todas las pruebas en la ruta de clase. También hay otras opciones de configuración que se explican en la página de inicio de ClasspathSuite.

Tenga en cuenta también que la clase dada arriba no imprime nada. Si lo que se necesita, se puede hacer

import org.junit.extensions.cpsuite.ClasspathSuite; 
import org.junit.extensions.cpsuite.ClasspathSuite.*; 
import org.junit.runner.RunWith; 
import org.junit.runner.JUnitCore; 
import org.junit.internal.TextListener; 
import static org.junit.extensions.cpsuite.SuiteType.*; 

@RunWith(ClasspathSuite.class) 
@SuiteTypes({ JUNIT38_TEST_CLASSES, TEST_CLASSES }) 
public class RunAllSuite { 
     public static void main(String args[]) { 
       JUnitCore junit = new JUnitCore(); 
       junit.addListener(new TextListener(System.out)); 
       junit.run(RunAllSuite.class); 
     } 
} 
+0

"Tenía 40k pruebas que necesitaba ejecutar, por lo que enumerar manualmente cada clase no era una opción". ¿Podría haber usado algún tipo de programa de manipulación de texto para escanear los nombres de estos archivos de clase de prueba y crear el código para ejecutar la prueba? Es decir, para cada archivo .java, imprima una línea en la clase RunAllSuite que diga 'JUnitCore.main ($ thatfilename.class);' - no es que su código ya no funcione. – Jan

+1

@ Jan incluso si dejamos de lado la impracticabilidad, el tamaño de la clase también tiene sus límites (64k caracteres, para ser exactos). No veo cómo todos esos nombres de prueba hubieran encajado en eso. – eis

+0

ah, buen punto. ¡No sabía que había un límite difícil! Además, ¡tu solución ya es muy elegante! – Jan

3

En Eclipse (estoy usando 4.6.1) - Haga clic derecho en la carpeta del proyecto, seleccione "Ejecutar como", elegir la opción "JUnit Test"

Será ejecutar todas las pruebas en ese proyecto. Lo mismo para un paquete.

Cuestiones relacionadas