2009-08-18 3 views
5

Mes tests unitaires sont dans une arborescence de répertoires distincte de mes tests d'intégration, mais avec la même structure de package. Mes tests d'intégration nécessitent des ressources externes (par exemple un serveur) pour être disponibles, mais mes tests unitaires sont correctement indépendants les uns des autres et de l'environnement.Exécuter tous les tests dans une arborescence source, pas un package

Dans IntelliJ-IDEA (v7) J'ai défini une configuration JUnit Run/Debug pour exécuter tous les tests du package de niveau supérieur, ce qui, bien sûr, récupère mes tests d'intégration qui échouent.

Je veux définir une configuration run-junit qui exécute tous mes tests unitaires. Des idées?

Répondre

5

La réponse est de créer une suite de tests qui ne contient que les tests situés sous le dossier de test unitaire et de l'exécuter à la place. Il y a un addon de junit qui fait juste cela appelé DirectorySuiteBuilder mais je l'ai seulement trouvé après que j'avais à peu près ré-inventé la roue.

Et il a déjà été demandé ici!

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

Malheureusement, il n'y a aucun moyen de séparer la sortie de la compilation IntelliJ autrement que par classes et classes de test dans un seul module (ce sont les classes que test runner regarde). Donc, quand j'ai des tests d'intégration, j'utilise simplement un second module spécifique à ces tests pour contourner ce problème, en spécifiant les répertoires de sortie nécessaires pour chaque module.

+0

Oui, ce serait une bonne approche à utiliser différents modules pour différents types des tests. Dans la configuration Exécution/Débogage, vous spécifiez quel chemin de classe de module sera utilisé. – CrazyCoder

+0

Je ne peux pas faire cela, il y a déjà plusieurs modules dans le projet et nous travaillons sur un module par principe d'artefact livrable –

5

IntelliJ IDEA CE 10.5 a une (nouvelle?) Option pour exécuter tous les tests dans un répertoire configuré:

JUnit Run/Debug configuration

Questions connexes