Surefire только сообщает первый набор тестов из модуля в RunListener - PullRequest
0 голосов
/ 14 апреля 2020

Итак, у меня есть тесты TeamCity и JUnit, и я хочу написать от RunListener до уведомления TeamCity в реальном времени о запуске тестов - TeamCity поддерживает только пакетные отчеты о тестировании для JUnit из коробки.

У меня есть несколько комплектов, помеченных @RunWith(Suite.class) для логической группировки тестов. TeamCity правильно показывает сгруппированные тесты. Однако моя проблема заключается в том, что Surefire будет вызывать RunListener.testRunStarted только один раз с именами обоих наборов в описании (но никак не приписывать тесты ни одному из них).

Поэтому я реализовал

public class JUnitTeamcityReporter extends RunListener {
    /** */
    private volatile Description suite;

    /** */
    @Override public void testRunStarted(Description desc) {
        this.suite = desc;
    }

    /** */
    @Override public void testStarted(Description desc) {
        System.out.println(String.format("##teamcity[testStarted name='%s' captureStandardOutput='true']",
            testName(suite, desc)));
    }
...

И я подключил его в моем pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M3</version>
    <configuration>
        <forkCount>0</forkCount>
        <properties>
            <property>
                <name>listener</name>
                <value>com.pany.JUnitTeamcityReporter</value>
            </property>
        </properties>
    </configuration>
</plugin>

Я запускаю Maven с -Dtest=FirstTestSuite,SecondTestSuite

и получаю следующее:

[INFO] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 16.803 s - in com.pany.FirstTestSuite
# I expect that my RunListener will be notified HERE, but it does not happen!
[INFO] Running com.pany.SecondTestSuite

В противном случае моё решение будет работать нормально, если на один модуль будет только один пакет.

Можно ли заставить Surefire правильно сообщать о каждом наборе в testRunStarted? К сожалению, похоже, что нет способа получить текущий запущенный пакет из тестового описания, поэтому я не понимаю, как обойти это.

1 Ответ

0 голосов
/ 15 апреля 2020

Эта информация недоступна для JUnit, и у Surefire довольно слабые возможности расширения, но она может быть достигнута:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M4</version> <!-- upgrade to M4 -->
    <configuration>
        <workingDirectory>${user.dir}</workingDirectory>
        <!-- surefire integration to intercept test suite start: -->
        <statelessTestsetInfoReporter 
            implementation="com.pany.TestSuiteAwareTestsetReporter"/>
        <properties>
            <property>
                <name>listener</name>
                <value>com.pany.JUnitTeamcityReporter</value>
            </property>
        </properties>
    </configuration>
    <dependencies>
    <!-- Add dependency to plugin (for surefire) as well as
    compile,test dependency to module (for junit) since they're on different classpaths -->
        <dependency>
            <groupId>com.pany</groupId>
            <artifactId>dev-tools</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</plugin>

и код репортера набора тестов:

public class TestSuiteAwareTestsetReporter extends SurefireStatelessTestsetInfoReporter {
    @Override public StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats> createListener(
        ConsoleLogger log) {
        return new ConsoleReporter(log, false, false) {
            public void testSetStarting(TestSetReportEntry report) {
                MessageBuilder builder = MessageUtils.buffer();

                /** @see TestSetStats#concatenateWithTestGroup(MessageBuilder, ReportEntry, boolean) */
                JUnitTeamcityReporter.suite = concatenateWithTestGroup(builder, report);

                super.testSetStarting(report);
            }
        };
    }

...
...