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

监听器总览

从图中可以看出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 methods, ITestContext context

返回:List

此监听器作用于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.监听器介绍和使用方式)