Генерация отчетов JUnit из командной строки

У меня есть тестовая установка для облачной системы, которая использует смесь python для управления уровнем процесса и junit для внутренней проверки состояния. По сути, я вызываю несколько виртуальных машин на сервер как облако, а затем юнитовую VM, которая является членом облака, но управляет тестами и проверяет внутреннее состояние. Наш существующий элемент управления облаками управляется python, и я хотел бы сохранить это.

У меня есть рабочая настройка, которая будет запускать командную строку JUnit через

java -ea -cp <classpath> org.junit.runner.JUnitCore <tests>

но это не создает файл отчета. Я знаю, что ant способен создавать отчет xml, но я не хочу включать ant в этот процесс (у меня уже достаточно движущихся частей).

Есть ли способ запустить junit из командной строки, чтобы он создавал отчет?

В идеале, если бы тесты junit отображали отчеты xml, тесты python генерируют отчеты xml, а затем объединяют их для использования нашей системой CI.

Обновление: Выполнение командной строки должно поддерживать Windows, Linux и Mac. Нам не разрешено отправлять внешний ant, хотя упаковка ant может быть вариантом.

Ответы

Ответ 1

В библиотеке JUnit нет параметров вывода XML. Чтобы достичь такой цели, вам нужно написать свой собственный RunListener, который прослушивает вывод и будет в вашем случае писать XML файл.

Однако, чтобы получить XML файл в правильном формате, чтобы он мог быть прочитан системой CI, я думаю, было бы гораздо проще просто использовать ant либо через командную строку, используя build.xml(JUnitReport) или с помощью java api: Как я могу использовать Apache ANT Programmatically.

EDIT: сначала у нас было четыре варианта:

  • Используйте ANT из командной строки
  • Используйте программный код ANT (используя Java API)
  • Используйте XMLJUnitResultFormatter непосредственно с помощью JUnitCore
  • Создайте собственный RunListener, который создает правильный вывод XML.

Учитывая ограничения, добавленные OP, мы не можем использовать ANT из командной строки, что исключает 1.

После более пристального изучения задачи ANT JUnit представляется невозможным использовать это с JUnitCore (добавление TestListener), потому что ANT напрямую использует имя тестового класса, поэтому вы не можете делать класс моста. Из XMLJUnitResultFormatter.java

private void formatError(String type, Test test, Throwable t) {
    ...
    nested.setAttribute(ATTR_TYPE, t.getClass().getName());

    String strace = JUnitTestRunner.getFilteredTrace(t);
    Text trace = doc.createTextNode(strace);
    nested.appendChild(trace);
}

Это устраняет 3.

Вызвать ANT программным путем через API Java. Я не могу найти недавнюю документацию по этому вопросу. Это кажется трудным.

Итак, наконец, я бы сделал 4, пользовательский RunListener, используя код из XMLJUnitResultFormatter в качестве базы. И затем, я бы опубликовал его на github.com, так что на этот вопрос можно было бы ответить правильно: -)