Отдельный stdout / stderr для теста для набора тестов JUnit на Jenkins - PullRequest
0 голосов
/ 06 июня 2018

Как мне указать JUnit (через Ant) перехватывать sdout и stderr для каждого теста в наборе тестов?Это вообще возможно?

Допустим, у меня есть простая задача Ant, которая запускает набор подробных тестов JUnit.

<target name="integration-tests" depends="init">
    <property name="test.reports" value="${build.dir}/test-reports" />
    <mkdir dir="${test.reports}" />
    <junit showoutput="true" printsummary="yes" fork="yes">
        <formatter type="xml" />
        <classpath>
            <pathelement path="${run.test.classpath}" />
        </classpath>
        <test name="org.example.IntegrationTestsTestSuite" todir="${test.reports}" />
    </junit>
</target>

Когда CI (в моем случае Jenkins) вызывает эту цель,JUnit генерирует аккуратный XML-файл для дальнейшей обработки CI (публикация).К сожалению, все stdout и stderr объединены в значения двух элементов XML.

<?xml version="1.0" encoding="UTF-8" ?>
<testsuite errors="0" failures="0" hostname="foo-host" name="org.example.IntegrationTestsTestSuite" skipped="0" tests="3" time="0.115" timestamp="2018-06-06T11:45:45">
  <properties>
    <!-- all properties used by Ant build script here -->
  </properties>
  <testcase classname="org.example.integration.tests.CommonStuff" name="testSomeFooDoingAThing" time="0.088" />
  <testcase classname="org.example.integration.tests.CommonStuff" name="testOtherFooDoingAThing" time="0.023" />
  <testcase classname="org.example.integration.tests.CommonStuff" name="testAnotherFooDoingAThing" time="0.004" />
  <system-out><![CDATA[]]></system-out>
  <system-err><![CDATA[]]></system-err>
</testsuite>

Если что-то пойдет не так с одним тестом, весь подробный вывод будет отображаться CI сразу, даже если это был успешный тест (когдапросмотр единственного неудачного теста), что исключает предполагаемую цель такого вывода.

Та же проблема существует, когда тесты выполняются в нашей среде IDE (Netbeans).Но я помню из других проектов, что, по крайней мере, IntelliJ смог показать такой подробный вывод за тест (хотя не уверен, применим ли он к наборам тестов).IntelliJ делает что-то еще для публикации / предварительной обработки вывода или это функция JUnit?

1 Ответ

0 голосов
/ 08 июня 2018

Похоже, что в JUnit нет встроенного способа сделать это через Ant.В итоге я реализовал эту функцию самостоятельно.

По предложению @ Mikhail я взглянул на аннотацию @ Rule , которая привела меня к классу JUnit TestWatcher .Он может использоваться для обработки отчетов о тестах программно (он является наблюдателем событий состояния одного метода тестирования, таких как «запуск», «сбой», «завершен» и т. Д.).

К сожалению, аннотация @Rule не может быть легко применена ко всему набору тестов, так как она предназначена для использования там, где появляются методы тестирования.Мне пришлось реализовать пользовательский пакет и Runner и поддельное присутствие @Rule в каждом классе, содержащем тестовые случаи (через RunRules внутри реализации Runner).

После этого я просто взглянул на структуру XML-отчета JUnit , собрал всю необходимую статистику теста и вывел ее с помощью TestWatcher (просто вызывает System.setOut() и System.setErr(), когдазапускается метод испытаний, затем восстанавливает их после завершения теста) и сам пишет файл отчета.

Задаче Ant больше не требуется элемент <formatter>, поскольку ему просто нужно вызвать определение Suite, которое теперь обрабатывает это неявно.Однако я использовал <sysproperty> для передачи имени каталога в пользовательский пакет, чтобы он знал, где хранить полученный файл с помощью System.getProperty(String).

Это полностью выполнимо с помощью JUnit версии 4.12.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...