Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Как избежать дублирования в юнит-тестах?

#java #юнит_тесты #junit


Тестирую некоторый алгоритм. Данные для алгоритма хранятся в списке. В итоге у меня
получается вот так:

@Test
public void testOneDirectModeBestCaseEven(){
    list.add(new Agent(6));
    list.add(new Agent(1));
    list.add(new Agent(2));
    list.add(new Agent(3));
    list.add(new Agent(4));
    list.add(new Agent(5));

    int i = 0;
    while(!list.hasSolution()){
        LeaderElection.solve(list, i++);
    }

    int leaderId = list.getLeaderId();
    assertEquals(6, leaderId);
}

@Test
public void testOneDirectModeBestCaseOdd(){
    list.add(new Agent(5));
    list.add(new Agent(1));
    list.add(new Agent(2));
    list.add(new Agent(3));
    list.add(new Agent(4));

    int i = 0;
    while(!list.hasSolution()){
        LeaderElection.solve(list, i++);
    }

    int leaderId = list.getLeaderId();
    assertEquals(5, leaderId);
}


И еще много функций. Получается дублирование в том что я заполняю List в каждом тесте.
Но и в setUp не вынесешь, потому что заполнять то нужно по-разному для каждого теста. 
    


Ответы

Ответ 1



Вам могут помочь параметризованные тесты. JUnit их тоже поддерживает. Приведу код, подробнее почитать можете по ссылкам. (На джаве давно не писал, поэтому скорее всего тут есть ошибки компиляции :)) @RunWith(Parameterized.class) public class LeaderElectionTests{ @Parameters public static Collection data(){ return Arrays.asList(new Object[][]{ { <список 1>, <ответ 1> }, { <список 2>, <ответ 2> } }); } private List list; private int expected; public LeaderElectionTests(List list, int expected){ list = input; expected = expected; } @Test public void testOneDirectModeBestCase(){ int i = 0; while(!list.hasSolution()){ LeaderElection.solve(list, i++); } int leaderId = list.getLeaderId(); assertEquals(answer, leaderId); } } Однако такой подход нужно использовать только когда вы тестируете один кейс на разных наборах входных данных. Если же у вас разные кейсы, причем эта разница заложена непосредственно во входных данных, то я бы рекомендовал идти по пути отдельных тестов. Это проще для восприятия, потому что так или иначе в названия тестов мы закладываем наши решения и наш опыт, полученные в процессе написания кода. Глядя же на обезличенный список тестовых наборов данных, через месяц уже будет сложно сказать, чем они отличаются между собой. Судя по коду, ваш объект list -- не просто список, он еще содержит в себе некоторую логику. Так что скорее всего разумнее будет остаться с разными тестами и дублирующимися данными, которые на самом деле не дублирующие данные, а разные тест кейсы. Хотя вам должно быть виднее, конечно.

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

Отправить комментарий