美文网首页
TestNG实践——1.监听器介绍和使用方式

TestNG实践——1.监听器介绍和使用方式

作者: 困死啦的虫子 | 来源:发表于2020-05-22 10:50 被阅读0次

    监听器总览

    从图中可以看出org.testng.ITestNGLister这个接口类是所有监听器的父接口,而他的子接口如图所示,从图中,我们还能看到所有的实现类。当我们要自定义监听器时,其实就是去实现这些预定义的接口类。

    TestNG API:https://www.javadoc.io/doc/org.testng/testng/6.14.0/overview-summary.html

    现在我们根据上面这些接口类,进行一下功能分类说明。

    IAlterSuiteListener

    这个接口使我们可以访问到XmlSuite对象,这样我们可以基于自己的需求修改suite或者test。

    该监听器只可以通过listeners标签在suite文件中添加,或者是通过service loaders使用。不可以通过@Listeners注解。

    IAnnotationTransformer

    有3个这种类型的接口:IAnnotationTransformer, IAnnotationTransformer2, IAnnotationTransformer3,分别对应不同的注解。

    IAnnotationTransformer,操作@Test标注

    IAnnotationTransformer2,操作@Configuration标注、@DataProvider标注和@Factory标注

    IAnnotationTransformer3,操作@Listeners标注

    IClassListener/ISuiteListener/ITestListener

    IClassListener:通过onBeforeClass和onAfterClass两个方法,对ITestClass对象操作。

    ISuiteListener:通过onStart和onFinish两个方法,对ISuite对象操作。

    ITestListener:通过onStart和onFinish两个方法,对ITestContext测试用例的上下文操作;通过onTestFailedButWithinSuccessPercentage, onTestFailure,onTestSkipped,onTestStart,onTestSuccess方法,对ITestResult测试结果操作。

    IDataProviderListener

    这个监听器是在TestNG调用数据驱动的前后被调用的。

    IReporter

    这个接口可以用来自定义产生测试报告,它只有一个方法,generateReport,当所有的suite都运行完成后,调用这个方法,就可以产生测试报告了,该方法参数包含运行期间产生的所有测试结果对象,List xmlSuites, List suites, String outputDirectory。

    IExecutionListener

    用于监听TestNG执行的开始和结束,开始于TestNG处理任何监听器之前,结束于测试报告产生后TestNG退出JVM之前。

    IMethodInterceptor

    这个监听器可以用于修改TestNG要运行的测试方法的列表。我们看它定义的方法:

    方法名:intercept

    入参:List<IMethodInstance> methods, ITestContext context

    返回:List<IMethodInstance>

    此监听器作用于TestNG调用测试方法之前,只对那些没有被依赖或依赖其他测试方法的方法才有效。从intercept方法的入参可以看到我们传入原始的测试方法列表,得到一个新的测试方法列表,而TestNG实际运行的就是这个新的测试方法列表,它会按照新列表顺序运行测试用例。

    至于入参中的ITestContext 参数,则用于实现自定义用户值(IAttributes.setAttribute(String, Object)),该值可以在稍后产生测试报告时使用。

    IInvokedMethodListener/IInvokedMethodListener2

    在TestNG的执行过程中,通过此监听器,可以在调用某个测试方法之前或者之后进行操作。

    1.@Test方法

    2.Configuration方法,即@Before方法和@After方法

    它还有一个子接口:IInvokedMethodListener2,会多一个参数ITestContext,可以操作测试上下文。

    IHookable

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

    IConfigurable

    这个接口和IHookable的使用非常相似,不过它是针对配置方法的,这个接口通过在run方法中调用IConfigureCallBack参数的runConfigurationMethod方法(callBack方法已过时)来执行原来的配置方法。

    IConfigurationListener/IConfigurationListener2

    这是关联配置方法的一些监听事件。

    IConfigurationListener:当配置方法成功,失败,跳过时执行

    IConfigurationListener2:是IConfigurationListener的子接口,多了一个方法,beforeConfiguration(ITestResult tr)。

    IResultListener/ IResultListener2

    这两个接口,没有新定义的方法,都是继承的父接口的方法。

    监听器使用

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

    @Listeners注解

    注意:这个注解可以包含任何实现了org.testng.ITestNGListener的类,但除了IAnnotationTransformer和IAnnotationTransformer2,因为,这类监听器TestNG必须在处理过程的早期就知晓,这样才可以用他们重写用户注解,所以你必须在xml文件中指明这类监听器。

    Xml中使用listener标签

    使用命令行运行

    现在我们一般都是直接在开发工具中运行了,使用命令行运行基本没有,所以实践的时候才发现,还是需要处理下classpath的。

    java -classpath "%classpath%;pathto\target\test-classes;pathto\target\classes;pathto\testng-6.14.3.jar;pathto\jcommander-1.72.jar" org.testng.TestNG -listener com.i.LogListener pathto\test.xml

    像上面这样,是直接在命令行指定classpath,当然也可以设置在环境变量中。

    以上设置可以处理报错:

    1.Exception in thread "main" java.lang.NoClassDefFoundError: com/beust/jcommander/

    ParameterException

    2.Listener com.i.LogListener was not found in project's classpath

    使用ServiceLoader

    1.ServiceLoader是什么?

    Java提供了一个类:java.util.ServiceLoader,这是一个简单的服务提供者加载设施。服务是一系列接口和类(抽象类)的集合,服务提供者是一个服务的特定实现,一般指的是接口的实现类,服务类的子类。当我们放置了服务提供者配置文件后,在遇到ServiceLoader.load(接口.class)方法时,会到配置文件中寻找这个接口对应的实现类,然后使用Class.forName()(传入设定的类加载器)完成类的加载。

    而TestNG在TestNG.java类的初始化时,就调用了方法addServiceLoaderListeners()来加载监听器。

    2.配置文件

    我们新建资源文件:org.testng.ITestNGListener,目录路径如下:

    文件内容为我们自定义的监听器实现类,有多个可以多行写入:

    此时,运行本工程测试目录下的testcase时,监听器已经生效了,无论是java代码还是xml执行。

    3.Maven打包jar

    那么我们的监听器多数写完之后是给别的工程用的,所以通过maven打成jar包,maven提供package命令打包,打包后的包在target目录下。

    mvn package

    4.其他工程导入使用

    新建一个新的maven工程,然后增加这个新包的依赖。

    此时运行你的testcase,监听器已经生效了,无论是java代码还是xml执行。

    当然,你也可以不导入包,而是通过命令行classpath指定:

    java -classpath "%classpath%;pathto\target\test-classes;pathto\target\classes;pathto\testng-6.14.3.jar;pathto\jcommander-1.72.jar;pathto\test-1.0-SNAPSHOT.jar" org.testng.TestNG pathto\test.xml

    相关文章

      网友评论

          本文标题:TestNG实践——1.监听器介绍和使用方式

          本文链接:https://www.haomeiwen.com/subject/qjzfahtx.html