JUnit: ввести параметры @Parameterized?

Какой самый простой способ ввести набор параметров в тестовый класс @Parameterized?

Вариант использования:

У меня есть обычный класс, который выглядит так

@RunWith(Parameterized.class)
class Tests {

    public void testOne() { }
    public void testTwo() { }

    @Parameters
    public static Collection<Object[]> generateData() { }

}

Стандартный исполнитель JUnit можно вызвать следующим образом: org.junit.runner.JUnitCore.runClasses(TestClass1.class, ...);

однако нет возможности указать/переопределить параметры.

Как я могу ввести свои собственные параметры?


person Christian Neverdal    schedule 10.02.2015    source источник
comment
Это похоже на проблему XY. Справедливо ли будет сказать, что ваш основной вопрос: Как я могу легко запускать только те тесты, которые не прошли большой параметризованный тест? Если да, можете ли вы подтвердить, какую IDE вы используете, предполагая, что вы пытаетесь для достижения этой цели в среде IDE?   -  person Duncan Jones    schedule 11.02.2015
comment
Справедливости ради стоит сказать, что мой основной вопрос таков: Хотя можно запустить тестовый класс, используя (например) JUnitCore, как я могу передать параметры, чтобы он не использовал параметры, указанные в @Parameters.< /я>?   -  person Christian Neverdal    schedule 11.02.2015
comment
Не могли бы вы предоставить дополнительную информацию о значении ввода моих собственных параметров.   -  person Stefan Birkner    schedule 15.04.2015
comment
Допустим, теперь я хочу иметь класс, который будет запускать тест из этого тестового класса, но с заданным Object[], который я укажу.   -  person Christian Neverdal    schedule 16.04.2015


Ответы (2)


junit не предназначен для запуска чужого класса junit с вашими параметрами. поэтому, если возможно, проведите рефакторинг тестируемых классов, чтобы они поддерживали желаемое поведение. если вы не можете провести рефакторинг, все, что вы можете сделать, это использовать некоторые обходные пути. Например:

  • если тестовый класс написан «правильно» (например, без статических ссылок), вы можете наследоваться от тестового класса и предоставить свои собственные параметры. но все же вы должны указать параметры явно в файле класса, а не во время запуска
  • вы можете попробовать использовать собственный загрузчик классов и генерацию/преобразование байт-кода, чтобы изменить метод поставщика параметров при загрузке класса. так же, как работает PowerMockito
  • напишите свой собственный бегун, чтобы он игнорировал параметры класса и вместо этого использовал свой собственный
person piotrek    schedule 24.04.2015

Я бы использовал метод generateData(), который генерирует все пятьсот элементов. Кроме того, я бы добавил метод getParameters() с аннотацией @Parameters. Он может вызвать generateData() для получения полной коллекции, а затем загрузить файл журнала (если он есть) и сократить коллекцию до непройденных тестовых параметров. Если файл журнала отсутствует, будет возвращена вся коллекция. Возможно, вам потребуется явно назвать свои параметры, чтобы иметь возможность их идентифицировать, поскольку JUnit не гарантирует повторный запуск тестов/параметров теста в том же порядке (см. Изменение имен параметризованных тестов).

@RunWith(Parameterized.class)
public class Tests {

  @Parameters
  public static Collection<Object[]> getParameters() {
    List<Object[]> parameters = generateData();
    return filterParameters(parameters);
  }

  private static Collection<Object[]> filterParameters(Collection<Object[]> params) {
    // load a file to exclude successful tests
    // ...
  }

  private static Collection<Object[]> generateData() {
    return new ArrayList<Object[]>();
  }
}

Другим способом может быть использование Scanner с System.in в методе @Parameters, чтобы вы могли выбирать параметры с пользовательским вводом из консоли. Однако вам нужно каким-то образом убедиться, что тесты по-прежнему могут выполняться без взаимодействия с пользователем, если вы хотите использовать их в непрерывной интеграции.

person nrainer    schedule 10.02.2015