51Testing软件测试论坛

标题: testng之listener [打印本页]

作者: 天天酷派哦    时间: 2018-4-10 15:25
标题: testng之listener
这周在给人培训selenium+testng框架时,讲到listener这块发现对listener并没有完全了解,于是自己又重新学习了下。

以下是 TestNG 提供的几种监听器:

  1. IAnnotationTransformer
  2. IAnnotationTransformer2
  3. IHookable
  4. IInvokedMethodListener
  5. IMethodInterceptor
  6. IReporter
  7. ISuiteListener
  8. ITestListener
复制代码

尽管名字叫监听器,但事实上它们只是一些预定义的 Java 接口。用户创建这些接口的实现类,并把它们加入
到 TestNG 中,TestNG 便会在测试运行的不同时刻调用这些类中的接口方法。 

目前的框架主要用到IReporter 和 ITestLisntener。

IReporter

TestNG 提供了默认的测试报表。但如果用户希望有不同格式的测试报表,就需要使用 IReporter 监听器。
IReporter 监听器只有一个方法需要实现。

ITestListener

如果要在测试方法执行成功、失败或者跳过时指定不同后续行为,可以通过 IInvokedMethodListener 实现,
不过更为简便的方式是利用 ITestListener 监听器。ITestListener 监听器要求实现的方法中包含如下三个

  1. void onTestFailure(ITestResult result)
  2. void onTestSkipped(ITestResult result)
  3. void onTestSuccess(ITestResult result)

  4. 然后在testsuite.xml里加上listeners标签:
  5. 复制代码
  6. <?xml version="1.0" encoding="UTF-8"?>
  7. <suite name="Simple Suite">
  8.   <listeners>
  9.     <listener class-name="Listener-name" />
  10.   </listeners>

  11.   <test name="Simple test">
  12.     <classes>
  13.       <class name="SampleTest" />
  14.     </classes>
  15.   </test>
  16. </suite>
复制代码

复制代码
同时需要在脚本的类定义前面加上@listener标签。

这里如果Listener-name是个实现了IReporter的方法,那么他就会在最后按具体实现生产report.

而如果他是个实现了ITestLisntener的方法,那么其实在测试脚本里,他能根据执行的成功或失败或跳过,自
动的给出执行的结果,如下列:

复制代码
  1. import org.testng.Assert;
  2. import org.testng.annotations.Test;

  3. public class SampleTest {
  4.     @Test
  5.     public void testMethodOne(){
  6.         Assert.assertTrue(true);
  7.     }
  8.       
  9.     @Test
  10.     public void testMethodTwo(){
  11.       Assert.assertTrue(false);
  12.     }
  13.       
  14.     @Test(dependsOnMethods={"testMethodTwo"})
  15.     public void testMethodThree(){
  16.         Assert.assertTrue(true);
  17.     }
  18. }
复制代码

复制代码
这里有3个测试方法,每个里面有断言,但这里并没有对结果进行输出。

复制代码
  1. import org.testng.ITestResult;
  2. import org.testng.TestListenerAdapter;

  3. public class myListener extends TestListenerAdapter{
  4.     private int m_count = 0;
  5.      
  6.     @Override
  7.     public void onTestFailure(ITestResult tr) {
  8.         log(tr.getName()+ "--Test method failed\n");
  9.     }
  10.      
  11.     @Override
  12.     public void onTestSkipped(ITestResult tr) {
  13.         log(tr.getName()+ "--Test method skipped\n");
  14.     }
  15.      
  16.     @Override
  17.     public void onTestSuccess(ITestResult tr) {
  18.         log(tr.getName()+ "--Test method success\n");
  19.     }
  20.      
  21.     private void log(String string) {
  22.         System.out.print(string);
  23.         if (++m_count % 40 == 0) {
  24.         System.out.println("");
  25.         }
  26.     }

  27. }
复制代码

复制代码
这是实现了ITestListener的类,同样利用前面那个testsuite.xml。把listener-name修改成myListener,执行后得
到如下结果:

复制代码
  1. testMethodOne--Test method success
  2. testMethodTwo--Test method failed
  3. testMethodThree--Test method skipped

  4. ===============================================
  5. Simple Logger Suite
  6. Total tests run: 3, Failures: 1, Skips: 1
  7. ===============================================
复制代码

复制代码
它的作用很明显了,就不用在测试脚本/方法里再去添加结果的记录代码了,当然你也可以根据项目需求加上
结果记录代码,然后决定到底用哪一种,这个就按需取舍了。






欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2