WebDriver框架之自动运行失败的case
大家在运行自动化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的更多相关文章
- 【框架】selenium运行失败后自动截图(三)
思路: 1.写一个类继承TestListenerAdapter,覆写onTestFailure()方法 2.在onTestFailure方法里,调用selenium的TakesScreenShot的g ...
- python unittest case运行失败重试
因为使用unittest进行管理case的运行.有时case因为偶然因素,会随机的失败.通过重试机制能够补充保持case的稳定性.查阅资料后发现,python的unittest自身无失败重试机制,可以 ...
- TestNG监听器实现用例运行失败自动截图、重运行功能
注: 以下内容引自 http://blog.csdn.net/sunnyyou2011/article/details/45894089 (此非原出处,亦为转载,但博主未注明原出处) 使用Testng ...
- java juint框架的windows自动化-自动运行juint程序简述
在京东混了一个月,基本有点稳定了,觉得也有所余力了现在,继续写博客吧,不过以后更新也许不是那么频繁了 本人使用的是juint框架,对开发是一个单元测试的java框架,但是对测试而言是java的基石之一 ...
- java testng框架的windows自动化-自动运行testng程序上篇
本文旨在让读者简单了解testng的自动运行 怎么说呢,在网上已经有了各个前辈进行代码演示以及分享,我力争说到点子上 接上文,之前讲的大部分是juint的自动化代码运行,从未涉及到testng,但是在 ...
- TestNG实现用例运行失败自动截图(转载)
转载自:https://blog.csdn.net/galen2016/article/details/70193684 重写Listener的onTestFailure方法 package com. ...
- java testng框架的windows自动化-自动运行testng程序下篇
本文旨在让读者简单了解testng的自动运行 接上文https://www.cnblogs.com/xuezhezlr/p/9213456.html,文章大致把testng中比较特殊的两个xml形式说 ...
- WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对
WPF MVVM UI分离之<交互与数据分离> 在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...
- 【pytest系列】- pytest测试框架介绍与运行
如果想从头学起pytest,可以去看看这个系列的文章! https://www.cnblogs.com/miki-peng/category/1960108.html 前言 目前有两种纯测试的测 ...
随机推荐
- docker/qemu中是如何对设备管理的
文件系统中包括实际的磁盘中可读可写的. 容器中看到的设备是啥子呢?--docker qemu也是一样,在qemu中添加一个设备的物理意义是啥子嘛 其实设备也没啥好新奇的,不就是一个普通的文件么,然后在 ...
- Jira & filter & subscribe & issues
Jira & filter & subscribe & issues https://confluence.atlassian.com/search/?query=subscr ...
- 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组
题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...
- [BZOJ3473][BZOJ3277]字符串
[BZOJ3473][BZOJ3277]字符串 试题描述 给定 \(n\) 个字符串,询问每个字符串有多少子串(不包括空串)是所有 \(n\) 个字符串中至少 \(k\) 个字符串的子串? 输入 第一 ...
- PyQt5学习--基本窗口控件--QMainWindow
QMainWindow主窗口为用户提供一个应用程序框架,它有自己的布局,可以在布局中添加控件.比如将工具栏.菜单栏和状态栏等添加到布局管理器中. 窗口类型介绍 QMainWindow.QWidget和 ...
- [Leetcode] remove element 删除元素
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- hadoop基础----hadoop实战(七)-----hadoop管理工具---使用Cloudera Manager安装Hadoop---Cloudera Manager和CDH5.8离线安装
hadoop基础----hadoop实战(六)-----hadoop管理工具---Cloudera Manager---CDH介绍 简介 我们在上篇文章中已经了解了CDH,为了后续的学习,我们本章就来 ...
- 【BZOJ 3195 】[Jxoi2012]奇怪的道路 装压dp
受惯性思维的影响自动把二进制状态认为是连与不连......... 我们这里二进制状态表示的是奇偶,这样的话我们f[i][j][k]表示的就是前i个城市用了j个边他前k个城市的奇偶状态,然后想想怎么转移 ...
- JSONP以及Spring对象MappingJacksonValue的使用方式
什么是JSONP?,以及Spring对象MappingJacksonValue的使用方式 原文: https://blog.csdn.net/weixin_38111957/article/detai ...
- Ubuntu下安装LNMP之Mysql的安装及卸载
Mysql的安装过程也可参考:http://blog.csdn.net/qq_20565303/article/details/69813868 Mysql安装包下载地址:https://dev.my ...