2016-02-29 2 views
0
@RunWith(JUnitParamsRunner.class) 
public class MySimpleTest { 

    private MyRec rec; 
    private Matrix matrix; 

    @Before 
    public void createRecognizerBeforeEveryExecution() { 
     rec = new MyRec(); 
     matrix = MatrixUtils.createMatrixWithValues(); 
    } 

    public static Iterable<Object[]> data() { 
     return Arrays.asList(
       new Object[]{"expectedvalue1", "input1"}, 
       new Object[]{"expectedvalue2", "input2"} 
     ); 
    } 

    @Test 
    @Parameters(method = "data") 
    public void test1(String output, String input) { 
     rec.fun1(matrix); 
     assertEquals(output, rec.someFunction(input)); 
    } 

    public static Iterable<Object[]> data2() { 
     return Arrays.asList(
       new Object[]{"expectedothervalue1", "input1"}, 
       new Object[]{"expectedothervalue2", "input2"} 
     ); 
    } 

    @Test 
    @Parameters(method = "data2") 
    public void test2(String output, String input) { 
     rec.fun1(matrix); 
     rec.fun2(matrix); 
     assertEquals(output, rec.someFunction(input)); 
    } 

} 

Я пытаюсь выяснить, что является правильным способом проведения этого теста. Я бы хотел использовать параметризованный тест, потому что это действительно удобный способ.JUnitParams - выполнение отдельных методов перед испытанием

Как вы можете видеть, в каждой тестовой функции я вызываю некоторую функцию (fun1 и fun2). Но мне нужно вызвать его только один раз для каждого теста (например, перед каждым параметризованным выполнением теста).

Есть ли способ сообщить JUnitParams, что он должен выполнять другую функцию перед выполнением всех параметризованных тестов?

Я не могу использовать аннотацию @Before, потому что, как вы можете видеть в test1, я не использую fun2. Он думает, что это должно выполняться отдельной функцией.

ответ

0

Я решил использовать TestNG, чтобы решить эту проблему (код, чтобы показать мой ход мысли):

import org.testng.Assert; 
import org.testng.annotations.*; 

import java.lang.reflect.Method; 

public class TempTest { 

    private Integer number; 

    @BeforeMethod 
    public void init(Method m) { 
     number = 5; 
     switch(m.getName()) { 
      case "test2": 
       fun(10); 
       fun2(5); 
       break; 
      case "test1": 
       fun(10); 
       break; 
     } 
    } 

    public void fun(int value) { 
     number += value; 
    } 

    public void fun2(int value) { 
     number -= value; 
    } 

    @Test 
    public void test1() { 
     Assert.assertEquals(new Integer(15), number); 
    } 

    @Test 
    public void test2() { 
     Assert.assertEquals(new Integer(10), number); 
    } 

    @Test 
    public void test3() { 
     Assert.assertEquals(new Integer(5), number); 
    } 

} 
1

Решение 1:

Как весело [1 | 2] не зависит от внутреннего состояния испытуемого, попытайтесь поместить их вызовы внутри данных и методов data2 соответственно.

public static Iterable<Object[]> data() { 
     rec.fun1(matrix); 
     return Arrays.asList(
       new Object[]{"expectedvalue1", "input1"}, 
       new Object[]{"expectedvalue2", "input2"} 
     ); 
    } 

public static Iterable<Object[]> data2() { 
     rec.fun1(matrix); 
     rec.fun2(matrix); 
     return Arrays.asList(
       new Object[]{"expectedvalue1", "input1"}, 
       new Object[]{"expectedvalue2", "input2"} 
     ); 
    } 

Решение 2:

тест Spliting случаев не лучшая практика. Ваш тест сложнее поддерживать. Поток намного сложнее. Существует также риск, что начало ваших тестов зависит друг от друга. Дублирование в тестах иногда просто лучше.

PS: Если вы используете строки в качестве параметров методы испытания, лучше пройти их так же, как в 25-й строки этого файла: https://github.com/Pragmatists/JUnitParams/blob/master/src/test/java/junitparams/usage/SamplesOfUsageTest.java вместо специальных методов.

@Test 
@Parameters({"AAA,1", "BBB,2"}) 
public void paramsInAnnotation(String p1, Integer p2) { } 
+0

Если я правильно понял решение 2, я не должен использовать параметризованный тест здесь, но просто произведите некоторые дублированные проверки в одном методе тестирования. Это правильный путь? –

+0

Я предположил, что вы хотите удалить дублирование (методы удовольствия) между тестом, перемещая общий код в другое место (что делает их более сложными IMHO). Ваши @Parameters хороши (вы хотите запускать тестовые примеры на нескольких наборах данных), но это может быть сделано немного simmpler (смотрите редактирование PS) –