我正在尝试修改我的java测试套件,这样我就不会报告Skipped测试以满足业务需求。
TestNG允许您编写自定义报告者和监听器,但在这种情况下,我想修改Jenkins和SonarQube实例使用的Junit报告。
深入了解testNG代码我看到了:
private void initializeDefaultListeners() {
m_testListeners.add(new ExitCodeListener(this));
if (m_useDefaultListeners) {
addReporter(SuiteHTMLReporter.class);
addReporter(Main.class);
addReporter(FailedReporter.class);
addReporter(XMLReporter.class);
if (System.getProperty("oldTestngEmailableReporter") != null) {
addReporter(EmailableReporter.class);
} else if (System.getProperty("noEmailableReporter") == null) {
addReporter(EmailableReporter2.class);
}
addReporter(JUnitReportReporter.class);
if (m_verbose != null && m_verbose > 4) {
addListener(new VerboseReporter("[TestNG] "));
}
}
所以看来testNG默认启用了JUnitReportReporter,因此扩展该类不会产生预期的效果。
java中是否有一种方法可以挂钩到该类并对generateReport方法进行更改,或者在运行时修改该类? 我可以修补testNG本身,但这似乎不是可持续的或良好的做法,或者我可以重做我的构建自动化过程,但这是由另一个团队拥有,所以我更喜欢别的。
答案 0 :(得分:1)
有多种方法可以解决此问题。
请确保您使用的是最新发布的TestNG版本[目前 6.13.1 ]
方法#1:类路径覆盖
在这种方法中,您基本上可以在项目中复制org.testng.reporters.JUnitReportReporter
,然后在本地更改它以满足您的需求。这将欺骗Java首先找到您的变体并忽略TestNG中的内容。然后,您可以修改课程以满足您的需求。
方法#2:禁用默认侦听器
TestNG允许您通过将属性usedefaultlisteners
设置为false
来禁用默认侦听器。以下是通过Maven的方式。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<properties>
<property>
<name>usedefaultlisteners</name>
<value>false</value>
</property>
</configuration>
</plugin>
</plugins>
</build>
您现在可以构建自己的报告变体,然后注入它。
方法#3:让您的听众按顺序运行
默认情况下,TestNG不允许您定义侦听器的顺序。但有一种方法可以做到这一点。
我在此创建了一篇博文,其中讨论了如何让TestNG按顺序执行监听器。您可以参考它以获取更多信息here。
您可以选择适合您的方法。