Страницы

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

вторник, 23 апреля 2019 г.

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

Тестирую некоторый алгоритм. Данные для алгоритма хранятся в списке. В итоге у меня получается вот так:
@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 не вынесешь, потому что заполнять то нужно по-разному для каждого теста.


Ответ

Вам могут помочь параметризованные тесты. 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 -- не просто список, он еще содержит в себе некоторую логику. Так что скорее всего разумнее будет остаться с разными тестами и дублирующимися данными, которые на самом деле не дублирующие данные, а разные тест кейсы. Хотя вам должно быть виднее, конечно.

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

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