TestNG實(shí)踐——1.監(jiān)聽(tīng)器介紹和使用方式

監(jiān)聽(tīng)器總覽

從圖中可以看出org.testng.ITestNGLister這個(gè)接口類是所有監(jiān)聽(tīng)器的父接口,而他的子接口如圖所示,從圖中,我們還能看到所有的實(shí)現(xiàn)類。當(dāng)我們要自定義監(jiān)聽(tīng)器時(shí),其實(shí)就是去實(shí)現(xiàn)這些預(yù)定義的接口類。

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

現(xiàn)在我們根據(jù)上面這些接口類,進(jìn)行一下功能分類說(shuō)明。

IAlterSuiteListener

這個(gè)接口使我們可以訪問(wèn)到XmlSuite對(duì)象,這樣我們可以基于自己的需求修改suite或者test。

該監(jiān)聽(tīng)器只可以通過(guò)listeners標(biāo)簽在suite文件中添加,或者是通過(guò)service loaders使用。不可以通過(guò)@Listeners注解。

IAnnotationTransformer

有3個(gè)這種類型的接口:IAnnotationTransformer, IAnnotationTransformer2, IAnnotationTransformer3,分別對(duì)應(yīng)不同的注解。

IAnnotationTransformer,操作@Test標(biāo)注

IAnnotationTransformer2,操作@Configuration標(biāo)注、@DataProvider標(biāo)注和@Factory標(biāo)注

IAnnotationTransformer3,操作@Listeners標(biāo)注

IClassListener/ISuiteListener/ITestListener

IClassListener:通過(guò)onBeforeClass和onAfterClass兩個(gè)方法,對(duì)ITestClass對(duì)象操作。

ISuiteListener:通過(guò)onStart和onFinish兩個(gè)方法,對(duì)ISuite對(duì)象操作。

ITestListener:通過(guò)onStart和onFinish兩個(gè)方法,對(duì)ITestContext測(cè)試用例的上下文操作;通過(guò)onTestFailedButWithinSuccessPercentage, onTestFailure,onTestSkipped,onTestStart,onTestSuccess方法,對(duì)ITestResult測(cè)試結(jié)果操作。

IDataProviderListener

這個(gè)監(jiān)聽(tīng)器是在TestNG調(diào)用數(shù)據(jù)驅(qū)動(dòng)的前后被調(diào)用的。

IReporter

這個(gè)接口可以用來(lái)自定義產(chǎn)生測(cè)試報(bào)告,它只有一個(gè)方法,generateReport,當(dāng)所有的suite都運(yùn)行完成后,調(diào)用這個(gè)方法,就可以產(chǎn)生測(cè)試報(bào)告了,該方法參數(shù)包含運(yùn)行期間產(chǎn)生的所有測(cè)試結(jié)果對(duì)象,List xmlSuites, List suites, String outputDirectory。

IExecutionListener

用于監(jiān)聽(tīng)TestNG執(zhí)行的開(kāi)始和結(jié)束,開(kāi)始于TestNG處理任何監(jiān)聽(tīng)器之前,結(jié)束于測(cè)試報(bào)告產(chǎn)生后TestNG退出JVM之前。

IMethodInterceptor

這個(gè)監(jiān)聽(tīng)器可以用于修改TestNG要運(yùn)行的測(cè)試方法的列表。我們看它定義的方法:

方法名:intercept

入?yún)ⅲ篖ist<IMethodInstance> methods, ITestContext context

返回:List<IMethodInstance>

此監(jiān)聽(tīng)器作用于TestNG調(diào)用測(cè)試方法之前,只對(duì)那些沒(méi)有被依賴或依賴其他測(cè)試方法的方法才有效。從intercept方法的入?yún)⒖梢钥吹轿覀儌魅朐嫉臏y(cè)試方法列表,得到一個(gè)新的測(cè)試方法列表,而TestNG實(shí)際運(yùn)行的就是這個(gè)新的測(cè)試方法列表,它會(huì)按照新列表順序運(yùn)行測(cè)試用例。

至于入?yún)⒅械腎TestContext 參數(shù),則用于實(shí)現(xiàn)自定義用戶值(IAttributes.setAttribute(String, Object)),該值可以在稍后產(chǎn)生測(cè)試報(bào)告時(shí)使用。

IInvokedMethodListener/IInvokedMethodListener2

在TestNG的執(zhí)行過(guò)程中,通過(guò)此監(jiān)聽(tīng)器,可以在調(diào)用某個(gè)測(cè)試方法之前或者之后進(jìn)行操作。

1.@Test方法

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

