2009-08-18 8 views
5

Moje testy jednostkowe znajdują się w oddzielnym drzewie katalogów z testów integracji, ale mają tę samą strukturę pakietu. Moje testy integracyjne wymagają zewnętrznych zasobów (np. Serwera), ale moje testy jednostkowe są właściwie niezależne od siebie nawzajem i środowiska.Uruchom wszystkie testy w drzewie źródłowym, a nie w pakiecie.

W IntelliJ-IDEA (v7) zdefiniowałem konfigurację JUnit Run/Debug, aby uruchomić wszystkie testy w pakiecie najwyższego poziomu, a to oczywiście podnosi moje testy integracyjne, które zawiodły.

Chcę zdefiniować konfigurację run-junit, która uruchamia wszystkie moje testy jednostkowe. Jakieś pomysły?

Odpowiedz

5

Odpowiedź jest taka, aby utworzyć zestaw testów, który zawiera tylko te testy pod folderem testów jednostkowych i uruchomić go zamiast tego. Jest dodatkowy dodatek, który właśnie to nazywa się DirectorySuiteBuilder, ale znalazłem to dopiero po tym, jak wymyśliłem koło.

I już zostało tu zadane!

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

Niestety nie ma sposobu na oddzielenie danych wyjściowych od kompilacji IntelliJ innych niż klasy i klasy testowe w ramach pojedynczego modułu (to klasy, na które patrzy biegacz testu).

Tak więc, kiedy mam testy integracji, po prostu używam drugiego modułu specyficznego dla tych testów, aby obejść ten problem, określając katalogi wyjściowe jako niezbędne dla każdego modułu.

+0

Tak, to byłoby właściwe podejście do korzystania z różnych modułów dla różnych typów testów. W konfiguracji Run/Debug określ, który moduł będzie używał classpath. – CrazyCoder

+0

Nie mogę tego zrobić, w projekcie jest już wiele modułów i pracujemy nad jednym modułem na jedną możliwą zasadę artefaktu –

5

IntelliJ IDEA CE 10,5 ma (nowy?) Opcję, aby uruchomić wszystkie testy wewnątrz skonfigurowanego katalogu:

JUnit Run/Debug configuration