• WebDriver框架之自动运行失败的case


    大家在运行自动化case的时候都会碰到失败的情况,有的时候可能是被测程序有bug,还有就是网络的问题,如果想采取失败的case再运行一次的机制,那么有bug的情况,即使再运行N次还是失败,那么如果是网络的问题,那你再运行一次可能就会执行成功(因为再次运行的话,这时候需要操纵的页面元素会正确的加载进来),这样会大大的加强了自动化脚本的健壮性。接下来通过代码来讲解这个机制的实现过程。

    实际上这个机制是通过testng来实现的,虽然testng没有直接提供这种retry to run fail cases的功能,但是testng提供了实现这种功能的接口,它就是IRetryAnalyzer,一旦实现了接口里的方法retry(),就具备了这种功能,当retry()返回的值是true,那就表明该test是需要再运行一次,反之返回的结果是false,那就不需要再运行了该test了。具体的操作代码如下:

     1 package com.cbmp.utility;
     2 
     3 import org.testng.IRetryAnalyzer;
     4 import org.testng.ITestResult;
     5 import org.testng.Reporter;
     6 
     7 public class RetryAnalyzer implements IRetryAnalyzer {
     8     private int count = 0;
     9     private int maxCount = 2;
    10 
    11     @Override
    12     public boolean retry(ITestResult result) {
    13         if (!result.isSuccess()) {
    14             if (count < maxCount) {
    15                 count++;
    16                 result.setStatus(ITestResult.SUCCESS);
    17                 String message = Thread.currentThread().getName()
    18                         + ": Error in " + result.getName() + " Retrying "
    19                         + (maxCount + 1 - count) + " more times";
    20                 System.out.println(message);
    21                 Reporter.log(message);
    22                 return true;
    23             } else {
    24                 result.setStatus(ITestResult.FAILURE);
    25             }
    26         }
    27         return false;
    28     }
    29 }

    着还不算完事,接着我们需要实现监听的接口IAnnotationTransformer,然后把实现的类赋值给@test的属性RetryAnalyzer,具体代码如下:

     1 package com.cbmp.utility;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.Method;
     5 
     6 import org.testng.IAnnotationTransformer;
     7 import org.testng.IRetryAnalyzer;
     8 import org.testng.annotations.ITestAnnotation;
     9 
    10 /**
    11  */
    12 public class RetryListener implements IAnnotationTransformer {
    13 
    14     /* (non-Javadoc)
    15      * @see org.testng.IAnnotationTransformer#transform(org.testng.annotations.ITestAnnotation, java.lang.Class, java.lang.reflect.Constructor, java.lang.reflect.Method)
    16      */
    17     @SuppressWarnings("rawtypes")
    18     @Override
    19     public void transform(ITestAnnotation annotation, Class testClass,
    20             Constructor testConstructor, Method testMethod) {
    21 
    22         IRetryAnalyzer retry = annotation.getRetryAnalyzer();
    23         if (retry == null) {
    24             // annotation.setRetryAnalyzer(RetryAnalyzer.class);
    25             //annotation.setRetryAnalyzer(RetryFail.class);
    26             annotation.setRetryAnalyzer(RetryAnalyzer.class);
    27         }
    28     }
    29 
    30 }

    摘自官网的一个注意项,基于这个说法,我们只能使用该接口来修改@test的属性

    IAnnotationTransformer only lets you modify a @Test annotation. If you need to modify another TestNG annotation (a configuration annotation, @Factory or @DataProvider), use an IAnnotationTransformer2.

    最后我们还需要在testng的suite.xml文件添加一个listener标签

     1 <suite name="CBMP">
     2     <listeners>
     3       <listener class-name="com.cbmp.utility.RetryListener" />
     4   </listeners>
     5   <test name="cbmp1" preserve-order="true" >
     6         <classes>            
     7                <class name="com.cbmp.testcases.loginTestDemo"> 
     8                </class>
     9         </classes>
    10   </test>
    11 </suite>

    这样当你运行testng的时候,就会运行LoginTestDemo类里的标记为@test的方法,当这些方法失败的时候就会调用RetryListener里的retry方法,当retry的方法返回的结果是true的话就重新运行这些失败的方法,如果返回的是false就不会再运行。还有一个要注意的是,测试方法成功的话是不会调用RetryListener里的retry方法,这个是我在调试的时候发现的机制。


    作为文章的收尾,下面展示的是test的代码片段,里面的断言是故意要失败的,以检测retry机制是否被触发

     1     @Test(dependsOnMethods = "opencbmp", enabled = true)
     2     public void noUserAndPwd(){
     3         try {
     4             
     5             loginpage = PageFactory.initElements(driver,
     6                     LoginPage.class);
     7             loginpage.verifyPageElements("CBMP Login Interface Page");
     8             loginpage.login("admin", "dawda");
     9             
    10             Assert.assertEquals(true, false);
    11 
    12             
    13         } catch (Exception e) {
    14             // TODO: handle exception
    15             System.out.println(e.toString());
    16         }
    17 
    18     }

     待解决的问题:

    • result.setStatus(ITestResult.SUCCESS),把当前失败的测试结果设置为成功,但是一直不能生效,这个问题比较困扰我
    • 当触发retry to run fail case的时候,testng也会把重试运行的case也统计在内,这样就会造成运行后的testcase总数目不准确

     

  • 相关阅读:
    【Uvalive4960】 Sensor network (苗条树,进化版)
    【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)
    【UVA 1395】 Slim Span (苗条树)
    【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)
    【UVA 10369】 Arctic Network (最小生成树)
    【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
    【UVA 11183】 Teen Girl Squad (定根MDST)
    【UVA 11865】 Stream My Contest (二分+MDST最小树形图)
    【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)
    【LA 5713 】 Qin Shi Huang's National Road System (MST)
  • 原文地址:https://www.cnblogs.com/testermark/p/3550109.html
Copyright © 2020-2023  润新知