2011-11-28 18 views
6

¿Hay alguna manera de saber en una clase de prueba JUnit 4 si la clase fue iniciada por una prueba-suite? Tengo cosas globales que quiero ejecutar antes de todas las pruebas (con respecto a la base de datos en memoria), así que pensé hacerlo en el traje de prueba. Sin embargo, todavía quiero poder iniciar una prueba a la vez sin un traje de prueba, así que necesito saber si necesito inicializar las cosas globales en la parte @Before de la prueba ... ¿Alguien sabe? si es posible ?Invocación de prueba: cómo configurar la configuración común a todas las suites de prueba

Respuesta

5

Existen varias formas de lograr esto. Lo más fácil y simple es tener una 'prueba' que se ejecuta al principio y al final de su suite, que configura su base de datos y luego establece un indicador global. En tus pruebas @Before y @After verificas esta bandera y, si es necesario, realizas la configuración/desmontaje.

@RunWith(Suite.class) 
@SuiteClasses({SetupTest.class, RealTest.class, TeardownTest.class}); 

Esta es la solución más simple, pero no es muy agradable, por lo que una solución más limpia sería utilizar un TestRule. Mira extendiendo ExternalResource. Esto implementa antes de & después de la lógica que rodea sus métodos de prueba. Esto le permitiría factorizar sus métodos @Before y @After, para reutilizar el mismo código en todas partes.

Luego, para su suite, también debe implementar lógica de antes/después. Desafortunadamente, la clase anotada con @RunWith (Suite.class) en realidad no está instanciada, por lo que no puede usar el constructor de esa clase, pero puede ampliar Suite. Dependiendo de cómo va a funcionar esto, usted tendrá que poner en práctica uno de los constructores, utilizando @RunWith como ejemplo:

public class MySuite extends Suite { 
    /** 
    * Called reflectively on classes annotated with <code>@RunWith(Suite.class)</code> 
    * 
    * @param klass the root class 
    * @param builder builds runners for classes in the suite 
    * @throws InitializationError 
    */ 
    public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError { 
     this(builder, klass, getAnnotatedClasses(klass)); 
     // put your global setup here 
     // set global variable 
    } 
} 

A continuación, ejecute el conjunto de pruebas con

@RunWith(MySuite.class) 

Hay varios constructores que se usan en diferentes situaciones, mira los comentarios al lado de cada uno para obtener detalles. Aún necesita usar una variable global para que sus Reglas no vuelvan a ejecutar el código de configuración. Lo anterior funcionará si solo quieres ejecutar el código de configuración, pero ejecutar el código de desmontaje es más difícil, pero se puede hacer. Avíseme si lo necesita :-)

Si quiere más flexibilidad (digamos, ejecutar el código de configuración solo para métodos específicos), entonces vea mi respuesta al How to define JUnit method rule in a suite?.

+0

La mayoría de los enlaces están muertos. – Nadar

2

Utilizaría las anotaciones de JUnit @BeforeClass y @AfterClass para indicar los métodos para realizar este tipo de trabajo.

Desde el Javadoc @BeforeClass:

veces varias pruebas necesitan compartir configuración costoso computacionalmente (como iniciar sesión en una base de datos). Si bien esto puede comprometer la independencia de las pruebas de , a veces es una optimización necesaria. Anotar 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 .

+1

Esto es relevante para varios métodos @Test anotados dentro de un archivo Clase de prueba, que no es el escenario que estoy tratando, lo necesito para varias CLASES de prueba. – stdcall

0

Puede colocar un código @BeforeClass en cada conjunto de pruebas, que delega en una clase auxiliar que realiza la configuración común. La clase auxiliar podría tener un static boolean que registre si la configuración ya se ha realizado. Si ya se ha hecho, la clase auxiliar no haría nada.

Cuestiones relacionadas