2012-03-12 17 views
13

Estoy usando JUnit4.¿Cómo hacer que los casos de prueba JUnit se ejecuten en orden secuencial?

Tengo un conjunto de métodos de prueba en un caso de prueba.

Cada método de prueba inserta algunos registros y verifica el resultado de una prueba, y finalmente elimina los registros insertados.

Dado que JUnit se ejecuta en paralelo, los métodos de prueba fallan debido a algunos registros presentes durante la ejecución del método de prueba anterior. Este ocurre solo en mi máquina colega (Windows 7), no en mi máquina (Cent OS 6).

Lo que necesitamos es que los métodos de prueba tengan que pasar en todas nuestras máquinas.

He intentado borrar los registros en el método de instalación() pero nuevamente funciona solo en mi máquina. ¿Hay alguna opción disponible en JUnit para hacer que los métodos de prueba se ejecuten en un orden secuencial uniforme?

Gracias,

Respuesta

5

El pedido de las pruebas no está garantizado en JUnit.

La razón de esto es que las pruebas unitarias deben ser atómicas: toda la configuración debe realizarse en los métodos de configuración/desmontaje, pero no en otras pruebas.

Considere mover el código que inserta datos en otra clase auxiliar que puede invocarse tanto con la prueba que se está insertando como con la clase que necesita verificar y llamando a esa clase en sus métodos @Before.

También debe considerar una solución de burla (por ejemplo, Mockito) en lugar de golpear la base de datos directamente si puede - burlarse contribuirá en gran medida a garantizar que sus pruebas sean agradables y aisladas, y, como un beneficio lateral agradable, Por lo general, ayuda a señalar dónde podría usar algunas refactorizaciones.

+0

Gracias por su respuesta, lo comprobaré. – Athiruban

+1

También podría usar algo como DBUnit para controlar la configuración y el desmontaje de la base de datos, pero para las pruebas de unidades puras, Mockito tiene más sentido ya que permite que las pruebas sean completamente independientes. – TrueDub

2

Como está ejecutando las pruebas en paralelo, y está accediendo a la base de datos, es muy probable que tenga problemas, porque la base de datos no estará necesariamente en un estado coherente para cada prueba.

Solución: no ejecute sus pruebas en paralelo. JUnit no ejecuta las pruebas en paralelo de forma predeterminada, por lo que está configurando la opción en maven o utilizando uno de los corredores paralelos en JUnit.

Si todavía tiene problemas entre las pruebas que fallan en Windows pero no en Cent OS, entonces es posible que haya un problema con el orden de ejecución, que deberá corregir. Ver mi respuesta al Has JUnit4 begun supporting ordering of test? Is it intentional?.

La forma de evitar esto (al menos en términos de JUnit) es eliminar las dependencias entre las pruebas. Básicamente, JUnit no admite pedidos y las pruebas deben poder ejecutarse en cualquier orden.

Si realmente necesita tener dependencias entre las pruebas, use TestNG, donde puede tener dependencias.

23

JUnit 4.11 ahora admite la especificación del orden de ejecución con la anotación @FixMethodOrder.

21

MethodSorters es una nueva clase presentada después del lanzamiento de Junit 4.6. Esta clase declaró tres tipos de órdenes de ejecución, que se pueden usar en sus casos de prueba al ejecutarlos.

  1. NAME_ASCENDING (MethodSorters.NAME_ASCENDING) - Ordena los métodos de ensayo por el nombre del método, en orden lexicográfico.

  2. JVM (null) - hojas de los métodos de prueba en el orden devuelto por el JVM. Tenga en cuenta que el orden de la JVM varía de una ejecución a otra.

  3. DEFAULT (MethodSorter.DEFAULT) - Ordena los métodos de ensayo en un determinista, pero no predecible, orden.

.

import org.junit.FixMethodOrder; 
import org.junit.Test; 
import org.junit.runners.MethodSorters; 

//Running test cases in order of method names in ascending order 

@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class OrderedTestCasesExecution { 

    @Test 
    public void secondTest() { 
     System.out.println("Executing second test"); 
    } 

    @Test 
    public void firstTest() { 
     System.out.println("Executing first test"); 
    } 

    @Test 
    public void thirdTest() { 
     System.out.println("Executing third test"); 
    } 
} 

Salida:

Executing first test 
Executing second test 
Executing third test 

Referencia: http://howtodoinjava.com/2012/11/24/ordered-testcases-execution-in-junit-4/

-1

No hay problema al ejecutar pruebas en paralelo, incluso si usted tiene su capa de datos en ella. Pero necesita tener trabajo adicional para crear MOCK UP para sus datos, de modo que no llegue a la base de datos. Puede usar diferentes marcos de maquetas como Mockito, EasyMock y Arquillian.

+0

Arquillian no es un marco de burla. ver http://arquillian.org/ –

Cuestiones relacionadas