前言
一,為什么要用監(jiān)聽器???
Testng雖然提供了不少?gòu)?qiáng)大的功能和靈活的選項(xiàng),但不能解決所有的問題,而監(jiān)聽器就是用來(lái)定制額外的功能以滿足我們的需求的;
二,監(jiān)聽器的實(shí)際是什么???
監(jiān)聽器實(shí)際上是一些預(yù)定義的java接口,用戶創(chuàng)建這些接口的實(shí)現(xiàn)類(即implements某監(jiān)聽接口,并實(shí)現(xiàn)里面的方法),并加入到testng中,testng便會(huì)在運(yùn)行的不同時(shí)刻調(diào)用這些類中你自定義實(shí)現(xiàn)的接口方法,從而實(shí)現(xiàn)定制額外的功能;
監(jiān)聽器種類:
? IAnnotationTransformer(修改@Test注釋屬性)
只能用來(lái)修改 @Test注解的注釋屬性
void transform(ITest annotation, Class testClass, Constructor testConstructor, Method testMethod);
annotation 代表就是為 testMethod 定義的 @Test 注釋。調(diào)用其方法可以更改 @Test 注釋屬性。例如:annotation.setEnabled(false);便會(huì)在運(yùn)行時(shí)將屬性 enabled 改為 false 從而禁用了當(dāng)前的測(cè)試方法。
? IAnnotationTransformer2(修改其他注解的注釋屬性)
*用來(lái)修改除 @Test 以外的 TestNG 的注釋,例如:@DataProvider 以及 @Factory 等注解的注釋屬性能夠通過(guò)該監(jiān)聽器修改;
void transform(IDataProviderAnnotation annotation, java.lang.reflect.Method method)
void transform(IFactoryAnnotation annotation, java.lang.reflect.Method method)
? IHookable(類似與面向方面編程(AOP)中的 Around Advice 的功能)
*用來(lái)在測(cè)試方法執(zhí)行前后提供了切入點(diǎn),從而使用戶能夠在測(cè)試方法運(yùn)行前后注入特定的功能
void run(IHookCallBack callBack, ITestResult testResult)
? IInvokedMethodListener(類似與面向方面編程(AOP)中的 Before Advice 和 After Advice 的功能)
*在當(dāng)前測(cè)試方法被執(zhí)行前和執(zhí)行后注入特定的邏輯
void afterInvocation(IInvokedMethod method, ITestResult testResult)
void beforeInvocation(IInvokedMethod method, ITestResult testResult)
常用來(lái)加入日志
? ImethodInterceptor(控制列表執(zhí)行循序)
TestNG 啟動(dòng)之后,所有的測(cè)試方法分成兩類:
一類是順序運(yùn)行的測(cè)試方法;(dependsOnGroups 和 dependsOnMethods)
一類是沒有特定運(yùn)行順序的測(cè)試方法。(運(yùn)行順序是隨機(jī),每次運(yùn)行的順序都可能不同)
IMethodInterceptor 監(jiān)聽器用來(lái)對(duì)第二類測(cè)試有更大的控制權(quán),對(duì)列表重新排序,甚至增加或者減少測(cè)試方法;
java.util.List<IMethodInstance> intercept(java.util.List<IMethodInstance> methods, ITestContext context)
實(shí)現(xiàn)的intercept 方法會(huì)在所有測(cè)試方法被分類后以及所有測(cè)試方法被執(zhí)行前被調(diào)用。所有的測(cè)試方法將按照 intercept 返回值列表中的順序被執(zhí)行。
? IReporter(自定義測(cè)試報(bào)表)
IReporter 監(jiān)聽器用來(lái)自定義測(cè)試報(bào)表;
void generateReport(java.util.List<XmlSuite> xmlSuites, java.util.List<ISuite> suites, java.lang.String outputDirectory)
generateReport方法會(huì)在所有測(cè)試方法執(zhí)行結(jié)束后被調(diào)用,通過(guò)遍歷 xmlSuites 和 suites 能夠獲取所有測(cè)試方法的信息以及測(cè)試結(jié)果。outputDirectory 是默認(rèn)的測(cè)試報(bào)表生成路徑,當(dāng)然你可以指定其他路徑生成報(bào)表
? ISuiteListener(suite的AOP)
ISuiteListener 使用戶有機(jī)會(huì)在測(cè)試套件開始執(zhí)行以及執(zhí)行結(jié)束之后嵌入自己的邏輯;
類似,但區(qū)別IInvokedMethodListener 針對(duì)的是測(cè)試方法,而 ISuiteListener 針對(duì)的是測(cè)試套件
void onFinish(ISuite suite)
void onStart(ISuite suite)
? ITestListener(簡(jiǎn)便自定義測(cè)試方法執(zhí)行后的后續(xù)行為)
用來(lái)在測(cè)試方法執(zhí)行成功、失敗或者跳過(guò)時(shí)指定不同后續(xù)行為;
IInvokedMethodListener 也可以實(shí)現(xiàn),但I(xiàn)TestListener更簡(jiǎn)便;
void onTestFailure(ITestResult result)
void onTestSkipped(ITestResult result)
void onTestSuccess(ITestResult result)
另外:TestListenerAdapter 已經(jīng)實(shí)現(xiàn) ITestListener,并且提供了一些有用的方法,比如分別獲取所有成功失敗跳過(guò)三種測(cè)試結(jié)果的測(cè)試方法的方法,并且 ITestListner 中有很多方法而 TestListenerAdapter 已給出了默認(rèn)實(shí)現(xiàn)。因此,繼承 TestListenerAdapter 后,便只需關(guān)注需要修改的方法。
監(jiān)聽器使用方法:
一,在 testng.xml 中使用 TestNG 監(jiān)聽器
<listeners>
<listener class-name="api.listeners.AutoTestListener"></listener>
<listener class-name="api.listeners.RetryListener"></listener>
<listener class-name="api.listeners.ExtentTestNGIReporterListener"/>
</listeners>
二,在源代碼中使用 TestNG 監(jiān)聽器
通過(guò) @Listeners 注釋,可以直接在 Java 源代碼中添加 TestNG 監(jiān)聽器
@Listeners(RetryListener.class)
public class SampleTest {
@Test()
public void test1() {
sleep(6000);
System.out.println("test1");
}
*注意:
1,在 @Listeners 中添加監(jiān)聽器跟在 testng.xml 添加監(jiān)聽器一樣,將被應(yīng)用到整個(gè)測(cè)試套件中的測(cè)試方法。如果需要控制監(jiān)聽器的應(yīng)用范圍(比如添加的監(jiān)聽器僅使用于某些測(cè)試測(cè)試類或者某些測(cè)試方法),則必須在監(jiān)聽器類中編寫適當(dāng)?shù)呐袛噙壿嫛?br>
2,在 @Listeners 中添加監(jiān)聽器跟在 testng.xml 添加監(jiān)聽器的不同之處在于,它不能添加 IAnnotationTransformer 和 IAnnotationTransformer2 監(jiān)聽器。原因是因?yàn)檫@兩種監(jiān)聽器必須在更早的階段添加到 TestNG 中才能實(shí)施修改注釋的操作,所以它們只能在 testng.xml 添加。
3,TestNG 對(duì)添加的監(jiān)聽器不做去重判斷。因此,如果 testng.xml 和源代碼中添加了相同的監(jiān)聽器,該監(jiān)聽器的方法會(huì)被調(diào)用兩次。有關(guān)這一點(diǎn),大家可以通過(guò)運(yùn)行本文附帶的示例代碼包中 testng.xml 驗(yàn)證。因此,切記,不要通過(guò)多種方式重復(fù)添加監(jiān)聽器。
三,通過(guò) ServiceLoader 使用 TestNG 監(jiān)聽器
創(chuàng)建一個(gè) jar 文件,里面包含 TestNG 監(jiān)聽器的實(shí)現(xiàn)類以及 ServiceLoader 需要的配置信息,并在運(yùn)行 TestNG 時(shí)把該 jar 文件加載到類路徑中。具體步驟請(qǐng)查閱 TestNG 官方文檔
四,通過(guò)命令行使用 TestNG 監(jiān)聽器
java org.testng.TestNG -listener MyListener testng1.xml [testng2.xml testng3.xml ...]
摘自:TestNG 官方文檔,實(shí)戰(zhàn) TestNG 監(jiān)聽器
以上~對(duì)你有幫助的話,點(diǎn)個(gè)喜歡??吧~~