它還有一個(gè)子接口:IInvokedMethodListener2,會(huì)多一個(gè)參數(shù)ITestContext,可以操作測(cè)試上下文。

IHookable

這個(gè)接口定義了一個(gè)方法:run(IHookCallBack callBack, ITestResult testResult) ,如果一個(gè)類實(shí)現(xiàn)了這個(gè)接口,那么run方法會(huì)代替被發(fā)現(xiàn)的每個(gè)@Test方法調(diào)用運(yùn)行。而我們可以通過(guò)IHookCallBack 參數(shù)的callBack()方法在run方法中調(diào)用執(zhí)行@Test方法。這個(gè)接口可以用于用例鑒權(quán)認(rèn)證等需求。

IConfigurable

這個(gè)接口和IHookable的使用非常相似,不過(guò)它是針對(duì)配置方法的,這個(gè)接口通過(guò)在run方法中調(diào)用IConfigureCallBack參數(shù)的runConfigurationMethod方法(callBack方法已過(guò)時(shí))來(lái)執(zhí)行原來(lái)的配置方法。

IConfigurationListener/IConfigurationListener2

這是關(guān)聯(lián)配置方法的一些監(jiān)聽(tīng)事件。

IConfigurationListener:當(dāng)配置方法成功,失敗,跳過(guò)時(shí)執(zhí)行

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

IResultListener/ IResultListener2

這兩個(gè)接口,沒(méi)有新定義的方法,都是繼承的父接口的方法。

監(jiān)聽(tīng)器使用

監(jiān)聽(tīng)器的使用,有好幾種方式,下面會(huì)分別介紹,需要注意的是,有些監(jiān)聽(tīng)器只可以在某種方式下生效。

@Listeners注解

注意:這個(gè)注解可以包含任何實(shí)現(xiàn)了org.testng.ITestNGListener的類,但除了IAnnotationTransformer和IAnnotationTransformer2,因?yàn)?,這類監(jiān)聽(tīng)器TestNG必須在處理過(guò)程的早期就知曉,這樣才可以用他們重寫用戶注解,所以你必須在xml文件中指明這類監(jiān)聽(tīng)器。

Xml中使用listener標(biāo)簽

使用命令行運(yùn)行

現(xiàn)在我們一般都是直接在開(kāi)發(fā)工具中運(yùn)行了,使用命令行運(yùn)行基本沒(méi)有,所以實(shí)踐的時(shí)候才發(fā)現(xiàn),還是需要處理下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,當(dāng)然也可以設(shè)置在環(huán)境變量中。

以上設(shè)置可以處理報(bào)錯(cuò):

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提供了一個(gè)類:java.util.ServiceLoader,這是一個(gè)簡(jiǎn)單的服務(wù)提供者加載設(shè)施。服務(wù)是一系列接口和類(抽象類)的集合,服務(wù)提供者是一個(gè)服務(wù)的特定實(shí)現(xiàn),一般指的是接口的實(shí)現(xiàn)類,服務(wù)類的子類。當(dāng)我們放置了服務(wù)提供者配置文件后,在遇到ServiceLoader.load(接口.class)方法時(shí),會(huì)到配置文件中尋找這個(gè)接口對(duì)應(yīng)的實(shí)現(xiàn)類,然后使用Class.forName()(傳入設(shè)定的類加載器)完成類的加載。

而TestNG在TestNG.java類的初始化時(shí),就調(diào)用了方法addServiceLoaderListeners()來(lái)加載監(jiān)聽(tīng)器。

2.配置文件

我們新建資源文件:org.testng.ITestNGListener,目錄路徑如下:

文件內(nèi)容為我們自定義的監(jiān)聽(tīng)器實(shí)現(xiàn)類,有多個(gè)可以多行寫入:

此時(shí),運(yùn)行本工程測(cè)試目錄下的testcase時(shí),監(jiān)聽(tīng)器已經(jīng)生效了,無(wú)論是java代碼還是xml執(zhí)行。

3.Maven打包jar

那么我們的監(jiān)聽(tīng)器多數(shù)寫完之后是給別的工程用的,所以通過(guò)maven打成jar包,maven提供package命令打包,打包后的包在target目錄下。

mvn package

4.其他工程導(dǎo)入使用

新建一個(gè)新的maven工程,然后增加這個(gè)新包的依賴。

此時(shí)運(yùn)行你的testcase,監(jiān)聽(tīng)器已經(jīng)生效了,無(wú)論是java代碼還是xml執(zhí)行。

當(dāng)然,你也可以不導(dǎo)入包,而是通過(guò)命令行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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容