testng中级用法--监听器(一)

前言

一,为什么要用监听器???
Testng虽然提供了不少强大的功能和灵活的选项,但不能解决所有的问题,而监听器就是用来定制额外的功能以满足我们的需求的;

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

监听器种类:

• IAnnotationTransformer(修改@Test注释属性)
只能用来修改 @Test注解的注释属性

void transform(ITest annotation, Class testClass, Constructor testConstructor, Method testMethod);

annotation 代表就是为 testMethod 定义的 @Test 注释。调用其方法可以更改 @Test 注释属性。例如:annotation.setEnabled(false);便会在运行时将属性 enabled 改为 false 从而禁用了当前的测试方法。

• IAnnotationTransformer2(修改其他注解的注释属性)
*用来修改除 @Test 以外的 TestNG 的注释,例如:@DataProvider 以及 @Factory 等注解的注释属性能够通过该监听器修改;

void transform(IDataProviderAnnotation annotation, java.lang.reflect.Method method)
void transform(IFactoryAnnotation annotation, java.lang.reflect.Method method)

• IHookable(类似与面向方面编程(AOP)中的 Around Advice 的功能)
*用来在测试方法执行前后提供了切入点,从而使用户能够在测试方法运行前后注入特定的功能

void run(IHookCallBack callBack, ITestResult testResult)

• IInvokedMethodListener(类似与面向方面编程(AOP)中的 Before Advice 和 After Advice 的功能)
*在当前测试方法被执行前和执行后注入特定的逻辑

void afterInvocation(IInvokedMethod method, ITestResult testResult) 
void beforeInvocation(IInvokedMethod method, ITestResult testResult)

常用来加入日志
• ImethodInterceptor(控制列表执行循序)
TestNG 启动之后,所有的测试方法分成两类:
一类是顺序运行的测试方法;(dependsOnGroups 和 dependsOnMethods)
一类是没有特定运行顺序的测试方法。(运行顺序是随机,每次运行的顺序都可能不同)
IMethodInterceptor 监听器用来对第二类测试有更大的控制权,对列表重新排序,甚至增加或者减少测试方法;

java.util.List<IMethodInstance> intercept(java.util.List<IMethodInstance> methods, ITestContext context)

实现的intercept 方法会在所有测试方法被分类后以及所有测试方法被执行前被调用。所有的测试方法将按照 intercept 返回值列表中的顺序被执行。

• IReporter(自定义测试报表)
IReporter 监听器用来自定义测试报表;

void generateReport(java.util.List<XmlSuite> xmlSuites, java.util.List<ISuite> suites, java.lang.String outputDirectory)

generateReport方法会在所有测试方法执行结束后被调用,通过遍历 xmlSuites 和 suites 能够获取所有测试方法的信息以及测试结果。outputDirectory 是默认的测试报表生成路径,当然你可以指定其他路径生成报表

• ISuiteListener(suite的AOP)
ISuiteListener 使用户有机会在测试套件开始执行以及执行结束之后嵌入自己的逻辑;
类似,但区别IInvokedMethodListener 针对的是测试方法,而 ISuiteListener 针对的是测试套件

void onFinish(ISuite suite) 
void onStart(ISuite suite)

• ITestListener(简便自定义测试方法执行后的后续行为)
用来在测试方法执行成功、失败或者跳过时指定不同后续行为;
IInvokedMethodListener 也可以实现,但ITestListener更简便;

void onTestFailure(ITestResult result) 
void onTestSkipped(ITestResult result) 
void onTestSuccess(ITestResult result)

另外:TestListenerAdapter 已经实现 ITestListener,并且提供了一些有用的方法,比如分别获取所有成功失败跳过三种测试结果的测试方法的方法,并且 ITestListner 中有很多方法而 TestListenerAdapter 已给出了默认实现。因此,继承 TestListenerAdapter 后,便只需关注需要修改的方法。

监听器使用方法:

一,在 testng.xml 中使用 TestNG 监听器

<listeners>
<listener class-name="api.listeners.AutoTestListener"></listener>
<listener class-name="api.listeners.RetryListener"></listener>
<listener class-name="api.listeners.ExtentTestNGIReporterListener"/>
</listeners>

二,在源代码中使用 TestNG 监听器

通过 @Listeners 注释,可以直接在 Java 源代码中添加 TestNG 监听器

@Listeners(RetryListener.class)
public class SampleTest {
    @Test()
    public void test1() {
        sleep(6000);
        System.out.println("test1");
    }

*注意:
1,在 @Listeners 中添加监听器跟在 testng.xml 添加监听器一样,将被应用到整个测试套件中的测试方法。如果需要控制监听器的应用范围(比如添加的监听器仅使用于某些测试测试类或者某些测试方法),则必须在监听器类中编写适当的判断逻辑。
2,在 @Listeners 中添加监听器跟在 testng.xml 添加监听器的不同之处在于,它不能添加 IAnnotationTransformer 和 IAnnotationTransformer2 监听器。原因是因为这两种监听器必须在更早的阶段添加到 TestNG 中才能实施修改注释的操作,所以它们只能在 testng.xml 添加。
3,TestNG 对添加的监听器不做去重判断。因此,如果 testng.xml 和源代码中添加了相同的监听器,该监听器的方法会被调用两次。有关这一点,大家可以通过运行本文附带的示例代码包中 testng.xml 验证。因此,切记,不要通过多种方式重复添加监听器。

三,通过 ServiceLoader 使用 TestNG 监听器

创建一个 jar 文件,里面包含 TestNG 监听器的实现类以及 ServiceLoader 需要的配置信息,并在运行 TestNG 时把该 jar 文件加载到类路径中。具体步骤请查阅 TestNG 官方文档

四,通过命令行使用 TestNG 监听器

java org.testng.TestNG -listener MyListener testng1.xml [testng2.xml testng3.xml ...]

摘自:TestNG 官方文档,实战 TestNG 监听器
以上~对你有帮助的话,点个喜欢❤️吧~~

欢迎关注我的同名简书,博客,Github~~~

猜你喜欢

转载自blog.csdn.net/weixin_33971130/article/details/87219788
今日推荐