2012-03-29 14 views
6

Tengo una prueba con 15-20 casos de prueba diferentes, quiero ejecutar la misma prueba dos veces con dos parámetros diferentes que se supone pasan al método BeforeClass de la prueba, por ejemplo:Ejecutando dos pruebas con argumentos diferentes

public class TestOne { 
    private static ClassToTest classToTest; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     classToTest = new ClassToTest("Argument1", "Argument2"); 
    } 

    @Test 
    public void testOne() { 
    ........roughly 15 - 20 tests here 
} 

public class TestTwo { 
    private static ClassToTest classToTest; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     classToTest = new ClassToTest("Argument3", "Argument4"); 
    } 

    @Test 
    public void testOne() { 
    ........roughly 15 - 20 tests here, same as in TestOne 
} 

Como se puede ver la única diferencia entre las dos pruebas es en el método de configuración, que pasa a valores diferentes para el constructor de la ClassToTest. No quiero replicar los métodos de prueba en ambas clases, pero preferiría heredar o alguna otra forma inteligente de lograr esto en una clase.

+0

La herencia simple debería funcionar bien. ¿Has intentado mover ClassToTest y testOne() a una clase base? – robertvoliva

Respuesta

6

Esto parece un caso de uso perfecto para JUnit4 @Parameters; ver https://blogs.oracle.com/jacobc/entry/parameterized_unit_tests_with_junit o http://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/. Dicho esto, tendrás que mover la inicialización del método setUp a un constructor para la clase de prueba.

+0

Esto no es bueno para mí, ya que solo queremos una instancia de ClassToTest, es un objeto muy pesado de crear. No quiero que mi prueba se ejecute para siempre. Me refiero a una instancia de ClassToTest, compartida por todos los métodos de prueba, por eso está definida en ** ** BeforeClass ** – Ravi

+0

Si su clase de prueba es realmente heavyweight ... bueno, ahí está su problema. Rompe tus pruebas hasta que sean _sin_ peso pesado. –

+0

No estoy diciendo que mi clase de prueba es pesada, la clase que estoy tratando de probar es pesada ya que hace conexión con el sistema externo, no podemos hacer nada al respecto, de hecho esta prueba es prueba de integración para verificar que obtenemos datos correctos de ese sistema. – Ravi

0

De acuerdo con la documentación (http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html):

Una subclase no hereda los miembros privados de su clase padre . Sin embargo, si la superclase tiene métodos públicos o protegidos para accediendo a sus campos privados, estos también pueden ser utilizados por la subclase.

0

¿Qué tal esto: contar O para mantener método de reducción::

public class TestOne { 
    private static ClassToTest classToTest1, classToTest2; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     classToTest1 = new ClassToTest("Argument1", "Argument2"); 
     classToTest2 = new ClassToTest("Argument3", "Argument4"); 
    } 

    @Test 
    public void testOne() { 
     testOneImpl(classToTest1); 
     testOneImpl(classToTest2); 
    } 

    public void testOneImpl(ClassToTest classToTest) { 
     // exact samew as whatever your current testOne() test method is 
    } 

    .... 
} 

EDITAR

public class TestOne { 
    private static List<ClassToTest> classesToTest; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     classesToTest = new ArrayList<>; 
     classesToTest.add(new ClassToTest("Argument1", "Argument2")); 
     classesToTest.add(new ClassToTest("Argument3", "Argument4")); 
    } 

    @Test 
    public void testOne() { 
     for (ClassToTest classToTest: classesToTest) { 
      ... same test content as before 
     } 
    } 
+0

Recuerde que tenemos alrededor de 20 pruebas, por lo que 20 veces * 2 métodos, deberán escribirse – Ravi

+0

Me di cuenta de que su preocupación era con la duplicación del código, no con el recuento de métodos. De esta manera, no hay duplicación de código, una expresión de intención sucinta, separación de preocupaciones, etc. ¿Es realmente oneroso agregar otro método repetitivo * muy corto * para cada método de prueba?Por supuesto, podría iterar una lista de 'classToTest1' y' classToTest2' en cada método de prueba si desea mantener la cuenta atrás del método, y la lista podría definirse una vez en 'setUp'. –

1

Por lo que vale la pena, aquí es cómo usted lo haría con TestNG:

public class TestFactory { 
    @Factory 
    public Object[] createTests() { 
    return new Object[] { 
     new ClassToTest("arg1", "arg2"), 
     new ClassToTest("arg3", "arg4") 
    }; 
    } 
} 

public class ClassToTest { 
    public ClassToTest(String arg1, String arg2) { 
    this.arg1 = arg1; 
    this.arg2 = arg2; 
    } 

    @Test 
    public void testOne() { 
    // use arg1 and arg2 
    } 
} 
1

Gracias a todos por su q uick responde. Esta es la forma en que lo hice finalmente

public abstract class Base { 
    final HeavyObject heavy; 

    protected Base(HeavyObject heavy) { 
     this.param = param; 
    } 

    @Test 
    public void test() { 
     param.doSomething(); 
    } 

    @Test 
    .............More tests here 

} 


public class FirstTest extends Base{ 

    private static HeavyObject param; 

    @BeforeClass 
    public static void init() { 
     param = new HeavyObject("arg1", "arg2"); 
    } 

    public FirstTest() { 
     super(param); 
    } 
} 

public class SecondTest extends Base{ 

    private static HeavyObject param; 

    @BeforeClass 
    public static void init() { 
     param = new HeavyObject("arg3", "arg4"); 
    } 

    public FirstTest() { 
     super(param); 
    } 
} 

base es una clase abstracta que tiene todas las pruebas y FirstTest y SecondTest crear sus propios objetos con diferentes parámetros y lo pasan a la clase abstracta para usarlo.

Cuestiones relacionadas