接口测试自动化之Robot Framework
接口测试的目标方向:
- 1、执行完以后,case都是一个结果,每个用例数据代表一个用例,返回的结果不同。
- 2、断言结果的确定,正向+逆向的一个断言,看一下开发的代码,接口的一个思路,初步判断断言结果
- 3、登录的接口,获取token,作为一个全局变量进行传递。
- 4、连数据库【比如达梦】,database暂时不支持达梦
- 5、生成自动化报告,不要手动去填写
- 6、针对过程的一个呈现,接口自动化报告针对的是结果的一个呈现。
- 7、统计人员的趋势图,结果呈现
- 8、RF+JENKINS集成
- 9、接口流程测试[接口依赖]
1.接口测试疑问?
接口测试其实基本知识已经学习了很久,但是只限于对基础的学习,以前总觉得一涉及到代码编写,定制开发就是遥不可及的目标,总不愿意多踏出去一步,其实在部门同事的升级替代下,有了更进一步的深入了解,发现写代码也是一项很愉快的事情,只要你多进一步,就会发现自己是可以去做的。
今年初给自己的目标是必须完成对代码编写的恐惧,已经掌握了大量的理论知识,只差一步的实践必须进行实践。自己的想法首先是在博客园了解测试圈大神们的博客,了解了接口测试可以通过哪些方式进行实现。比如主流的接口测试框架:RobotFramework、Jmeter、BDD、HttpRunner、gauge、Unittest+Request+HTMLRunner【推荐】。
具体的可以参考虫师的博文:https://www.cnblogs.com/fnng/p/9919803.html
2.接口测试需求来源?
我们做接口测试就是为了能更好的把项目管起来,可以实现系统化,而不是为了增加人力。接口文档是接口测试来源的依据,接口文档主要包括的内容:
- 接口名称
- 接口类型
- 输入参数:参数名、参数类型、业务含义、是否可控、字段长度、单位
- 输出结果:参数名、参数类型、业务含义、是否可控、单位、返回状态的取值范围及业务含义
3.接口测试能发现哪些错误?
接口测试经常遇到的bug和问题:
- 传入参数处理不当,导致程序crash
- 类型溢出,导致数据读书和写入不一致
- 因对象权限未进行校验,可以访问其他用户敏感信息
- 状态处理不当,导致逻辑出现错乱
- 逻辑校验不完善,可利用漏洞获取非正当利益等
4.接口测试框架RobotFramework自定义设计
首先需要认识RF的一些基本语法,我们常用的代码都是有限的,所以我们需要先清楚代码的本身意思。
4.1第一步基本技能:RF的基本概念与用法
- 变量和常量的使用:${var}(单值变量)、@{listvar}(多值变量)、%(环境变量)、字符串连接、字符串截取等。
- Keyword关键字的创建和使用:主要包括setting内的arguments、return value、具体内容的编写【涉及到逻辑编写】。
- 循环和分支:循环有3种模式,分支可以通过关键字run keyword进行实现。
- RF内代码框架
- 标准库Builtin中提供了最基本的关键字来实现打印、screenshot库提供了截图关键字、Datatime库提供了关于时间库的关键字。各种库的提供使我们在操作的时候需要对特定的库有个初步了解,能为我们做什么提供关键字支撑。比如接口库:robotframework-requests(RequestsLibrary)
1.测试用例编写案例 *** Settings *** //用于引用库、资源 Library DatabaseLibrary Library RequestsLibrary Resource 公共资源.robot Library ExcelLibrary Library Collections *** Test Cases *** //用于编写测试用例 新增资源树节点 //用于编写测试用例名称 log robot framework //关键字、字符串之间间距为四个空格、前面为4个空格 Output: C:\Users\output.xml //XML格式记录测试结果 Log: C:\Users\log.html //测试日志,记录每一步的执行情况 Report: C:\Users\...\AppData\Local\Temp\report.html //偏向测试报告,总体展示测试用例的执行情况
keyword关键字: settiong 部分:参数arguments 是形参,在调用该关键字的时候可以传入对应的实际参数; return value值是关键字返回的值,调用关键字时可以使用变量来调用该返回值;
2.循环有3种模式: :FOR 循环变量 IN RANGE end; :FOR 循环变量 IN RANGE start end [step]; :FOR 循环变量 IN a[b,c,d.....] eg: :FOR ${i} IN RANGE 10; :FOR ${i} IN RANGE 1 10 2; :FOR ${i} IN 1,2,3,4,5 退出循环: EXIT FOR LOOP 3.分支:分支主要是通过关键字实现 run keyword if...ELSE(ELSE是另外必须大写,RF不区分大小写) RUN KEYWORD if 条件1 do action1 ... ELSE IF 条件2 do action2 ... ELSE IF 条件x do actionx ... ELSE do action N
#字符串截取 ${val2[2]} //截取变量的第三个字符 ${val2[0:3]} //截取变量的第一个到第三个字符
@{val}[0] //截取列表中的第一个值 #变量运算用Evaluate ${val2} Evaluate ${val1}+1 #list变量,获取值有2种方式:@{变量名}[index] 、${变量名[index]} #一维list @{list} create list a b c log @{list}[1] log ${list[1]} #二维list @{listA} create list 1 2 @{listB} create list 3 4 @{listC} create list ${listA} ${listB} 5 log @{listC[1]}[1] log ${list[1][1]}
4.2 第二步整体架构:RF接口自动化测试框架
RF接口自动化测试的核心就是关键字开发。在做接口自动化测试的时候,最重要的是数据与业务分离,实现测试脚本参数化,提高测试脚本的可重用性。
4.3 第三步编码实现:RF接口自动化测试实例
在开始编写代码时,基本的接口测试脚本开发思想已经实现。数据与脚本分离,我们如何获取数据?如何进行用例编写?可以进行拆分一一进行编写。
在进行RF接口自动化测试的时候,我们会把集中开始编写的用例先统一进行编写。比如测试数据准备的数据获取。一个接口有很多测试用例,如何进行单个用例执行?如果进行单接口的测试用例执行?如何连接数据库?这些都是在编写逻辑时所有接口都可以用到的,所以我们可以单独提取出来作为公共资源进行关键字自定义编写。
数据准备:
Excel用例数据里,一个sheet对应一个接口,sheet内容里包括用例名称、是否执行、断言内容、执行结果、是否通过、参数名称。
- 用例名称:清晰明确本条用例验证点,便于后期维护。
- 是否执行:Y代表执行,N代表忽略。
- 断言内容:每条用例都有对应的断言内容,可以准确判断本条用例执行是否成功。
- 执行结果:执行用例后,手动记录用例的执行结果。---》修改为自动。
- 是否通过:执行用例后,手动记录用例执行的通过情况。--->修改为自动。
- 参数名:该接口对应的所有参数名称。
用例数据一行代表一个用例。一个接口可以分正向用例和逆向用例,把一些常用的接口用例进行设置。(根据自己的实际情况进行编写)
Excel中的数据准备:
需求数据:本次测试的是分页查询的功能,不需要进行参数编写
查询用例编写分2个方向进行编写:一个是正向流程,一个是逆向流程。
查询结果:就是验证查询结果是否能返回正确的数据。
数据准备脚本编写:
- 数据准确我们最重要的如何从excel中拿到数据?
- 如何获取到表头标题(用例名称、是否执行、断言内容、执行结果、是否通过)和入参标题(就是参数名称)?
- 如何获取到表头标题对对应的值和入参标题对应的值?
RF针对Excel有个库ExcelLibrary库,通过操作数据文件实现数据与脚本的分离,引入ExcelLibary库,操作Excel文件。可以通过2个脚本实现获取表头标题和入参标题、表头标题对应的值和入参标题对应的值。
excellibrary安装:pip install robotframework-excellibrary
Excellibrary库常用关键字:
- Open Excel 打开Excel文件
- Get Row Count 获取行数
- Get Column Count 获取列数
- Get Column Values 获取某一列的值
- Get row Values 获取某一行的值
- Read Cell Data By Coordinates 通过列行编号获取值
- Read Cell Data By Name 按名称读取单元格数据
Excellibrary使用注意事项:
excel文件的后缀为.xls结尾
获取表头标题 (用例名称、是否执行、断言内容、执行结果、是否通过)和入参标题(就是参数名称):
脚本最终实现的目的:
@{confParaName}列表用于保存前5个固定的标题,包括用例名称,是否执行,断言内容,执行结果,是否通过。
@{confDataName}列表用于保存接口的入参名。
#获取表头标题(用例名称、是否执行、断言内容、执行结果、是否通过)和入参标题(就是参数名称): *** Settings *** Library ExcelLibrary Library RequestsLibrary Library Collections Library requests Library DatabaseLibrary Library String *** Variables *** ${host} http://10.100.xx.xxxx:18292
#打开excel文件 open excel E:\\test.xls #通过行列坐标获取xcel内的值,比如这里的取值是第一行第二列的值. ${uri} Read Cell Data By Coordinates test 1 0 set global variable ${uri} #获取行数统计,比如有多少行. ${rowCount} Get Row Count test #获取列数统计,比如有多少列. ${columnCount} Get Column Count test set global variable ${rowCount} set global variable ${columnCount} @{confParaName} create list @{confDataName} create list set global variable @{confParaName} set global variable @{confDataName} : FOR ${colun} IN RANGE 5 ${TEMP1} Read Cell Data By Coordinates test ${colun} 1 Append to list ${confParaName} ${TEMP1} : FOR ${colun} IN RANGE 5 ${columnCount} ${TEMP2} Read Cell Data By Coordinates test ${colun} 1 Append to list ${confDataName} ${TEMP2}log
结果显示:
获取表头标题对应的值和入参标题对应的值:
脚本最终实现的目的:
&{ConfParaDict} 列表用于保存标题下对应的数据。
&{ConfDataDict}列表用于保存接口的入参名下对应的数据。
//通过字典的方式用于存储实际数据 &{ConfParaDict} Create Dictionary &{ConfDataDict} Create Dictionary @{ConfPara} Create List @{ConfData} Create List Set Global Variable &{ConfParaDict} Set Global Variable &{ConfDataDict} Set Global Variable @{ConfPara} Set Global Variable @{ConfData} : FOR ${colun} IN RANGE 5 \ ${TEMP3} Read Cell Data By Coordinates test ${colun} 2 \ Append to list ${ConfPara} ${TEMP3} \ set to Dictionary ${ConfParaDict} @{confParaName}[${colun}] ${TEMP3} log ${ConfPara} log ${ConfParaDict} : FOR ${colun} IN RANGE 5 ${columnCount} \ ${col} Evaluate ${colun}-5 \ ${TEMP4} Read Cell Data By Coordinates test ${colun} 2 \ Append to list ${ConfData} ${TEMP4} \ set to Dictionary ${confDataDict} ${confDataName[${col}]} ${TEMP4} log ${ConfData} log ${confDataDict}
实现层和断言层:
接口冒烟测试方法
https://www.ituring.com.cn/article/273457
https://www.jianshu.com/p/c3a9d20db4e5