unitaria tipos test pruebas prueba example ejemplo create configuracion con java database unit-testing junit package

java - tipos - JUNIT: ejecuta la configuración solo una vez para un gran número de clases de prueba



test en java (5)

Con JUnit4 test suite puede hacer algo como esto:

@RunWith(Suite.class) @Suite.SuiteClasses({ Test1IT.class, Test2IT.class }) public class IntegrationTestSuite { @BeforeClass public static void setUp() { System.out.println("Runs before all tests in the annotation above."); } @AfterClass public static void tearDown() { System.out.println("Runs after all tests in the annotation above."); } }

Luego ejecutas esta clase ya que ejecutarías una clase de prueba normal y ejecutará todas tus pruebas.

Tengo una clase, que utilizo como base para mis pruebas unitarias. En esta clase inicializo todo el entorno para mis pruebas, establezco mapeos de bases de datos, ingreso una cantidad de registros de bases de datos en varias tablas, etc. Esa clase tiene un método con una anotación @BeforeClass que realiza la inicialización. A continuación, amplío esa clase con clases específicas en las que tengo métodos @Test.

Mi pregunta es, dado que la clase anterior es exactamente la misma para todas estas clases de prueba, ¿cómo puedo asegurarme de que se ejecuten solo una vez para todas las pruebas? Una solución simple es que podría mantener todas las pruebas en una clase. Sin embargo, el número de pruebas es enorme, también se clasifican en función de las cabezas funcionales. Entonces ellos están ubicados en diferentes clases. Sin embargo, dado que necesitan exactamente la misma configuración, heredan @BeforeClass. Como resultado, toda la configuración se realiza al menos una vez por clase de prueba, lo que lleva mucho más tiempo del que yo preferiría.

Podría, sin embargo, ponerlos en varios subpaquetes en un solo paquete, por lo tanto, si hay una manera, cómo puedo ejecutar la configuración una vez para todas las pruebas dentro de ese paquete, sería genial.


Crea una clase base para todas las pruebas:

public class BaseTest { static{ /*** init code here ***/ } }

y cada prueba debe heredar de ella:

public class SomeTest extends BaseTest { }


JUnit no es compatible con esto, tendrás que utilizar las soluciones de Java estándares para singletons: mueve el código de configuración común a un bloque de código estático y luego llama a un método vacío en esta clase:

static { ...init code here... } public static void init() {} // Empty method to trigger the execution of the block above

Asegúrese de que todas las pruebas llamen a init() , por ejemplo, ponerlo en un método @BeforeClass . O coloque el bloque de código estático en una clase base compartida.

Alternativamente, use una variable global:

private static boolean initialize = true; public static void init() { if(!initialize) return; initialize = false; ...init code here... }


No estoy seguro si alguien todavía está usando JUnit y tratando de arreglarlo sin usar Spring Runner (también conocido como no integración de primavera). TestNG tiene esta característica. Pero aquí hay una solución basada en JUnit.

Cree una operación RunOnce por hilo de esa manera. Esto mantiene una lista de clases para las cuales se ejecutó la operación.

public class RunOnceOperation { private static final ThreadLocal t = new ThreadLocal(); public void run(Function f) { if (t.get() == null) { t.set(Arrays.asList(getClass())); f.apply(0); } else { if (!((List) t.get()).contains(getClass())) { ((List) t.get()).add(getClass()); f.apply(0); } } } }

De vuelta en tu prueba de unidad

@Before public beforeTest() { operation.run(new Function<Integer, Void>() { @Override public Void apply(Integer t) { checkBeanProperties(); return null; } }); } private void checkBeanProperties() { //I only want to check this once per class. //Also my bean check needs instance of the class and can''t be static. } My function interface is like this: interface Function<I,O> { O apply(I i); }

Cuando lo usa de esta manera, puede realizar operaciones una vez por clase usando ThreadLocal.