在运行时挂钩或修改类

克里斯

我正在尝试修改我的Java测试套件,以便不报告跳过的测试来满足业务需求。

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本身,但这似乎不是可持续的或良好的做法,或者我可以重做我的Build Automation流程,但是该流程归另一个团队所有,所以我更喜欢其他东西。

克里希南·马哈德万(Krishnan Mahadevan)

您可以采用多种方法来解决此问题。

请确保您使用的是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文件,在其中您将删除无关的信息以适应您的需求。

我为此创建了一个博客文章,其中讨论了如何让TestNG按顺序执行侦听器。您可以在此处参考更多信息

您可以选择任何一种适合您的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章