摘要:前言監聽,捕捉的行為,并支持修改,用于定制化,如日志輸出自定義報告監聽器如下,只支持注解轉換,支持,,等注解轉換,比第一代更全面,替代測試方法,并提供回調函數,常用于權限校驗,監聽形為,代增加上下文參數,攔截器,調整測試方法的執行順序,執行
1 前言
監聽(Listeners),捕捉Testng的行為,并支持修改,用于定制化,如日志輸出、自定義報告
監聽器如下:
IAnnotationTransformer,只支持@Test注解轉換
IAnnotationTransformer2,支持@Test,@DataProvider,@Factory等注解轉換,比第一代更全面
IHookable,替代@Test測試方法,并提供回調函數,常用于權限校驗
IInvokedMethodListener/IInvokedMethodListener2,監聽before/after形為,2代增加上下文參數
IMethodInterceptor,攔截器,調整測試方法的執行順序
IReporter,suit執行完成后生成報告
ISuiteListener,測試套件執行監聽
ITestListener,測試方法執行監聽
2 IAnnotationTransformer實現IAnnotationTransformer的transform方法
參數含義:
ITestAnnotation,即@Test注解本身,可以修改它的各種屬性,如dataProvider,enabled,invocationCount等
Class,當@Test應用于class時,指向當前類;否則值為null
Constructor,同上,作用對象為構造器
Method,同上,作用對象為方法
需求:以2結尾的方法執行2次
public class MyTransformer implements IAnnotationTransformer { @Override public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) { if (method.getName().endsWith("2")) { iTestAnnotation.setInvocationCount(2); } } }
public class App { @Test public void test_1() { System.out.println("Just run once"); } @Test public void test_2() { System.out.println("Run twice"); } } --------------------------- Just run once Run twice Run twice
testng.xml配置
@Listeners不支持IAnnotationTransformer 和 IAnnotationTransformer2,所以只能在testng.xml上配置監聽器,當然命令行也可行3 IHookable
實現IHookable的run方法
調用IHookCallBack的runTestMethod方法,可以回調原測試方法
需求:只執行以2結尾的方法
public class MyHookable implements IHookable { @Override public void run(IHookCallBack callBack, ITestResult testResult) { if (testResult.getMethod().getMethodName().endsWith("2")) { callBack.runTestMethod(testResult); } } }
@Listeners({MyHookable.class}) public class App { @Test public void test_1() { System.out.println("Just run once"); } @Test public void test_2() { System.out.println("Run twice"); } } ----------------------------- Run twice4 IInvokedMethodListener
適用于configuration(suit, test, class),以及test
配合log4j,可以記錄詳細的執行過程
public class MyInvokedMethodListener implements IInvokedMethodListener { @Override public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { System.out.println("begin to run " + testResult.getName()); } @Override public void afterInvocation(IInvokedMethod method, ITestResult testResult) { System.out.println("end to run " + testResult.getName() + ", result code is " + testResult.getStatus()); } }
@Listeners({MyInvokedMethodListener.class}) public class App { @BeforeClass public void setup() { System.out.println("initial env"); } @Test public void test_1() { System.out.println("test 1"); Assert.assertTrue(true); } @Test public void test_2() { System.out.println("test 2"); Assert.assertTrue(false); } } --------------------- begin to run setup initial env end to run setup, result code is 1 begin to run test_1 test 1 end to run test_1, result code is 1 begin to run test_2 test 2 end to run test_2, result code is 2
4 IMethodInterceptor
需求:優先執行fast組成員方法
public class MyMethodInterceptor implements IMethodInterceptor { @Override public Listintercept(List methods, ITestContext context) { List result = new ArrayList<>(); methods.forEach(method -> { Test test = method.getMethod().getConstructorOrMethod().getMethod().getAnnotation(Test.class); Set groups = new HashSet<>(); Arrays.stream(test.groups()).forEach(group -> groups.add(group)); if (groups.contains("fast")) { result.add(0, method); } else { result.add(method); } }); return result; } }
public class App { @Test public void test_1() { System.out.println("first to run"); } @Test(groups = {"fast"}) public void test_2() { System.out.println("second to run"); } @Test void test_3() { System.out.println("third to run"); } } --------------------------------- second to run first to run third to run5 ISuiteListener
覆寫onStart 和 onFinish方法,分別對應suite開始階段和結束階段
6 ITestListener對應測試方法的7種狀態:
onStart,測試類實例化后執行
onFinish,測試類下的所有測試方法完成后執行
onTestStart,每次執行測試方法前執行
onTestSuccess,每次測試方法執行成功后執行
onTestFailure,每次測試方法執行失敗后執行
onTestSkipped,每次測試方法跳過時執行
onTestFailedButWithinSuccessPercentage,每次測試方法執行失敗,但正確率符合successPercentage要求
實現ITestListener接口,需要覆寫上述7種方法,比較麻煩
因此實際偏向于繼承TestListenerAdapter
7 IReporter獲取testng執行結果,與html模板結合可以定制測試報告
public class MyReporter implements IReporter { @Override public void generateReport(ListxmlSuites, List suites, String outputDirectory) { suites.forEach(suite -> { System.out.println("測試方法如下:"); suite.getAllMethods().forEach(iTestNGMethod -> System.out.println(" " + iTestNGMethod.getMethodName())); System.out.println("報告輸出路徑:" + suite.getOutputDirectory()); suite.getResults().values().forEach(iSuiteResult -> { ITestContext iTestContext = iSuiteResult.getTestContext(); Set passedTests = iTestContext.getPassedTests().getAllResults(); System.out.println("執行成功的方法:" + passedTests.size()); passedTests.forEach(iTestResult -> { System.out.println(" " + iTestResult.getName()); System.out.println(" 開始時間:" + iTestResult.getStartMillis()); System.out.println(" 結束時間:" + iTestResult.getEndMillis()); }); Set failedTests = iTestContext.getFailedTests().getAllResults(); System.out.println("執行失敗的方法:" + failedTests.size()); failedTests.forEach(iTestResult -> { System.out.println(" " + iTestResult.getName()); System.out.println(" 開始時間:" + iTestResult.getStartMillis()); System.out.println(" 結束時間:" + iTestResult.getEndMillis()); }); }); }); } }
@Listeners({MyReporter.class}) public class App { @Test public void test_1() { System.out.println("first to run"); } @Test public void test_2() { System.out.println("second to run"); } @Test public void test_3() { Assert.assertTrue(false); } } ------------------------ 測試方法如下: test_1 test_2 test_3 報告輸出路徑:E:codejavalab est-outputDefault Suite 執行成功的方法:2 test_2 開始時間:1541921094204 結束時間:1541921094204 test_1 開始時間:1541921094188 結束時間:1541921094188 執行失敗的方法:1 test_3 開始時間:1541921094204 結束時間:1541921094204
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72497.html
摘要:概述是由有贊開發的自動化工具,并以此實現了端和端的核心業務的自動化。旨在簡化開源工具提供的接口,方便自動化測試用例的設計。元素定位自動化用例其實可以分成兩部分,定位元素調用接口操作該元素。一臺用于跑自動化用例的服務器。 概述 Bee 是由有贊 QA 開發的 UI 自動化工具,并以此實現了 web 端和 wap 端的核心業務的自動化。旨在簡化開源工具提供的接口,方便 UI 自動化測試用例...
摘要:類似于特別是,但它不是框架的擴展相較于而言,功能更強大,使用起來更加方便,比較適合測試人員來進行集成測試或是接口回歸測試。自帶生成的測試報告不太美觀,可以使用進行美化。 TestNG是一個開源自動化測試框架,TestNG表示下一代(Next Generation的首字母)。 TestNG類似于JUnit(特別是JUnit 4),但它不是JUnit框架的擴展,相較于Junit而言,功能更...
摘要:執行順序,包含和兩種形式,剛好對應各階段的初始化和清理另外和可以定義不同的組合,比如指定某個功能模塊,或者以提測版本號將測試類方法分組 1 執行順序 suit -> class -> method,包含before和after兩種形式,剛好對應各階段的初始化(setup)和清理(teardown) 另外test 和 groups可以定義不同的組合,比如指定某個功能模塊(package)...
摘要:地址在使用工具中提到在測試代碼之間盡量做到配置共用。本章將列舉幾種共享測試配置的方法我們可以將測試配置放在一個里,然后在測試或中引用它。也可以利用的及自定義機制,提供自己的用在測試配置上。 Github地址 在使用Spring Boot Testing工具中提到: 在測試代碼之間盡量做到配置共用。...能夠有效利用Spring TestContext Framework的緩存機制,Ap...
閱讀 3969·2021-11-23 10:09
閱讀 1338·2021-11-23 09:51
閱讀 2939·2021-11-23 09:51
閱讀 1585·2021-09-07 09:59
閱讀 2354·2019-08-30 15:55
閱讀 2292·2019-08-30 15:55
閱讀 2949·2019-08-30 15:52
閱讀 2560·2019-08-26 17:04