2009-09-18 11 views
21

tengo la estructura clásica para las pruebas, tengo un conjunto de pruebas de diferentes suites como DatabaseTests, unittests etc. A veces esas suites contiene otras suites como SlowDatabaseTests, etc. FastDatabaseTests¿Cómo puedo hacer que mis pruebas JUnit se ejecuten en orden aleatorio?

Lo que queremos es cambiar aleatoriamente el orden de marcha de pruebas, así me aseguraré de que no sean dependientes entre sí. La aleatorización debe ser en todos los niveles, como suite, debe barajar el orden de la clase de prueba, y la clase de prueba debe mezclar el orden del método de prueba.

Si es posible hacer esto en Eclipse será lo mejor.

+7

Aleatorizar el orden no probaría nada, ya que el azar podría funcionar "por accidente". Además, no sería repetible, por lo que nunca sería posible rastrear la causa de un error. – skaffman

+3

Si escribo mi orden de ejecución en alguna parte cada vez que se ejecutan pruebas, podré seguir la causa. – nimcap

+8

Puede hacerlo repetible dando a Random() una semilla que es una función de la fecha sin el tiempo. Si haces esto, te recomiendo una compilación continua para que notes cuándo fallan las pruebas. – NamshubWriter

Respuesta

12

usted tiene un Sortable pero no puedo ver cómo se usaría la misma.

Puede ampliar BlockJUnit4ClassRunner y tener computeTestMethods() devolver una copia aleatoria de super.computeTestMethods(). Luego use el @RunWith para configurarlo como el corredor a usar.

p. Ej.

package com.stackoverflow.mlk; 

import java.util.Collections; 

import org.junit.runners.BlockJUnit4ClassRunner; 
import org.junit.runners.model.InitializationError; 

public class RandomBlockJUnit4ClassRunner extends BlockJUnit4ClassRunner { 

    public RandomBlockJUnit4ClassRunner(Class<?> klass) 
      throws InitializationError { 
     super(klass); 
    } 

    protected java.util.List<org.junit.runners.model.FrameworkMethod> computeTestMethods() { 
     java.util.List<org.junit.runners.model.FrameworkMethod> methods = super.computeTestMethods(); 
     Collections.shuffle(methods); 
     return methods; 
    } 

} 

Entonces

@RunWith(com.stackoverflow.mlk.RandomBlockJUnit4ClassRunner.class) 
public class RandomOrder { 
    @Test 
    public void one() { 
    } 

    @Test 
    public void two() { 
    } 

    @Test 
    public void three() { 
    } 
} 
+0

buena respuesta pero no es suficiente Necesito implementar un corredor Suite también, para aleatorizar el orden de las clases de prueba. Además tengo muchas pruebas y no quiero poner la anotación @RunWith en todas ellas. Creo que eso se puede manejar en el runner Suite – nimcap

+2

. Lo encontré muy útil, y creé un pequeño proyecto Java que aleatorizaba pruebas y suites. Para obtener más información, visite su página: http://randomjunit.sourceforge.net/ – AngocA

0

Me aseguraré de que no dependen de entre sí

Usted debe asegurarse de que este es el caso, sin depender de orden de ejecución al azar. ¿Qué te hace temer que las dependencias puedan existir?

+0

¿Puedo preguntar por qué las personas rechazaron mi respuesta? ¿Qué tiene de malo? –

+5

Estamos siendo muy cuidadosos al escribir pruebas unitarias y hacerlas independientes. Pero también estamos escribiendo un código de producción muy cuidadoso, los errores aparecen, no hay garantía de que sean independientes. PS. Estamos utilizando JUnit no solo para pruebas unitarias sino también para pruebas funcionales, por lo que a veces dejan el DB en algún estado. – nimcap

+5

@lutz Supongo que porque respondió con otra pregunta sin responder a la pregunta de OP – akuhn

3

En general, lo que necesita hacer es escribir su propio corredor de prueba y en la clase de corredor de prueba agregar los métodos y ejecutar al azar cada prueba (asegúrese de no ejecutar una prueba dos veces).

Lea más sobre el marco de pruebas y cómo escribir su propio corredor de prueba aquí: http://www.ddj.com/architect/184415674

+0

Tenga en cuenta que el artículo de ddj.com describe el corredor de prueba JUnit3. Si prueba esto, tenga en cuenta que si sus pruebas usan TestSetup o intentan hacer una configuración a nivel de suite y demoran extendiendo TestSuite, el enfoque sugerido aquí no funcionará; el corredor de prueba no "ve" TestSuites o TestDecorators. Escribir su propio corredor de prueba JUnit3 tampoco funcionará si ejecuta pruebas desde un IDE como Eclipse. – NamshubWriter

4

https://github.com/KentBeck/junit/pull/386 introduce algunas órdenes, pero no RANDOM. Probablemente no quieras esto realmente; las pruebas deben ejecutarse de manera determinista. Si necesita verificar que otras permutaciones de pruebas aún pasen, pruebe todas las permutaciones; o, si esto fuera poco práctico, introduzca una semilla "aleatoria" para barajar determinada por una variable de entorno o similar, para que pueda reproducir cualquier falla. http://hg.netbeans.org/main/file/66d9fb12e98f/nbjunit/src/org/netbeans/junit/MethodOrder.java da un ejemplo de hacer esto para JUnit 3.

Cuestiones relacionadas