TestNG系列(四)TestNG监听器

前言

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

一、IHookable:TestNG在测试方法执行前执行,常用于授权检查。

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方法");
    }
}

执行结果:

二、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测试方法");
    }
}

测试结果

三、IReporter:在测试方法执行后执行,通过遍历 xmlSuites 和 suites 能够获取所有测试方法的信息以及测试结果,后续可用于自定义测试报告。

IReporter实现类

public class IReporterImp implements IReporter {
    //通过遍历 xmlSuites 和 suites 能够获取所有测试方法的信息以及测试结果,后续可用于自定义测试报告。
    @Override
    public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> iSuites, String outputDirectory) {
        
        for(ISuite iSuite:iSuites){
            Map<String,ISuiteResult> iSuiteResultMap = iSuite.getResults();
            //获取所有执行的方法
            System.out.println("所有执行的方法:"+iSuite.getAllInvokedMethods());
            //获取所有@Test标注的方法
            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()){
                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());
                }
                
            }
            
        }
        
    }

}

测试用例

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

运行结果

四、Testlisteneradapter:执行测试方法后执行,主要用于记录log信息,根据执行结果的不同调用不同的方法。

实现类

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");
    }
     
    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测试方法");
    }
}

运行结果

五、监听的调用

可在测试类前添加@Listeners(监听实现类名.class),也可在XML配置文件中通过listeners标签进行监听的添加。

<listeners>
       <listener class-name="com.Monitor.IHookableImp"/>
</listeners>

 

posted @ 2019-12-09 15:24  大风北吹  阅读(...)  评论(...编辑  收藏