• Testng监听器




               
                   
               

       
           
               
                   
                       
                   

               

           

       

    import com.welab.automation.framework.uils.PropertiesReader;
    import org.testng.ITestResult;
    import org.testng.util.RetryAnalyzerCount;

    public class TestRetryAnalyzer extends RetryAnalyzerCount {
      private static int count =1;
      public TestRetryAnalyzer() {
        super.setCount(count);
      }

      @Override
      public boolean retryMethod(ITestResult result) {
        return true;
      }

      public void reSetCount() {
        super.setCount(count);
      }
    }


    import com.welab.automation.framework.utils.entity.api.JsonEntity;
    import com.welab.automation.framework.utils.entity.api.TestCaseUtils;
    import org.testng.*;
    import org.testng.annotations.ITestAnnotation;

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;

    public class RetryListener extends TestListenerAdapter implements IAnnotationTransformer,IHookable {
      public void transform(
          ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
        IRetryAnalyzer iRetryAnalyzer = annotation.getRetryAnalyzer();
        if (iRetryAnalyzer == null) {
          annotation.setRetryAnalyzer(TestRetryAnalyzer.class);
        }
      }

      @Override
      public void onFinish(ITestContext testContext) {
        Iterator listOfSkippedTests =
            testContext.getSkippedTests().getAllResults().iterator();
        while (listOfSkippedTests.hasNext()) {
          ITestResult skippedTest = listOfSkippedTests.next();
          ITestNGMethod method = skippedTest.getMethod();
          if (testContext.getFailedTests().getResults(method).size() > 0
              || testContext.getPassedTests().getResults(method).size() > 0) {
            skippedTest.setStatus(0);
            listOfSkippedTests.remove();
          }
        }
      }

    //iHookable重写方法run

      @Override
      public void run(IHookCallBack iHookCallBack, ITestResult iTestResult) {
        JsonEntity jsonEntity = getJsonEntity(iTestResult);
        Map> sqlExpression = null;
        //replace parameter
        if (jsonEntity != null) {
          jsonEntity.setJsonObject(TestCaseUtils.replaceParameter(jsonEntity.getJsonObject()));
          jsonEntity.updateHeader();
        }
        //execute test case
        iHookCallBack.runTestMethod(iTestResult);
      }

      public JsonEntity getJsonEntity(ITestResult testResult) {
        JsonEntity jsonEntity = null;
        Object[] parameters = testResult.getParameters();

        if (parameters.length > 0) {
          for (Object parameter : parameters) {
            if (parameter instanceof JsonEntity) {
              jsonEntity = (JsonEntity) parameter;
            }
          }
        }
        return jsonEntity;
      }

      @Override
      public void onTestFailure(ITestResult result) {
        TestRetryAnalyzer testRetryAnalyzer = (TestRetryAnalyzer) result.getMethod().getRetryAnalyzer();
        testRetryAnalyzer.reSetCount();
      }
    }
     

    IHookable 监听器提供一种类似于AOP的方式,对测试method进行环绕编程。主要的应用场景:
    1. 动态重写测试method (替换测试方法为空运行)
    2. 动态决定是否跳过测试method (例如鉴权)
    3. 自定义注解,例如@ignore, 当检测到有这个注解的时候,跳过测试执行

    Testng IHookable 监听器_Viogs的博客-CSDN博客

  • 相关阅读:
    弹性蛋白酶的用途和化学性质
    Nginx监控模块vts
    Ubuntu:解决github出现 Permission denied (publickey)的问题
    angular 中混用vue解决方案
    Spring中是否可以存在两个相同ID的bean
    猿创征文| Unity之C#高级开发①
    计算机毕业设计django基于python的汽车租赁系统(源码+系统+mysql数据库+Lw文档)
    css案例14——文字渐变
    弹性盒子布局 Flexbox Layout
    Tomcat下载与安装
  • 原文地址:https://blog.csdn.net/qq_30273575/article/details/126135212