实战 TestNG 监听器

发表于:2018-7-06 10:01

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:duanxz    来源:博客园

  值得注意的是:
  在 @Listeners 中添加监听器跟在 testng.xml 添加监听器一样,将被应用到整个测试套件中的测试方法。如果需要控制监听器的应用范围(比如添加的监听器仅使用于某些测试测试类或者某些测试方法),则必须在监听器类中编写适当的判断逻辑。
  在 @Listeners 中添加监听器跟在 testng.xml 添加监听器的不同之处在于,它不能添加 IAnnotationTransformer 和 IAnnotationTransformer2 监听器。原因是因为这两种监听器必须在更早的阶段添加到 TestNG 中才能实施修改注释的操作,所以它们只能在 testng.xml 添加。
  TestNG 对添加的监听器不做去重判断。因此,如果 testng.xml 和源代码中添加了相同的监听器,该监听器的方法会被调用两次。有关这一点,大家可以通过运行本文附带的示例代码包中 testng.xml 验证。因此,切记,不要通过多种方式重复添加监听器。
  通过 ServiceLoader 使用 TestNG 监听器
  Java SE 6 开始提供了 ServiceLoader。它可以帮助用户查找、加载和使用服务提供程序,从而在无需修改原有代码的情况下轻易地扩展目标应用程序。通过 ServiceLoader 的方式使用 TestNG 监听器,简单来说,就是创建一个 jar 文件,里面包含 TestNG 监听器的实现类已经 ServiceLoader 需要的配置信息,并在运行 TestNG 时把该 jar 文件加载到类路径中。具体步骤请查阅 TestNG 官方文档。这样做的好处是:
  可以轻松地与其他人分享 TestNG 监听器。
  当有很多 testng.xml 文件时,不需要重复把监听器添加到每个文件中。
  通过命令行使用 TestNG 监听器
  通过命令行使用 TestNG 监听器,需要在命令行中加入”-listener”参数。如要指定多个监听器,用逗号分隔。下面是一个调用的示例。
  java org.testng.TestNG -listener MyListener testng1.xml [testng2.xml testng3.xml ...]
  通过 IDE 使用 TestNG 监听器
  TestNG 在多种 IDE 中都有插件支持,比如 Eclipse 和 IDEA。
  如,eclipse中的eclipse marketplace中搜索testNG
   
  因为最终 IDE 也是以命令行的方式调用 TestNG,因此在 IDE 中也是通过添加“-listener”参数使用 TestNG 监听器。下图以 Eclipse 为例示范了 TestNG 监听器的配置方法。
  图 . Eclipse 中 TestNG 监听器的配置
   
  除此之外,ANT 跟 Maven 也都有相应 Task 和插件运行 TestNG 测试,按照相应的文档配置监听器即可,这里便不一一赘述。
  示例
  本文提供了两个示范的监听器的实现,它们分别实现了动态测试方法过滤和测试进度跟踪功能。
  动态测试方法过滤监听器(listeners.OSFilter)
  TestNG 提供了分组特性,但它的局限是组名必须是静态的。假如,现在有一些测试方法,部分适用于 Linux 和 Windows,部分仅适用于其一。通过默认的 TestNG 分组特性,大概要定义两个 testng.xml 文件,指定不同的组名,并且在指定测试应用时要小心不要把配置与环境的对应弄错。
  示例代码中的监听器采用的方法是在每个测试方法执行前,动态获取操作系统类型信息并将其与 @Test 注释中定义的操作系统比较以决定哪些测试方法应该运行。这样便省却了上述配置的麻烦。
  如果仅仅为了跳过不合适的测试方法,也可以选用 IInvokedMethodListener 监听器。但因为该监听器还要统计所有传入的测试方法以及被忽略的测试方法的数目,所以选用了 IMethodInterceptor。值得注意的是,在 TestNG 的生命周期中,IMethodInterceptor 监听器的 intercept 方法事实上会被调用两次。为了避免代码被重复执行,本示例代码将返回的测试方法列表定义为成员变量,并通过判断该成员变量是否为 null 决定是否执行过滤逻辑。
  测试进度跟踪监听器(listeners.ProgressTracker)
  自动化单元测试和 API 测试通常运行比较快,但是 UI 测试运行较慢。对于长时间运行的测试,我们常常想要知道当前正在运行的测试方法名称以及预计剩余执行时间。这便是该监听器实现的功能。
  由于需要通过统计每个测试方法的运行时间来预估剩余执行时间,该监听器选用了 IInvokedMethodListener。另外,预估剩余执行时间还需要知道整个测试套件要执行的测试方法的数目,单单使用 IInvokedMethodListener 无法得到该信息,因此,该监听器通过 listeners.OSFilter 计算全部要执行的测试方法的数目。预估的算法是根据已经使用的时间和执行的测试方法数量计算出每个测试方法的平均执行时间,然后用该平均时间乘以未执行的测试方法数目,从而得出预估剩余时间。该算法的问题在于,当每个测试方法执行时间差异较大并且测试方法数目较少时,该方法春在较大的误差,因此该时间只能作为参考。
  如何运行示例代码
  示例代码是一个 Eclipse 项目导出的压缩文件,因此只要在 Eclipse 中导入该文件并安装 TestNG 的 Eclipse 插件即可运行。
  tests.SampleTest 是一个示范的 TestNG 测试类,该类中定义了 5 个测试方法:一个指定为仅运行在 Linux,两个指定为运行在 Linux 和 Windows,另外两个指定为仅运行在 Windows。为简单期间,测试方法体仅用 Thread.sleep()模拟。该类中已添加了 @Listeners 注释,将该类作为 TestNG 测试运行,将得到如下的正常输出(此为 Linux 下的输出结果)。
  [TestNG] Running:
  /tmp/testng-eclipse-814456884/testng-customsuite.xml
  Ignored Test Methods: [test4(tests.SampleTest), test5(tests.SampleTest)]
  [Begin] test1(SampleTest)
  >>>test1
  [Progress]33% (1/3) , Elapsed:00:00:05, Estimated Time Remaining:00:00:10
  [End] test1(SampleTest): Passed
  [Begin] test2(SampleTest)
  >>>test2
  [Progress]67% (2/3) , Elapsed:00:00:08, Estimated Time Remaining:00:00:04
  [End] test2(SampleTest): Passed
  [Begin] test3(SampleTest)
  >>>test3
  [Progress]100% (3/3) , Elapsed:00:00:10, Estimated Time Remaining:00:00:00
  [End] test3(SampleTest): Passed
  PASSED: test1
  PASSED: test2
  PASSED: test3
  ===============================================
  Default test
  Tests run: 3, Failures: 0, Skips: 0
  ===============================================
  ===============================================
  Default suite
  Total tests run: 3, Failures: 0, Skips: 0
  ===============================================
  [TestNG] Time taken by org.testng.reporters.JUnitReportReporter@5a31442c: 12 ms
  [TestNG] Time taken by org.testng.reporters.EmailableReporter@64a0401: 5 ms
  [TestNG] Time taken by org.testng.reporters.XMLReporter@a98e9456: 20 ms
  [TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@276fc2ae: 77 ms
  [TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 1 ms
  [TestNG] Time taken by org.testng.reporters.jq.Main@6517ab3c: 63 ms
  示例代码包中还包含有一个 testng.xml 文件。testng.xml 中也添加了监听器,因此运行 testng.xml 将看到重复的测试进度信息输出。需删除 tests.SampleTest 中 @Listeners 注释才能使 testng.xml 正常运行测试。
  结束语
  通过本文的介绍,大家可以了解到,TestNG 提供的多种监听器接口使 TestNG 具备强大的扩展性。选用什么监听器接口需根据实际需求而定。在动手开发自己的 TestNG 监听器之前,不妨先搜索一下互联网,兴许其他用户已经开发了类似的功能。例如,ReportNG 就是一款较为成熟的用于增强 TestNG 报表功能的插件。

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号