前言
監聽器實際上是一些預定義的java接口,用戶創建這些接口的實現類(即implements某監聽接口,並實現里面的方法),並加入到testng中,testng便會在運行的不同時刻調用這些類中你自定義實現的接口方法,從而實現定制額外的功能;
一、IHookable:TestNG在測試方法執行前執行,常用於授權檢查。
IHookable實現類
public class IHookableImp implements IHookable { @Override public void run(IHookCallBack iHookCallBack, ITestResult iTestResult) { ConstructorOrMethod method = iTestResult.getMethod().getConstructorOrMethod(); String name = method.getName(); System.out.println("測試method是 "+name); System.out.println("開始執行~"); //測試用例開始執行 iHookCallBack.runTestMethod(iTestResult); System.out.println("結束~"); } }
測試用例
@Listeners(IHookableImp.class) public class Test_case { @Test public void case1(){ System.out.println("case1方法"); } }
執行結果:
二、IINvokedmethodl:TestNG在調用方法前、后啟用該監聽器,常用於日志的采集。
IInvokedMethodListener實現類
public class IInvokedMethodListenerImp implements IInvokedMethodListener { //TestNG在調用方法前、后啟用該監聽器,常用於日志的采集。 @Override public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) { // TODO Auto-generated method stub //獲取執行的@Test方法 System.out.println(iTestResult.getName()); } @Override public void beforeInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) { // TODO Auto-generated method stub //獲取執行的@Test方法 System.out.println(iTestResult.getName()); } }
測試用例
@Listeners(IInvokedMethodListenerImp.class) public class Test_case { @Test public void case1(){ System.out.println("執行了case1測試方法"); } }
測試結果
三、IReporter:在測試方法執行后執行,通過遍歷 xmlSuites 和 suites 能夠獲取所有測試方法的信息以及測試結果,后續可用於自定義測試報告。
IReporter實現類
public class IReporterImp implements IReporter { //通過遍歷 xmlSuites 和 suites 能夠獲取所有測試方法的信息以及測試結果,后續可用於自定義測試報告。 @Override public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> iSuites, String outputDirectory) { for(ISuite iSuite:iSuites){ Map<String,ISuiteResult> iSuiteResultMap = iSuite.getResults(); //獲取所有執行的方法 System.out.println("所有執行的方法:"+iSuite.getAllInvokedMethods()); //獲取所有@Test標注的方法 System.out.println("獲取所有@Test標注的方法:"+iSuite.getAllMethods()); //獲取suite標簽的name屬性 System.out.println("suiteName:"+iSuite.getName()); //獲取測試報告的輸出路徑 System.out.println("輸出路徑:"+iSuite.getOutputDirectory()); System.out.println("報告路徑:"+outputDirectory); //獲取並發方式 System.out.println("並發方式:"+iSuite.getParallel()); for(ISuiteResult iSuiteResult:iSuiteResultMap.values()){ ITestContext iTestContext = iSuiteResult.getTestContext(); IResultMap iResultMap = iTestContext.getPassedTests(); Set<ITestResult> iTestResultset = iResultMap.getAllResults(); for(ITestResult iTestResult:iTestResultset){ //獲取執行的Test方法 System.out.println("測試方法:"+iTestResult.getName()); //獲取執行結果 System.out.println("執行結果(1-成功,2-失敗,3-skip):"+iTestResult.getStatus()); //獲取開始執行的時間 System.out.println("開始時間:"+iTestResult.getStartMillis()); //獲取結束執行的時間 System.out.println("結束時間:"+iTestResult.getEndMillis()); } } } } }
測試用例
@Listeners(IReporterImp.class) public class Test_case { @Test public void case1(){ System.out.println("執行了case1測試方法"); } }
運行結果
四、Testlisteneradapter:執行測試方法后執行,主要用於記錄log信息,根據執行結果的不同調用不同的方法。
實現類
public class TestListenerAdapterImp extends TestListenerAdapter { private int m_count = 0; @Override public void onTestFailure(ITestResult tr) { log(tr.getName()+ "--Test method failed\n"); } @Override public void onTestSkipped(ITestResult tr) { log(tr.getName()+ "--Test method skipped\n"); } @Override public void onTestSuccess(ITestResult tr) { log(tr.getName()+ "--Test method success\n"); } private void log(String string) { System.out.print(string); if (++m_count % 40 == 0) { System.out.println(""); } } }
測試方法
@Listeners(TestListenerAdapterImp.class) public class Test_case { @Test public void case1(){ System.out.println("執行了case1測試方法"); } }
運行結果
五、監聽的調用
可在測試類前添加@Listeners(監聽實現類名.class),也可在XML配置文件中通過listeners標簽進行監聽的添加。
<listeners>
<listener class-name="com.Monitor.IHookableImp"/>
</listeners>