引用来源: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>











网友评论