TestNG - 基本注解 - Listeners

  • 简述

    @Listeners 注解在测试类上定义侦听器。@Listeners 注释方法侦听某些事件并跟踪测试执行,同时在测试执行的每个阶段执行某些操作。事件可以是任何事情,例如测试方法成功、测试方法失败、测试方法开始等。
    以下是一些允许您修改 TestNG 行为的侦听器或接口:
    • IAnnotationTransformer
    • IAnnotationTransformer2
    • IHookable
    • IInvokedMethodListener
    • IMethodInterceptor
    • IReporter
    • ISuiteListener
    • ITestListener
    @Listeners 可以在类级别套件级别实现
    以下是@Listeners 注解支持的属性列表:
    属性 描述
    value
    扩展 org.testng.ITestNGListener 的类数组
  • 创建测试用例类

    让我们看看如何使用 TestNG 侦听器调用测试方法。
    • 创建一个 java 测试类,比如说, SimpleTestClass.java/work/testng/src.
    • 将测试方法 sum() 和 testtofail() 添加到您的测试类。
    • 向方法 sum() 和 testtofail() 添加注解@Test。
    以下是SimpleTestClass.java 的内容:
    
      import org.testng.Assert;
      import org.testng.annotations.Test;
      public class SimpleTestClass {
         @Test
         public void sum()
         {
              int sum=0;
              int a=15;
              int b=27;
              sum=a+b;
              System.out.println("sum="+sum);
         }
         @Test
         public void testtofail()
         {
              System.out.println("Test case has failed");
              Assert.assertTrue(false);
         }
      }
    
  • 创建监听器测试类

    创建另一个 Java 类,例如, TestListener.java/work/testng/src. 我们将实现ITestListener
    • ITestListener有以下方法
      • onTestStart- onTestStart 方法在任何测试开始时调用。
      • onTestSuccess- onTestSuccess 方法在任何测试成功时调用。
      • onTestFailure- onTestFailure 方法在任何测试失败时调用。
      • onTestSkipped- onTestSkipped 方法在跳过任何测试时调用。
      • onTestFailedButWithinSuccessPercentage- 方法在每次测试失败但在成功百分比内时调用。
      • onFinish-onFinish 方法在所有测试执行后调用。
    TestListener.java 如下:
    
      import org.testng.ITestContext;
      import org.testng.ITestListener;
      import org.testng.ITestResult;
      public class TestListener  implements ITestListener   {
         @Override
         public void onTestStart(ITestResult result) {
         }
         @Override
         public void onTestSuccess(ITestResult result) {
         System.out.println("Success of test cases and its details are : "+result.getName());
         }
         @Override
         public void onTestFailure(ITestResult result) {
         System.out.println("Failure of test cases and its details are : "+result.getName());
         }
         @Override
         public void onTestSkipped(ITestResult result) {
         System.out.println("Skip of test cases and its details are : "+result.getName());
         }
         @Override
         public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
         System.out.println("Failure of test cases and its details are : "+result.getName());
         }
         @Override
         public void onStart(ITestContext context) {
         // TODO Auto-generated method stub
         }
         @Override
         public void onFinish(ITestContext context) {
         // TODO Auto-generated method stub
         }
      }
    
  • 创建 testng.xml

    接下来,让我们在其中创建 testng.xml 文件 /work/testng/src, 执行测试用例。此文件以 XML 格式捕获您的整个测试。该文件使您可以轻松地在一个文件中描述所有测试套件及其参数,您可以将其签入代码存储库或通过电子邮件发送给同事。它还可以轻松提取测试的子集或拆分多个运行时配置(例如,testngdatabase.xml 将仅运行测试您的数据库的测试)。
    
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
      <suite name="Suite">
        <listeners>
          <listener class-name="TestListener"/>
        </listeners>
        <test thread-count="5" name="Test">
          <classes>
            <class name="SimpleTestClass"/>
          </classes>
        </test> <!-- Test -->
      </suite> <!-- Suite -->
    
    如您所见,我们需要在此 XML 文件中定义侦听器。
    使用 javac 编译测试用例。
    
    /work/testng/src$ javac SimpleTestClass.java TestListener.java
    
    现在,运行 testng.xml,它将运行 <test> 标记中定义的测试用例。
    
    /work/testng/src$ java org.testng.TestNG testng.xml
    
    验证输出。
    
      sum=42
      Success of test cases and its details are : sum
      Test case has failed
      Failure of test cases and its details are : testtofail
      ===============================================
      Suite
      Total tests run: 2, Passes: 1, Failures: 1, Skips: 0
      ===============================================