2009-08-18 22 views
5

Meine Komponententests befinden sich in einem separaten Verzeichnisbaum aus meinen Integrationstests, aber mit der gleichen Paketstruktur. Meine Integrationstests benötigen externe Ressourcen (z. B. einen Server), um verfügbar zu sein, aber meine Komponententests sind unabhängig von einander und der Umgebung.Führen Sie alle Tests in einem Quellbaum aus, kein Paket

In IntelliJ-IDEA (v7) habe ich eine JUnit Run/Debug-Konfiguration definiert, um alle Tests im Top-Level-Paket auszuführen, und dies greift natürlich auf meine Integrationstests zurück, die fehlschlagen.

Ich möchte eine Run-Junit-Konfiguration definieren, die alle meine Komponententests ausführt. Irgendwelche Ideen?

Antwort

5

Die Antwort besteht darin, eine Testsuite zu erstellen, die nur die Tests unterhalb des Komponententestordners enthält, und diese stattdessen auszuführen. Es gibt ein Junit-Addon, das genau das nennt, DirectorySuiteBuilder, aber ich fand das erst, nachdem ich das Rad ziemlich neu erfunden hatte.

Und es wurde bereits hier gefragt!

import junit.framework.JUnit4TestAdapter; 
import junit.framework.TestSuite; 

import java.io.File; 
import java.io.IOException; 

public class DirectoryTestSuite { 
    static final String rootPath = "proj\\src\\test\\java\\"; 
    static final ClassLoader classLoader = DirectoryTestSuite.class.getClassLoader(); 

    public static TestSuite suite() throws IOException, ClassNotFoundException { 
    final TestSuite testSuite = new TestSuite(); 
    findTests(testSuite, new File(rootPath)); 
    return testSuite; 
    } 

    private static void findTests(final TestSuite testSuite, final File folder) throws IOException, ClassNotFoundException { 
    for (final String fileName : folder.list()) { 
     final File file = new File(folder.getPath() + "/" +fileName); 
     if (file.isDirectory()) { 
     findTests(testSuite, file); 
     } else if (isTest(file)) { 
     addTest(testSuite, file); 
     } 
    } 
    } 

    private static boolean isTest(final File f) { 
    return f.isFile() && f.getName().endsWith("Test.java"); 
    } 

    private static void addTest(final TestSuite testSuite, final File f) throws ClassNotFoundException { 
    final String className = makeClassName(f); 
    final Class testClass = makeClass(className); 
    testSuite.addTest(new JUnit4TestAdapter(testClass)); 
    } 

    private static Class makeClass(final String className) throws ClassNotFoundException { 
    return (classLoader.loadClass(className)); 
    } 

    private static String makeClassName(final File f) { 
    return f.getPath().replace(rootPath, "").replace("\\", ".").replace(".java", ""); 
    } 
} 
2

Leider gibt es keine Möglichkeit, die Ausgabe von der IntelliJ-Kompilierung anders als durch Klassen und Testklassen innerhalb eines einzelnen Moduls zu trennen (es sind die Klassen, die test runner betrachtet).

Wenn ich Integrationstests habe, verwende ich einfach ein zweites Modul, das spezifisch für diese Tests ist, um dieses Problem zu umgehen, indem ich die für jedes Modul erforderlichen Ausgabeverzeichnisse vorschlage.

+0

Ja, das ein richtiger Ansatz wäre, verschiedene Module für die verschiedenen Arten zu verwenden von Tests. In der Run/Debug-Konfiguration geben Sie an, welcher Modulklassenpfad verwendet wird. – CrazyCoder

+0

Ich kann das nicht, es gibt bereits mehrere Module im Projekt und wir arbeiten an einem Modul pro zu liefernden Artefaktprinzip –

5

IntelliJ IDEA CE 10.5 hat eine (neue?) Option, um alle Tests in einem konfigurierten Verzeichnis auszuführen:

JUnit Run/Debug configuration

Verwandte Themen