проблема с тестовым примером junit! избегайте дублирования кода

#java #junit

#java #junit

Вопрос:

Я пишу тестовый пример jnuit для тестирования API.

мой класс выглядит следующим образом

 class MyTest extends TestCase{
    List<String>  argList;
    public MyTest(){
     //read argList from File
    }



     testMyTest(){
       //callmy api
         myApi(arg1);
       }

}
  

Теперь я хочу создать отдельный тестовый пример для каждого из 50 аргументов.Аргументы считываются из файла. Я не хочу писать отдельный метод для вызова MyAPI с разными аргументами.Как я могу это сделать?
Я не хочу писать методы sperate, такие как

 testMyTest1(){
   //callmy api
     myApi(arg1);
   }

testMyTest1(){
   //callmy api
     myApi(arg2);
   }
  

Комментарии:

1. предоставлено слишком мало информации. какой тип аргумента, какой результат ожидается от вызова MyAPI, как проверить, прошел ли тестовый пример и т.д. И т.п.

Ответ №1:

Для этого вы можете использовать параметризованный тест.

Комментарии:

1. Есть ли способ запустить параметризованный тест только для подмножества тестов? т. е. Один набор тестов должен запускаться только один раз, другой набор должен запускаться несколько раз по одному разу для каждого параметра? Или это обычно делается с использованием нескольких тестовых классов?

Ответ №2:

Вы можете использовать параметризованные тесты или теории (начиная с JUnit 4.4). Для получения более подробной информации используйте

Комментарии:

1. Эти ссылки больше не доступны

Ответ №3:

 private static final String[] args = new String[] {.....};

@Test
public void myTest(){
   for (int i=0; i<args.length; i  ){
      myApi(args[i];
   }
}
  

Я думаю, что приведенное выше отвечает на ваш вопрос, однако это не очень хорошая практика JUnit. Лучше всего, чтобы каждый тестируемый метод вызывал тестируемый метод только один раз с одним условием тестирования. Таким образом, если несколько ошибок неверны, вы получите отдельную ошибку для каждого, а не будете иметь дело с одним за раз. Это предполагает следующее:

 private static final String[] args = new String[] {.....};

private void testMyTest(String arg){
    myApi(arg);
}

@Test
public void myTest0(){
  testMyTest(args[0]);
}
@Test
public void myTest1(){
  testMyTest(args[1]);
}
  

Вероятно, лучшим механизмом является выполнение первого варианта выше, но с использованием правила ErrorCollector, позволяющего сообщать о нескольких ошибках.

Редактировать Я исправлен, ответ джордао относительно параметризованных тестов действительно лучший способ сделать это.

Ответ №4:

Модульное тестирование обычно выполняется с утверждениями. Вам не нужно писать метод для каждого аргумента, но выполнять разные утверждения на основе ваших аргументов.

Одним из способов сделать это было бы:

 class MyApiTest extends TestCase {
    List<String>  argList;

    public MyApiTest() {}

    public testMyApi() {
        assertTrue(testMyApi(arg1));
        assertFalse(testMyApi(arg2));
        assertNull(testMyApi(arg3));
        assertEquals(testMyApi(arg4), testMyApi(arg5));
    }
}
  

Я бы даже предпочел использовать аннотации, такие

 class MyApiTest {
    @Before
    public setUp() {}

    @After
    public tearDOwn() {}

    @Test
    public testMyApi() {
        Assert.assertTrue(testMyApi(arg1));
        Assert.assertFalse(testMyApi(arg2));
        Assert.assertNull(testMyApi(arg3));
        Assert.assertEquals(testMyApi(arg4), testMyApi(arg5));
    }
}