2010-09-10 6 views
6

Ich möchte alle Junit 4-Tests innerhalb meines Eclipse-Projekts ausführen. Das Projekt wird mit/source und/test eingerichtet. Unter/Test sind verschiedene Pakete, wie zum Beispiel:Wie kann ich alle Junit 4-Tests in Eclipse rekursiv finden und ausführen?

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

Wenn ich einen Rechtsklick auf der /test Ebene in Paket-Explorer und ausführendes wählen; JUnit-Test erhalte ich die Fehlermeldung:

No tests found with test runner 'JUnit 4'. 

Wenn ich auf com.yaddayadda.test.core.entity die rechte Maustaste, dann findet es und führt alle Tests in diesem Paket. Die @Test-Annotationen sind also korrekt (sie werden auch von Ant auf dem Build-Server korrekt aufgenommen). Wenn ich jedoch versuche, alle Tests innerhalb von com.yaddayadda.test.core auszuführen, findet es keine.

Grundsätzlich scheint es nur im Paket eher die reusiv bei allen Kindern zu suchen. Gibt es eine Möglichkeit, das zu beheben?

Antwort

4

Incase jemand anderes für eine Lösung dieses Problems suchen, fand ich hier eine Antwort auf Burt Beckwith Webseite:

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

Bitte fügen Sie den Kern der Post zu Ihrer Antwort für den Fall, dass der Blog 404 auf uns geht. – ShiDoiSi

8

Zuerst: Wählen Sie Ihr Projekt im Projekt Explorer und drücken Sie Alt + Shift + X T. Es wird alle JUint Tests unter dem Projekt ausführen. Dasselbe kann man tun, indem man mit der rechten Maustaste auf das Projekt klickt und "Ausführen als" -> JUnit-Test auswählt.

Wenn dies nicht funktioniert (was wahrscheinlich ist), gehen Sie zu "Run/Run configurations", erstellen Sie eine neue JUnit-Konfiguration und sagen Sie ihr, dass sie alle Tests in Ihrem Projekt ausführen soll. Wenn das nicht funktioniert, muss ich mir Ihr Projekt ansehen, bevor ich Ihnen helfen kann.

+0

Beide Optionen ergeben: Keine Tests mit dem Test Runner 'JUnit 4' gefunden. –

+0

Ich würde versuchen, ein neues Projekt von Grund auf neu zu erstellen und den Code dort zu kopieren. Es scheint wie eine kaputte Konfiguration. –

+0

Arbeitete für mich. Genau das, was ich wissen wollte. – ashes999

0

Haben Sie /test zu Pfad erstellen -> Quellordner hinzugefügt?

+0

Danke für den Vorschlag. Ja, das ist schon da. –

0

Ich fand, dass Burt Beckwith-Code ist groß, aber es wird jeden Test im Projekt ausführen, unabhängig davon, wo Sie AllTests platzieren. Diese Änderung an einer Funktion ermöglicht es Ihnen, AllTests in einem beliebigen Unterverzeichnis Ihres Projekts zu platzieren und es werden nur Tests unter diesem Standort ausgeführt.

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()]); 
} 
Verwandte Themen