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

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

 package com.cbmp.utility;

 import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
import org.testng.Reporter; public class RetryAnalyzer implements IRetryAnalyzer {
private int count = 0;
private int maxCount = 2; @Override
public boolean retry(ITestResult result) {
if (!result.isSuccess()) {
if (count < maxCount) {
count++;
result.setStatus(ITestResult.SUCCESS);
String message = Thread.currentThread().getName()
+ ": Error in " + result.getName() + " Retrying "
+ (maxCount + 1 - count) + " more times";
System.out.println(message);
Reporter.log(message);
return true;
} else {
result.setStatus(ITestResult.FAILURE);
}
}
return false;
}
}

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

 package com.cbmp.utility;

 import java.lang.reflect.Constructor;
import java.lang.reflect.Method; import org.testng.IAnnotationTransformer;
import org.testng.IRetryAnalyzer;
import org.testng.annotations.ITestAnnotation; /**
*/
public class RetryListener implements IAnnotationTransformer { /* (non-Javadoc)
* @see org.testng.IAnnotationTransformer#transform(org.testng.annotations.ITestAnnotation, java.lang.Class, java.lang.reflect.Constructor, java.lang.reflect.Method)
*/
@SuppressWarnings("rawtypes")
@Override
public void transform(ITestAnnotation annotation, Class testClass,
Constructor testConstructor, Method testMethod) { IRetryAnalyzer retry = annotation.getRetryAnalyzer();
if (retry == null) {
// annotation.setRetryAnalyzer(RetryAnalyzer.class);
//annotation.setRetryAnalyzer(RetryFail.class);
annotation.setRetryAnalyzer(RetryAnalyzer.class);
}
} }

摘自官网的一个注意项,基于这个说法,我们只能使用该接口来修改@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标签

 <suite name="CBMP">
<listeners>
<listener class-name="com.cbmp.utility.RetryListener" />
</listeners>
<test name="cbmp1" preserve-order="true" >
<classes>
<class name="com.cbmp.testcases.loginTestDemo">
</class>
</classes>
</test>
</suite>

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


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

     @Test(dependsOnMethods = "opencbmp", enabled = true)
public void noUserAndPwd(){
try { loginpage = PageFactory.initElements(driver,
LoginPage.class);
loginpage.verifyPageElements("CBMP Login Interface Page");
loginpage.login("admin", "dawda"); Assert.assertEquals(true, false); } catch (Exception e) {
// TODO: handle exception
System.out.println(e.toString());
} }

待解决的问题:

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

WebDriver框架之自动运行失败的case的更多相关文章

  1. 【框架】selenium运行失败后自动截图(三)

    思路: 1.写一个类继承TestListenerAdapter,覆写onTestFailure()方法 2.在onTestFailure方法里,调用selenium的TakesScreenShot的g ...

  2. python unittest case运行失败重试

    因为使用unittest进行管理case的运行.有时case因为偶然因素,会随机的失败.通过重试机制能够补充保持case的稳定性.查阅资料后发现,python的unittest自身无失败重试机制,可以 ...

  3. TestNG监听器实现用例运行失败自动截图、重运行功能

    注: 以下内容引自 http://blog.csdn.net/sunnyyou2011/article/details/45894089 (此非原出处,亦为转载,但博主未注明原出处) 使用Testng ...

  4. java juint框架的windows自动化-自动运行juint程序简述

    在京东混了一个月,基本有点稳定了,觉得也有所余力了现在,继续写博客吧,不过以后更新也许不是那么频繁了 本人使用的是juint框架,对开发是一个单元测试的java框架,但是对测试而言是java的基石之一 ...

  5. java testng框架的windows自动化-自动运行testng程序上篇

    本文旨在让读者简单了解testng的自动运行 怎么说呢,在网上已经有了各个前辈进行代码演示以及分享,我力争说到点子上 接上文,之前讲的大部分是juint的自动化代码运行,从未涉及到testng,但是在 ...

  6. TestNG实现用例运行失败自动截图(转载)

    转载自:https://blog.csdn.net/galen2016/article/details/70193684 重写Listener的onTestFailure方法 package com. ...

  7. java testng框架的windows自动化-自动运行testng程序下篇

    本文旨在让读者简单了解testng的自动运行 接上文https://www.cnblogs.com/xuezhezlr/p/9213456.html,文章大致把testng中比较特殊的两个xml形式说 ...

  8. WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对

    WPF MVVM UI分离之<交互与数据分离>   在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...

  9. 【pytest系列】- pytest测试框架介绍与运行

    如果想从头学起pytest,可以去看看这个系列的文章! https://www.cnblogs.com/miki-peng/category/1960108.html 前言​ ​ 目前有两种纯测试的测 ...

随机推荐

  1. Apache服务器的Options 的 Indexes FollowSymLinks详解

    禁止显示Apache目录列表 - Indexes FollowSymLinks 如何修改目录的配置以禁止显示 Apache 目录列表. 缺省情况下如果你在浏览器输入地址: http://localho ...

  2. AJAX基本演示使用

    Servlet配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="h ...

  3. 服务器下面的WEB-INF 不能直接访问,可以通过servlet进行访问

    服务器下面的WEB-INF 不能直接访问,可以通过servlet进行访问

  4. OJ 列表

    维护一个 OJ 列表.(这件事似乎没啥意义?) AtCoder hihoCoder Codeforces DMOJ CodeChef CS Academy HackerRank HackerEarth ...

  5. 【题解】CQOI2017老C的方块

    网络流真的是一种神奇的算法.在一张图上面求感觉高度自动化的方案一般而言好像都是网络流的主阵地.讲真一开始看到这道题也有点懵,题面很长,感觉很难的样子.不过,仔细阅读了题意之后明白了:我们所要做的就是要 ...

  6. [BZOJ3196][Tyvj1730]二逼平衡树

    [BZOJ3196][Tyvj1730]二逼平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询 \(k\) 在区间内的排名 查询区间内排名为 \ ...

  7. [洛谷P2986][USACO10MAR]伟大的奶牛聚集Great Cow Gat…

    题目大意:给你一棵树,每个点有点权,边有边权,求一个点,使得其他所有点到这个点的距离和最短,输出这个距离 题解:树形$DP$,思路清晰,转移显然 卡点:无 C++ Code: #include < ...

  8. centos的网络设置问题

    遭遇了多次centos的网络连接问题,现将正确配置总结下: 这里是使用vmware虚拟平台,因为涉及到中间这层,所以需要设置下: 保证centos也能连上网,首先物理机连上网,接着物理机的vmware ...

  9. vsftpd主动模式和被动模式的区别

    何为主动模式,何为被动模式 1.ftp采用两个端口控制: 20端口用于数据传输. 21端口用于控制,或指建立TCP连接. 2.主动方式连接过程: [注意]:C表示客户端 S表示服务器端 S端要开启20 ...

  10. ES6学习笔记(二)——数组的扩展

    扩展运算符 ... 将数组转化成用逗号分隔的参数序列 * 扩展运算符背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换. 应用 1. 合并数组 2. 将 ...