当前位置: 首页 > 知识库问答 >
问题:

自定义testng结果侦听器

岳曦
2023-03-14

我们定义了一个testng结果侦听器,它帮助我们将testng.xml中定义的每个测试用例的测试结果发送到一个内部工具,如下所示:

public class TestResultsListener implements ITestListener, ISuiteListener {

  @Override
  public void onFinish(ISuite suite){

    // some code to send the final suite result to internal tools
    }
  @Override
  public void onTestSuccess(ITestResult iTestResult) {
        this.sendResult(iTestResult,"PASS");Result
    }

  private void sendStatus(ITestResult iTestResult, String status){
        // Set test case information
        ......
       jsonArr.add(testResult);

    }

}

然后我们将这个侦听器集成到其他项目的testng xml文件中,例如:

  <listeners>
    <listener class-name="com.qa.test.listener.TestesultsListener" />
</listeners>

它按照设计工作:一旦测试套件完成,测试结果将上传到内部工具。

现在我们有一个要求,在一个项目中,testng.xml中的一个测试用例与内部工具中的3个测试用例相关,这意味着对于testng.xml中的一个测试用例,我们需要更新内部工具中的3个测试用例。我们如何更新当前的testng侦听器来实现这一点呢?

多谢.

共有1个答案

邓翼
2023-03-14

您可以使用相应的内部测试工具ID列表来注释您的每个测试:

这里我假设您有2个testng测试:一个与内部测试IT-1相关,另一个与内部测试IT-2、IT-3和IT-4相关:

@Listeners(MyTestListener.class)
public class TestA {

    @Test
    @InternalTool(ids = "IT-1")
    public void test1() {
        System.out.println("test1");
        fail();
    }

    @Test
    @InternalTool(ids = {"IT-2", "IT-3", "IT-4"})
    public void test2() {
        System.out.println("test2");
    }
}

注释的定义简单如下:

@Retention(RetentionPolicy.RUNTIME)
public @interface InternalTool {
    String[] ids();
}

您的监听器只需要弄清楚在成功/失败的测试中出现了哪些注释:

public class MyTestListener extends TestListenerAdapter implements ITestListener {

    @Override
    public void onTestSuccess(ITestResult tr) {
        super.onTestSuccess(tr);
        updateInternalTool(tr, true);
    }

    @Override
    public void onTestFailure(ITestResult tr) {
        super.onTestFailure(tr);
        updateInternalTool(tr, false);
    }

    private void updateInternalTool(ITestResult tr, boolean success) {
        InternalTool annotation = tr.getMethod().getConstructorOrMethod().getMethod().getAnnotation(InternalTool.class);
        for (String id : annotation.ids()) {
            System.out.println(String.format("Test with id [%s] is [%s]", id, success ? "successful" : "failed"));
        }
    }
}

产生以下输出:

test1
Test with id [IT-1] is [failed]

test2
Test with id [IT-2] is [successful]
Test with id [IT-3] is [successful]
Test with id [IT-4] is [successful]

您还可以将此机制扩展到套件侦听器。

免责声明:行InternalTool注释=tr.getMethod().getConstructororMethod().getMethod().getAnnotation(InternalTool.Class);不是防弹(空指针异常的高风险)。应该更健壮。

 类似资料:
  • 我试图在更新整数值时激发事件,但失败了。下面是我使用的代码: 我是不是漏掉了什么?

  • 方法正在传递,这太好了,但是为什么的结果会出现在库测试结果中,我不明白。我怎么才能避免呢? 我在这里列出了和的完整代码。

  • 我目前正在为一个包含大量模块的大项目创建TestNG测试用例。现有的大多数单元测试实际上都是集成测试,因为它们非常依赖于/opt文件夹中的配置文件以及正在运行的数据库和消息队列。 为了使事情进一步复杂化,测试用例使用配置位于resources/meta-inf/services/org.TestNG.itestnglistener文件中的TestNG侦听器。这个文件中的侦听器触发所有测试用例(正如

  • 有人知道这是否可能使log4j上的侦听器从命名方法/类捕获每个日志?最后是将检索到的日志添加到JPanel中。 谢谢!

  • 我有一个自定义视图,我可以在其中画线,我也可以选择线的宽度。我还有一个统计数据,在另一个片段中,我应该显示每一个笔画画了多少行。 所以我想创建一个自定义的监听器,它应该对不同的笔划宽度做出反应。每当笔划发生变化时,统计数据应显示所选笔划的新计数。。。 我用界面尝试了一下,但我真的不知道如何前进。我该怎么做?

  • 而且,如果从Eclipse运行这样的测试,即使测试被移除,当套件完成时,失败仍然会打印在日志中。 关于RetryAnalyzer:我根本不考虑使用RetryAnalyzer的良好/最佳实践,但如果您发现自己处于需要解决问题的情况下,例如,您继承了一个依赖RetryAnalyzer的测试套件,您可能会发现这很有用。