在运行时挂钩或修改类

时间:2017-12-14 21:51:23

标签: java testng

我正在尝试修改我的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本身,但这似乎不是可持续的或良好的做法,或者我可以重做我的构建自动化过程,但这是由另一个团队拥有,所以我更喜欢别的。

1 个答案:

答案 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不允许您定义侦听器的顺序。但有一种方法可以做到这一点。

  1. 禁用所有默认侦听器。
  2. 通过您自己定义的SPI机制(服务加载器)定义一个代理监听器,您将在其中连接所有其他监听器(由您编写的默认和自定义监听器)
  3. 您只连接您的代理侦听器,最终将连接所有其他侦听器。
  4. 构建一个配置为在最后执行的侦听器,执行时将基本上查找JUnit报告文件,然后将它们解析为xml文件,其中您将删除无关信息以满足您的需求。
  5. 我在此创建了一篇博文,其中讨论了如何让TestNG按顺序执行监听器。您可以参考它以获取更多信息here

    您可以选择适合您的方法。