Итак, у меня есть тесты 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? К сожалению, похоже, что нет способа получить текущий запущенный пакет из тестового описания, поэтому я не понимаю, как обойти это.