RobotFrameWork接口报文测试-----(三)demo的加强版(数据驱动测试)
在上一篇RobotFrameWork接口报文测试-----(二)demo的升级版基础上,将接口的xml的格式保存在xml文件中,然后程序如果增加一个接口,在xml文件里添加即可,无需修改自动化测试里的其他模块,然后在工具加case就可以了,但是接口取值的数据全部都是直接在case里面录入的,也就是说,每增加一条测试用例,就需要在工具内添加一条case,测试数据始终都是在工具内控制,这让以前使用excel管理过测试数据的我感觉很不爽,总感觉得把数据放到excel内,然后实现数据驱动测试。
围绕着这个想法,先给出一个大致的业务流程图。
.xml : 每个接口的xml定义的标准规范文档。如下:
.xls : 每个接口的测试数据,保存在xls内。如下:
从xml文件中读取接口的字段,再从excel中读取相应的数据,然后组装成sendbuf,调用报文处理模块,将报文进行预处理后(在dll内实现,在会话层添加一些数据,然后再进行加密操作 )发往服务器端,服务器处理报文后,返回响应报文,报文处理模块将报文解析后,提取出状态码,将实际状态码与预期状态码进行对比,测试完成。在(二)的基础上,增加一个excel的处理模块,将excel内的数据全部读入到list中,简单的代码如下所示:
def readDataFromExcel():
data = xlrd.open_workbook('D:\logincase.xls')
table = data.sheets()[0] nrows = table.nrows
nclos = table.ncols listAll=[]
for row in range(3,nrows):
alist=[]
for col in range(1,nclos):
alist.append(table.cell(row,col).value)
listAll.append(alist)
return listAll
然后在RF工具内修改case,如下所示:
到此,已经把数据从case中剥离到了excel内,上图只读取了一条数据,如果要去读多条数据,直接在里面写个简单的for循环即可,于是我以为我完全实现了数据驱动测试,开心了好几天。。。。
一天无意间点到一位大师的博客,看了看,似乎觉得好像真有点道理,像我上面那样实现,就算实现了数据驱动测试了么?那什么又是数据驱动测试呢?
数据驱动测试是从数据文件(如Excel文件、文本文件、XML文件或数据库等)中读取测试数据,然后通过变量传入事先编写或录制好的测 试脚本中,这些变量既可传递测试输入数据也可传递测试输出的验证数据。测试数据只出现在数据文件中,测试脚本负责测试逻辑业务过 程、测试状态以及数据文件读取,因此,测试数据和测试脚本是分开存放的。数据文件中的每一行表示一组测试数据,通过循环遍历数据文件中的每一行,将数据逐一注入到相同的测试流程进行反复的测试验证。
对比下手工测试的场景:当一个手工测试人员A发现在测试数据存储目录下多了一套测试数据时,他就会意识到应该马上执行测试用例,并输入这套新的测试数据。其实是测试数据的变化触发了A的测试行为。再抽象一下,可以这样来看:当测试数据变化时,测试用例就会被执行,并且按照预先定义的规则去读取测试数据并执行测试用例。那么这种情况我们是不是可以理解为一种数据驱动呢?也就是说只要有了新的测试数据或者测试数据发生了变化,那么A就会去执行测试用例。这一过程的目的就是为了让所有的测试数据都得到输入并返回相应的输出结果。
很显然,这个概念强调了两点:第一:测试数据与测试脚本,模块的分离;第二:程序读取测试数据,自动完成一些列的测试流程并返回测试结果。很多时候,我们大部分人都是做了第一点,忽略了第二点;大多数都能实现测试数据的参数化处理,却无法完成自动运行相应的测试用例。了解数据驱动测试的相关概念后,自我审视觉得自己写的确实没法达到能完全自动运行的地步,至少存在以下几个问题:
第一:测试A接口,怎么确定使用哪个sheet的数据呢?
第二:测试A接口,有10条用例,放在一个RF的case内管理,那这10个用例内,冒烟测试只要运行3条,集成需要10条,这怎么设置?而且如果一个case里存在一个测试用例失败,则整个case是处于failed状态的,这该怎么办?
鉴于上面2个问题,实际上以前我都解决过;第一个问题好办,既然id能确定接口的xml的标准格式,那就可以以这个id作为测试数据的sheet的名称,就可以拿到具体接口的sheet数据。第二个办法运行几条case也好办,在每个xls最后一列加一列,是否执行列,读取为否,则不发送数据即可。但是第二个小问题,在RF内就无法解决了,应该是因为工具自身的局限性导致,一个RF的case不管里面实际跑了多少个测试用例,只要一个失败,就是全部失败状态。所以在RF内测试用例的管理有2种形式:
第一:一个suit 就是一个接口,一个case就是一条测试用例。
第二: 一个suit是一个模块,一个case是一个接口。
显然第一个可以更方便的控制执行粒度,但是每一个测试用例就得新建一个case,测试数据直接写在case内即可,是有点麻烦。如果碰到一个接口有四五十条测试用例,就只能呵呵了~~~第二个不太好控制执行粒度,但是在excel内管理数据,可以更好的管理测试数据。而且RF一直在说能实现数据驱动测试,但一直没找到相关资料,大多都是实现到这一层基本就没了下文,看了很多文档,基本也差不多就到此为止了,看来也是时候需要去看看官方各种文档了~~~~
RobotFrameWork接口报文测试-----(三)demo的加强版(数据驱动测试)的更多相关文章
- RobotFrameWork接口报文测试-----(二)demo的升级版
在上一篇,简单的demo实现了讲xml的数据发送服务器端并取得recvi_buf,然后进行了简单的解析的操作.现在就要解决之前提过的2个问题: 1. 步骤这么多,难道每写一个脚本都要重复一次么? 2. ...
- RobotFrameWork接口报文测试-----(一)简单demo的实现
最近几个月的工作任务都是通过使用RF工具来搭建服务器端接口的自动化测试,使用python作为2次开发的语言,也是第一次去做这种项目,经验善浅,还是很有可能会走很多的弯路,为此,我希望自己能把每个阶段的 ...
- selenium自动化测试之【数据驱动测试】
数据驱动测试是自动化测试的主流设计模式之一,相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为进行了完全的分离,这样的测试脚本设计模式称为数据驱动.实施数据驱动测试的步骤:1.编写测试脚本,脚 ...
- Python Selenium 之数据驱动测试
数据驱动模式的测试好处相比普通模式的测试就显而易见了吧!使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据.可以将测 ...
- Sencha 基础Demo测试,三种showView的方法
直接贴代码吧 Ext.define("build.controller.MainController",{ extend:"Ext.app.Controller" ...
- WEB接口测试之Jmeter接口测试自动化 (三)(数据驱动测试) 接口测试与数据驱动
转载:http://www.cnblogs.com/chengtch/p/6576117.html 1简介 数据驱动测试,即是分离测试逻辑与测试数据,通过如excel表格的形式来保存测试数据,用测试脚 ...
- WEB接口测试之Jmeter接口测试自动化 (三)(数据驱动测试)
接口测试与数据驱动 1简介 数据驱动测试,即是分离测试逻辑与测试数据,通过如excel表格的形式来保存测试数据,用测试脚本读取并执行测试的过程. 2 数据驱动与jmeter接口测试 我们已经简单介绍 ...
- RobotFrameWork接口项目分层及通用控制方式
1. 前言 上一篇文章介绍了在设计接口用例之前应遵守的设计规范,详见<RobotFramework接口设计规范>,当然读者公司的内部规范也不一定非得完全遵循笔者所提到的,适合自己公司内部的 ...
- 如何在robotframework基础上使用数据驱动测试
一.写在前面 robotframework是很好用的关键字驱动测试框架,但是在实际工作中也有些地方使用不便,比如在我们设计参数校验测试case时,往往只是想修改校验参数类型而不得不做大量复制粘贴操作, ...
随机推荐
- Wordpress固定链接设置
wordpress设置固定链接时,应该尽量注意一下几点: 1.不要让日期出现在固定链接里面. 2.不要让分类的链接出现在固定链接里面. 3.链接不要太深. 4.链接中不要出现中文. 5.文章最后可以加 ...
- java字符串和unicode互转
直接上代码 private static String decodeUnicode(String input) { if (null == input) return input; int len = ...
- node express 学习1
参考链接https://cnodejs.org/topic/55ece31004e2cdb230671c50 express-session connect-nongo mongoose 1.安装mo ...
- self.nsme 和 _name 的问题
.h文件 @interface myclass:NSObject @property(nonatomic,retain)NSArray*MyArray; @end .m文件 @implementati ...
- [LeetCode]题解(python):081 - Search in Rotated Sorted Array II
题目来源 https://leetcode.com/problems/search-in-rotated-sorted-array-ii/ Follow up for "Search in ...
- WPF 本周、本月、本季、本年的第一天与最后一天取法
lblWeekStart.Content = DateTime.Now.AddDays(Convert.ToDouble((0 - Convert.ToInt16(DateTime.Now.DayOf ...
- angularjs 获取地址传参
.controller('CityCtrl', function ($scope, $location,$ionicModal) { 注入location服务 $scope.name = $locat ...
- [BS-16] 尽量将View的Opaque属性设置为YES(默认就是YES)
尽量将View的Opaque属性设置为YES(默认就是YES) UIView控件都有一个Opaque属性,如果不会更改view的透明度,那么应该将其opaque属性设置为YES.为什么要这样做呢?其实 ...
- Objective-C中 Self和 Super详解
Objective-C中 Self和 Super详解 Objective-C 中Self 和 Super 详解本文要介绍的内容,在 Objective-C 中的类实现中经常看到这两个关键字 self ...
- JDK和Tomcat的安装与配置
1 JDK的安装 2 JDK的配置 3 JDK安装成功的验证 4 Tomcat的安装 (1) 解压” apache-tomcat-6.0.35. ...