2009-08-18 8 views
5

Las pruebas de mi unidad se encuentran en un árbol de directorios separado de mis pruebas de integración, pero con la misma estructura de paquete. Mis pruebas de integración necesitan recursos externos (por ejemplo, un servidor) para estar disponible, pero mis pruebas unitarias son propiamente independientes entre sí y al entorno.Ejecutar todas las pruebas en un árbol fuente, no en un paquete

En IntelliJ-IDEA (v7) he definido una ejecución JUnit/Configuración de depuración para ejecutar todas las pruebas en el paquete de nivel superior, y esto, por supuesto, retoma mis pruebas de integración que fallan.

Quiero definir una configuración de ejecución-junit que ejecute todas las pruebas de mi unidad. ¿Algunas ideas?

Respuesta

5

La respuesta es crear un conjunto de pruebas que contenga solo esas pruebas debajo de la carpeta de prueba de la unidad y ejecutar eso en su lugar. Hay un addit junit que solo hace esto llamado DirectorySuiteBuilder, pero solo lo encontré después de haber reinventado la rueda.

¡Y ya se ha preguntado aquí!

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

Desafortunadamente, no hay forma de separar la salida de la compilación IntelliJ que no sea por clases y clases de prueba dentro de un solo módulo (son las clases que examina el test runner).

Así que cuando tengo pruebas de integración simplemente uso un segundo módulo específico para estas pruebas para resolver este problema, especificando los directorios de salida según sea necesario para cada módulo.

+0

Sí, eso sería un enfoque correcto a utilizar diferentes módulos para diferentes tipos de pruebas. En la configuración Ejecutar/Depurar, usted especifica qué classpath de módulo se usará. – CrazyCoder

+0

No puedo hacer esto, ya hay varios módulos en el proyecto y estamos trabajando en un módulo por principio de artefacto entregado –

5

IntelliJ IDEA CE 10.5 tiene una opción (nuevo?) Para ejecutar todas las pruebas dentro de un directorio configurado:

JUnit Run/Debug configuration

Cuestiones relacionadas