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>