自定义测试结果侦听器

问题描述 投票:2回答:1

我们定义了一个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侦听器以实现此目的?

非常感谢。

java testng
1个回答
2
投票

您可以使用相应的内部测试工具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]

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

免责声明:该行InternalTool annotation = tr.getMethod().getConstructorOrMethod().getMethod().getAnnotation(InternalTool.class);并非防弹(空指针异常的高风险)。应该更健壮。

© www.soinside.com 2019 - 2024. All rights reserved.