2009-12-17 19 views
27

Al usar este enfoque a continuación, configurando jUnit con Suites. Tenemos el problema cuando todo @BeforeClass en cada Testclass se ejecutará antes de que las pruebas comiencen a ejecutarse. (Para cada n archivo TestClass se ejecuta @BeforeClass, luego de que se hayan ejecutado, comenzó a ejecutar los primeros archivos MyTest.class @Test)JUnit 4 @BeforeClass & @AfterClass cuando se utilizan Suites

Esto hará que asignamos muchos recursos y memoria. Mi opinión es que debe estar mal, ¿no se debe ejecutar cada @BeforeClass solo antes de que se ejecute la clase de prueba real, no cuando se inicia la Suite?

@RunWith(Suite.class) 
@Suite.SuiteClasses({ MyTests.class, Mytests2.class, n1, n2, n }) 
public class AllTests { 
    // empty 
} 


public class MyTests { // no extends here 
    @BeforeClass 
    public static void setUpOnce() throws InterruptedException { 
     ... 
    @Test 
     ... 

public class MyTests2 { // no extends here 
    @BeforeClass 
    public static void setUpOnce() throws InterruptedException { 
     ... 
    @Test 
     ... 
+0

¿Son ejecutados antes de las pruebas de cada uno clases, o son todos ejecutados solamente antes de la primera (pero entonces el segundo se ejecuta sin ejecutar todas @BeforeClass de nuevo)? Esto último parece correcto ya que @BeforeClass se ejecuta antes de los métodos @Test en esa prueba. Supongo que la cantidad de memoria no cambiará, a menos que la limpie después de las pruebas de cada clase (y esto solo ocurre después de que se complete todo el paquete). –

+1

Lo que obtengo ahora es que cada @BeforeClass se ejecuta primero. @BeforeClass (Mytests) @BeforeClass (Mytests2) @test (MyTests) @test (MyTests2) En mi punto de vista, esto no es correcto. Corrígeme si me equivoco, pero algo debe configurarse incorrectamente para causar este problema. –

Respuesta

43

Escriba un método @BeforeClass en la clase AllTests que se ejecutará cuando se inicie el conjunto.

public class MyTests1 { 
    @BeforeClass 
    public static void beforeClass() { 
     System.out.println("MyTests1.beforeClass"); 
    } 

    @Before 
    public void before() { 
     System.out.println("MyTests1.before"); 
    } 

    @AfterClass 
    public static void afterClass() { 
     System.out.println("MyTests1.AfterClass"); 
    } 

    @After 
    public void after() { 
     System.out.println("MyTests1.after"); 
    } 

    @Test 
    public void test1() { 
     System.out.println("MyTests1.test1"); 
    } 

    @Test 
    public void test2() { 
     System.out.println("MyTests1.test2"); 
    } 
} 



public class MyTests2 { 
    @BeforeClass 
    public static void beforeClass() { 
     System.out.println("MyTests2.beforeClass"); 
    } 

    @Before 
    public void before() { 
     System.out.println("MyTests2.before"); 
    } 

    @AfterClass 
    public static void afterClass() { 
     System.out.println("MyTests2.AfterClass"); 
    } 

    @After 
    public void after() { 
     System.out.println("MyTests2.after"); 
    } 

    @Test 
    public void test1() { 
     System.out.println("MyTests2.test1"); 
    } 

    @Test 
    public void test2() { 
     System.out.println("MyTests2.test2"); 
    } 
} 




@RunWith(Suite.class) 
@Suite.SuiteClasses({ MyTests1.class, MyTests2.class }) 
public class AllTests { 

    @BeforeClass 
    public static void beforeClass() { 
     System.out.println("AllTests.beforeClass"); 
    } 

    @Before 
    public void before() { 
     System.out.println("AllTests.before"); 
    } 

    @AfterClass 
    public static void afterClass() { 
     System.out.println("AllTests.AfterClass"); 
    } 

    @After 
    public void after() { 
     System.out.println("AllTests.after"); 
    } 

    @Test 
    public void test1() { 
     System.out.println("AllTests.test1"); 
    } 

    @Test 
    public void test2() { 
     System.out.println("AllTests.test2"); 
    } 

} 

SALIDA

AllTests.beforeClass 
MyTests1.beforeClass 
MyTests1.before 
MyTests1.test1 
MyTests1.after 
MyTests1.before 
MyTests1.test2 
MyTests1.after 
MyTests1.AfterClass 
MyTests2.beforeClass 
MyTests2.before 
MyTests2.test1 
MyTests2.after 
MyTests2.before 
MyTests2.test2 
MyTests2.after 
MyTests2.AfterClass 
AllTests.AfterClass 

hth

+4

'AllTests.test1()' y '" AllTests.test2() 'nunca se ejecutan? – Theodor

+0

@nayakam Eso solucionaría el problema inmediato, pero creo que las clases de pruebas individuales o subsuites no se pueden ejecutar en su ¿propio? – nsandersen

-4

Creo que, @BeforeClass ejecuta en instanciation.

+0

No es así. "Hacer una anotación en un método public void no-arg con @BeforeClass hace que se ejecute una vez antes de cualquiera de los métodos de prueba de la clase. Los métodos @BeforeClass de las superclases se ejecutarán antes que los de la clase actual". (Fuente: documentación de JUnit) – Jorn

+0

Simplemente agregará información adicional para aquellos que tienen problemas con la memoria. JUnit guardará todos los estados cuando se ejecute y, por lo tanto, guardará todas las variables estáticas hasta que se hayan ejecutado todas las pruebas de JUnit. Esto también fue un problema importante ya que estamos ejecutando entre 1000-6000 pruebas JUnit. Esto porque lo necesita para mostrar el resultado al final. –

1

No estoy muy familiarizado con @RunWith en JUnit, por lo que puede haber hecho algo mal, pero parece que no puedo reproducir el comportamiento que describes. Con la clase:

@RunWith(Suite.class) 
@Suite.SuiteClasses({ FirstTest.class, SecondTest.class, ThirdTest.class }) 
public class AllTests { 
    // empty 
} 

Y FirstTest.java con este aspecto:

public class FirstTest { 
    @BeforeClass 
    public static void doBeforeClass() { 
     System.out.println("Running @BeforeClass for FirstTest"); 
    } 

    @Test 
    public void doTest() { 
     System.out.println("Running @Test in " + getClass().getName()); 
    } 
} 

... con SecondTest.java y ThirdTest.java o menos lo mismo. Me da la salida de la prueba:

Running @BeforeClass for FirstTest 
Running @Test in FirstTest 
Running @BeforeClass for SecondTest 
Running @Test in SecondTest 
Running @BeforeClass for ThirdTest 
Running @Test in ThirdTest 

Esto es con JUnit (JUnit defecto en Eclipse 3.5.1) 4.5.0 en JDK de Sun 1.6.0_12. ¿Puedes ver alguna diferencia en mi ejemplo del tuyo? Quizás un JDK/JVM diferente? No sé lo suficiente sobre los aspectos internos de JUnit para saber si estos pueden ser un factor.

+0

Como describes, es lo que se suponía que debía obtener también. Pero primero obtengo un montón de @BeforeClass, luego veo el primer @Test, @Test y demás. Usando Sun's JDK 1.6.0_17, Eclipse 3.5, pero luego nuestras pruebas de Función se ejecutan, estamos usando ant, running maven. ¿Podría algo de esto afectar los resultados? Si lo configuro en Eclipse y lo ejecuto funciona, parece que este problema es un tanto extraño o malicioso. –

+0

Lo siento, realmente no puedo ayudarte con ejecutar JUnit en hormiga o maven. Aunque exporté build.xml para el ejemplo que usé, y lo ejecuté con el objetivo de las pruebas, y obtuve el comportamiento que está buscando, entonces dudo que haya algo de malo con la tarea JUnit ant. * encogimiento de hombros desconcertado * – Grundlefleck

Cuestiones relacionadas