【问题标题】:Conditionally add TestNG Listener?有条件地添加TestNG Listener?
【发布时间】:2020-11-25 20:17:32
【问题描述】:

我想根据某些条件以编程方式添加 TestNG Listener 的不同实现。

由于我无法找到任何方法通过@Listeners({}) 注释为它提供某种工厂,并且创建我自己的 TestNG 运行器似乎不可行,所以我选择了IAlterSuiteListener 接口,其中,根据文档:

允许您在您的套件 XML 文件中更改套件(或)测试标记 运行时

为了实现这一点,我创建并注册了一个简单的监听器:

public class CustomListener implements IExecutionListener {

    @Override
    public void onExecutionStart() {
        System.out.println("on start");
    }

    @Override
    public void onExecutionFinish() {
        System.out.println("on finish");
    }
}
public class AlterSuiteListener implements IAlterSuiteListener {

    @Override
    public void alter(List<XmlSuite> suites) {
        for (XmlSuite suite: suites) {
            suite.addListener(String.valueOf(CustomListener.class));
        }
    }
}

testng.xml

<suite name="all" verbose="1" parallel="tests">
    <listeners>
        <listener class-name="sandbox.AlterSuiteListener" />
    </listeners>
    <test name="all" parallel="methods" thread-count="5">
        <packages>
            <package name="sandbox" />
        </packages>
    </test>
</suite>

为了确保AlterSuiteListener 有效,我尝试简单地更改一些套件配置(设置测试超时)并且它确实有效。但是,添加监听器没有任何效果。

提前谢谢你。

【问题讨论】:

    标签: java testng


    【解决方案1】:

    我找到了使用 ITestNGListenerFactory 的解决方案:

    public class ConditionalListenerFactory implements ITestNGListenerFactory, ITestNGListener {
        public ConditionalListenerFactory() {
        }
    
        public ITestNGListener createListener(Class<? extends ITestNGListener> aClass) {
            if(condition()) {
                return new CustomListener();
            }
        }
    }
    

    然后通过@Listeners({ConditionalListenerFactory.class})注册监听器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 2020-06-03
      • 2016-10-01
      • 2014-04-10
      • 2011-12-15
      • 2016-05-22
      相关资源
      最近更新 更多