Неудачный тест junit не обнаружен teamcity при использовании jacoco

Я пытался интегрировать покрытие кода в свой проект, используя jacoco, ant и teamcity. Однако я понял, что когда задача jacoco связана с задачей junit, teamcity не отлавливает неудачные тесты, и все проходит успешно, даже если тест не пройден.

Вот мои 2 тестовых задания для тестирования с jacoco и без него и просмотра поведения TeamCity.

1- с активированным жакоко

<target name="-test">
    <echo message="JaCoCo activated"/>
    <!-- Import the JaCoCo Ant Task -->
    <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml"/>
    <!-- Run your unit tests, adding the JaCoCo agent -->
    <jacoco:coverage destfile="${bin}/jacoco.exec" xmlns:jacoco="antlib:org.jacoco.ant">
        <junit fork="yes" printsummary="yes" haltonfailure="no" showoutput="false" failureProperty="test.failed" errorProperty="test.failed">
            <classpath>
                <path location="${lib}/${projectName}.jar"/>
                <path refid="project.classpath"/>
            </classpath>
            <formatter type="xml"/>
            <batchtest todir="${reportingHome}">
                <fileset dir="${test}">
                    <include name="**/*Test.java"/>
                </fileset>
            </batchtest>
        </junit>
    </jacoco:coverage>
    <copy todir="${completeReportDir}" overwrite="true">
        <fileset dir="${reportingHome}">
            <include name="*.xml"/>
        </fileset>
    </copy>
</target>

2- без жакоко

<target name="-test">
    <echo message="JaCoCo activated"/>
    <!-- Import the JaCoCo Ant Task -->
    <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml"/>
    <!-- Run your unit tests, adding the JaCoCo agent -->
    <!--<jacoco:coverage destfile="${bin}/jacoco.exec" xmlns:jacoco="antlib:org.jacoco.ant">-->
        <junit fork="yes" printsummary="yes" haltonfailure="no" showoutput="false" failureProperty="test.failed" errorProperty="test.failed">
            <classpath>
                <path location="${lib}/${projectName}.jar"/>
                <path refid="project.classpath"/>
            </classpath>
            <formatter type="xml"/>
            <batchtest todir="${reportingHome}">
                <fileset dir="${test}">
                    <include name="**/*Test.java"/>
                </fileset>
            </batchtest>
        </junit>
    <!--</jacoco:coverage>-->
    <copy todir="${completeReportDir}" overwrite="true">
        <fileset dir="${reportingHome}">
            <include name="*.xml"/>
        </fileset>
    </copy>
</target>

Между двумя выпусками теста была прокомментирована только задача jacoco. Выход TeamCity

[CommonBuildTasks.-test] echo
[08:26:21]: [echo] JaCoCo activated
[08:26:21]: [CommonBuildTasks.-test] jacoco:coverage (4s)
[08:26:21]: [jacoco:coverage] Enhancing junit with coverage.
[08:26:22]: [jacoco:coverage] Running ca.thalesgroup.socialnetworkanalysisorchestrator.impl.client.SocialNetworkAnalysisOrchestratorServiceProviderTest
[08:26:25]: [jacoco:coverage] Tests run: 2, Failures: 1, Errors: 0, Time elapsed: 3.511 sec
[08:26:26]: [jacoco:coverage] Test ca.thalesgroup.socialnetworkanalysisorchestrator.impl.client.SocialNetworkAnalysisOrchestratorServiceProviderTest FAILED
[08:26:26]: [CommonBuildTasks.-test] copy
[08:26:26]: [copy] Copying 1 file to C:\TeamCity\buildAgent\work\cc10e09e43249f57\reports

Как видите, тест провалился, но teamcity сообщил об успешной сборке.

Есть идеи, почему у меня такое поведение? Спасибо


person user2100163    schedule 22.02.2013    source источник


Ответы (2)


Ответ скрыт в вашем вызове JUnit-Task:

<junit haltonfailure="no">...</junit>

С этой конфигурацией задача JUnit не вызывает сбой сборки при неудачных тестах. Это должно привести к желаемому поведению:

<junit haltonfailure="yes">...</junit>

См. документацию Ant для настройки задачи JUnit.

person Markus    schedule 22.02.2013
comment
Эта опция работает, чтобы сделать полную сборку неудачной сборкой. Однако информация о том, какие тесты завершились неудачно, а какие успешно, теряется. - person user2100163; 22.02.2013
comment
В этом случае вам, возможно, следует проверить конфигурацию города вашей команды. Ваш вопрос сначала прозвучал для меня так, как будто вы хотели, чтобы сборка провалилась. - person Markus; 22.02.2013

Я решил эту проблему, используя задачу агента вместо задачи покрытия. Итак, вместо

<jacoco:coverage destfile="${bin}/jacoco.exec" xmlns:jacoco="antlib:org.jacoco.ant">

Использовать:

<jacoco:agent property="agentvmparam" destfile="${bin}/jacoco.exec"/>
<junit fork="yes"...
    <jvmarg value="${agentvmparam}"/>
</junit>

Задача агента использует те же свойства, что и задача покрытия. Затем вы можете запустить свою задачу junit, не заключая ее в задачу покрытия. Таким образом, teamcity может перехватывать вывод задачи junit.

person Max Shcherbakov    schedule 17.04.2013