监听器总览
、从图中可以看出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
网友评论