2010-09-10 22 views
6

Me gustaría ejecutar todas las pruebas junit 4 dentro de mi proyecto Eclipse. El proyecto está configurado con/source y/test. Bajo/prueba de varios paquetes, tales como:¿Cómo puedo encontrar y ejecutar de forma recursiva todas las pruebas de Junit 4 dentro de Eclipse?

com.yaddayadda.test.core.entity 
com.yaddayadda.test.core.framework 

Si right-click en el nivel /test en el explorador de paquetes y seleccione Ejecutar como; Prueba Junit recibo el error:

No tests found with test runner 'JUnit 4'. 

Si yo haga clic derecho en com.yaddayadda.test.core.entity, entonces se encuentra y ejecuta todas las pruebas dentro de ese paquete. Por lo tanto, las anotaciones @Test son correctas (Ant también las selecciona correctamente en el servidor de compilación). Sin embargo, si intento ejecutar todas las pruebas dentro de com.yaddayadda.test.core, no encuentra ninguna.

Básicamente, solo parece mirar dentro del paquete, más bien de forma recusiva en todos los niños. ¿Hay alguna manera de arreglar esto?

Respuesta

4

En caso que cualquier otra persona está buscando una solución a esto, he encontrado una respuesta aquí en el sitio web de Burt Beckwith:

http://burtbeckwith.com/blog/?p=52

To use this, just right-click it in the class tree in Eclipse and click “Run As JUnit Test”.

import java.io.File; 
import java.io.UnsupportedEncodingException; 
import java.lang.reflect.Modifier; 
import java.net.URLDecoder; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

import org.apache.log4j.Logger; 
import org.junit.internal.runners.InitializationError; 
import org.junit.runner.Description; 
import org.junit.runner.RunWith; 
import org.junit.runner.notification.RunListener; 
import org.junit.runner.notification.RunNotifier; 
import org.junit.runners.Suite; 

/** 
* Discovers all JUnit tests and runs them in a suite. 
*/ 
@RunWith(AllTests.AllTestsRunner.class) 
public final class AllTests { 

    private static final File CLASSES_DIR = findClassesDir(); 

    private AllTests() { 
    // static only 
    } 

    /** 
    * Finds and runs tests. 
    */ 
    public static class AllTestsRunner extends Suite { 

    private final Logger _log = Logger.getLogger(getClass()); 

    /** 
    * Constructor. 
    * 
    * @param clazz the suite class - <code>AllTests</code> 
    * @throws InitializationError if there's a problem 
    */ 
    public AllTestsRunner(final Class<?> clazz) throws InitializationError { 
     super(clazz, findClasses()); 
    } 

    /** 
    * {@inheritDoc} 
    * @see org.junit.runners.Suite#run(org.junit.runner.notification.RunNotifier) 
    */ 
    @Override 
    public void run(final RunNotifier notifier) { 
     initializeBeforeTests(); 

     notifier.addListener(new RunListener() { 
     @Override 
     public void testStarted(final Description description) { 
      if (_log.isTraceEnabled()) { 
      _log.trace("Before test " + description.getDisplayName()); 
      } 
     } 

     @Override 
     public void testFinished(final Description description) { 
      if (_log.isTraceEnabled()) { 
      _log.trace("After test " + description.getDisplayName()); 
      } 
     } 
     }); 

     super.run(notifier); 
    } 

    private static Class<?>[] findClasses() { 
     List<File> classFiles = new ArrayList<File>(); 
     findClasses(classFiles, CLASSES_DIR); 
     List<Class<?>> classes = convertToClasses(classFiles, CLASSES_DIR); 
     return classes.toArray(new Class[classes.size()]); 
    } 

    private static void initializeBeforeTests() { 
     // do one-time initialization here 
    } 

    private static List<Class<?>> convertToClasses(
     final List<File> classFiles, final File classesDir) { 

     List<Class<?>> classes = new ArrayList<Class<?>>(); 
     for (File file : classFiles) { 
     if (!file.getName().endsWith("Test.class")) { 
      continue; 
     } 
     String name = file.getPath().substring(classesDir.getPath().length() + 1) 
      .replace('/', '.') 
      .replace('\\', '.'); 
     name = name.substring(0, name.length() - 6); 
     Class<?> c; 
     try { 
      c = Class.forName(name); 
     } 
     catch (ClassNotFoundException e) { 
      throw new AssertionError(e); 
     } 
     if (!Modifier.isAbstract(c.getModifiers())) { 
      classes.add(c); 
     } 
     } 

     // sort so we have the same order as Ant 
     Collections.sort(classes, new Comparator<Class<?>>() { 
     public int compare(final Class<?> c1, final Class<?> c2) { 
      return c1.getName().compareTo(c2.getName()); 
     } 
     }); 

     return classes; 
    } 

    private static void findClasses(final List<File> classFiles, final File dir) { 
     for (File file : dir.listFiles()) { 
     if (file.isDirectory()) { 
      findClasses(classFiles, file); 
     } 
     else if (file.getName().toLowerCase().endsWith(".class")) { 
      classFiles.add(file); 
     } 
     } 
    } 
    } 

    private static File findClassesDir() { 
    try { 
     String path = AllTests.class.getProtectionDomain() 
     .getCodeSource().getLocation().getFile(); 
     return new File(URLDecoder.decode(path, "UTF-8")); 
    } 
    catch (UnsupportedEncodingException impossible) { 
     // using default encoding, has to exist 
     throw new AssertionError(impossible); 
    } 
    } 
} 
+4

Agregue la esencia de la publicación a su respuesta en caso de que el blog llegue 404 a nosotros. – ShiDoiSi

8

Primero: Seleccione su proyecto en el Explorador de proyectos y pulse Alt + Shift + X T. Se ejecutará todas las pruebas JUint en el marco del proyecto. Lo mismo se puede hacer haciendo clic derecho en el proyecto y seleccionando "Ejecutar como" -> Prueba JUnit.

Si esto no funciona (lo que es probable), vaya a "Ejecutar/Ejecutar configuraciones", cree una nueva configuración de JUnit y dígale que ejecute todas las pruebas en su proyecto. Si esto no funciona, tendré que echarle un vistazo a tu proyecto antes de poder ayudarte.

+0

Ambas opciones dan como resultado: No se encontraron pruebas con el corredor de prueba 'JUnit 4'. –

+0

Intentaré crear un nuevo proyecto desde cero y copiar el código allí. Parece una configuración rota. –

+0

funcionó para mí. Precisamente lo que quería saber. – ashes999

0

¿Agregó /test a la ruta de compilación -> Carpetas de origen?

+0

Gracias por la sugerencia. Sí, eso ya está allí. –

0

me encontré con que el código de Burt Beckwith es grande pero ejecutará todas las pruebas en el proyecto, independientemente de dónde coloque AllTests. Esta modificación de una función le permitirá colocar AllTests en cualquier subdirectorio de su proyecto y solo ejecutará pruebas debajo de esa ubicación.

private static Class<?>[] findClasses() {List<File> classFiles = new ArrayList<File>(); 
    String packagepath = AllTests.class.getPackage().getName().replace(".", "/"); 
    File RELATIVE_DIR = new File(CLASSES_DIR.getAbsolutePath() + "\\" + packagepath); 
    findClasses(classFiles, RELATIVE_DIR); 
    List<Class<?>> classes = convertToClasses(classFiles, CLASSES_DIR); 
    return classes.toArray(new Class[classes.size()]); 
} 
Cuestiones relacionadas