摘要:前言监听,捕捉的行为,并支持修改,用于定制化,如日志输出自定义报告监听器如下,只支持注解转换,支持,,等注解转换,比第一代更全面,替代测试方法,并提供回调函数,常用于权限校验,监听形为,代增加上下文参数,拦截器,调整测试方法的执行顺序,执行
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
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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...
阅读 3982·2021-11-23 10:09
阅读 1345·2021-11-23 09:51
阅读 2944·2021-11-23 09:51
阅读 1591·2021-09-07 09:59
阅读 2358·2019-08-30 15:55
阅读 2303·2019-08-30 15:55
阅读 2953·2019-08-30 15:52
阅读 2566·2019-08-26 17:04