TestNG监听器

2024-01-21  本文已影响0人  霖在

引用来源:https://www.cnblogs.com/yogouo/p/11946916.html
https://zhuanlan.zhihu.com/p/123950115

image.png

监听器实际上是一些预定义的java接口,用户创建这些接口的实现类(即implements某监听接口,并实现里面的方法),并加入到testng中,testng便会在运行的不同时刻调用这些类中你自定义实现的接口方法,从而实现定制额外的功能

常用监听器类别:
一、IHookable:常用于用例的鉴权认证等需求。

这个接口定义了一个方法:run(IHookCallBack callBack, ITestResult testResult) ,如果一个类实现了这个接口,那么run方法会代替被发现的每个@Test方法调用运行。而我们可以通过IHookCallBack 参数的callBack()方法在run方法中调用执行@Test方法。

IHookable实现类

public class IHookableImp implements IHookable {
    @Override
    public void run(IHookCallBack iHookCallBack, ITestResult iTestResult) {
        ConstructorOrMethod method = iTestResult.getMethod().getConstructorOrMethod();
        String name = method.getName();
        System.out.println("测试method是 "+name);
        System.out.println("开始执行~");
        //测试用例开始执行
        iHookCallBack.runTestMethod(iTestResult); 
        System.out.println("结束~");
    }
}

测试用例

@Listeners(IHookableImp.class)
public class Test_case {
    @Test
    public void case1(){
        System.out.println("case1方法");
    }
}

运行结果


image.png

二、IINvokedmethodl:TestNG在调用方法前、后启用该监听器,常用于日志的采集。
IInvokedMethodListener实现类

public class IInvokedMethodListenerImp implements IInvokedMethodListener {
    //TestNG在调用方法前、后启用该监听器,常用于日志的采集。
    @Override
    public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
        // TODO Auto-generated method stub
        //获取执行的@Test方法
        System.out.println(iTestResult.getName());
    }
    @Override
    public void beforeInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
        // TODO Auto-generated method stub
        //获取执行的@Test方法
        System.out.println(iTestResult.getName());
    }
}

测试用例

@Listeners(IInvokedMethodListenerImp.class)
public class Test_case {
    @Test
    public void case1(){
        System.out.println("执行了case1测试方法");
    }
}

运行结果


image.png

三、IReporter:这个接口可以用来自定义产生测试报告
它只有一个方法,generateReport,当所有的suite都运行完成后,调用这个方法,就可以产生测试报告了,通过遍历 xmlSuites 和 suites 能够获取所有测试方法的信息以及测试结果
IReporter实现类

public class IReporterImp implements IReporter {
    @Override
    public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> iSuites, String outputDirectory) {
        
        for(ISuite iSuite:iSuites){ //遍历所有的suite
            Map<String,ISuiteResult> iSuiteResultMap = iSuite.getResults();
            System.out.println("所有执行的方法:"+iSuite.getAllInvokedMethods());
            System.out.println("获取所有@Test标注的方法:"+iSuite.getAllMethods());
            //获取suite标签的name属性
            System.out.println("suiteName:"+iSuite.getName());
            //获取测试报告的输出路径
            System.out.println("输出路径:"+iSuite.getOutputDirectory());
            System.out.println("报告路径:"+outputDirectory);
            //获取并发方式
            System.out.println("并发方式:"+iSuite.getParallel());
            
            for(ISuiteResult iSuiteResult:iSuiteResultMap.values()){ //遍历一个suite中的所有测试方法
                ITestContext iTestContext = iSuiteResult.getTestContext();
                IResultMap iResultMap = iTestContext.getPassedTests();
                
                Set<ITestResult> iTestResultset = iResultMap.getAllResults();
                for(ITestResult iTestResult:iTestResultset){
                    //获取执行的Test方法
                    System.out.println("测试方法:"+iTestResult.getName());
                    //获取执行结果
                    System.out.println("执行结果(1-成功,2-失败,3-skip):"+iTestResult.getStatus());
                    //获取开始执行的时间
                    System.out.println("开始时间:"+iTestResult.getStartMillis());
                    //获取结束执行的时间
                    System.out.println("结束时间:"+iTestResult.getEndMillis());
                }  
            }
        }
    }
}

四、Testlisteneradapter:执行测试方法后执行,根据执行结果的不同调用不同的方法。

public class TestListenerAdapterImp extends TestListenerAdapter {
    private int m_count = 0;
    
    @Override
    public void onTestFailure(ITestResult tr) {
        log(tr.getName()+ "--Test method failed\n");
    }
     
    @Override
    public void onTestSkipped(ITestResult tr) {
        log(tr.getName()+ "--Test method skipped\n");
    }
     
    @Override
    public void onTestSuccess(ITestResult tr) {
        log(tr.getName()+ "--Test method success\n");
    }
     
//自己实现Log方法
    private void log(String string) {
        System.out.print(string);
        if (++m_count % 40 == 0) {
        System.out.println("");
        }
    }
}

测试用例

@Listeners(TestListenerAdapterImp.class)
public class Test_case {
    @Test
    public void case1(){
        System.out.println("执行了case1测试方法");
    }
}

监听器使用

监听器的使用,有好几种方式,需要注意的是,有些监听器只可以在某种方式下生效。

1.@Listeners注解
注意:这个注解可以包含任何实现了org.testng.ITestNGListener的类,但除了IAnnotationTransformer和IAnnotationTransformer2

2.Xml中使用listener标签

<listeners>
       <listener class-name="com.Monitor.IHookableImp"/>
</listeners>
上一篇 下一篇

猜你喜欢

热点阅读