接口测试自动化之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.接口测试需求来源?

我们做接口测试就是为了能更好的把项目管起来,可以实现系统化,而不是为了增加人力。接口文档是接口测试来源的依据,接口文档主要包括的内容:

  1. 接口名称
  2. 接口类型
  3. 输入参数:参数名、参数类型、业务含义、是否可控、字段长度、单位
  4. 输出结果:参数名、参数类型、业务含义、是否可控、单位、返回状态的取值范围及业务含义

3.接口测试能发现哪些错误?

接口测试经常遇到的bug和问题:

  1. 传入参数处理不当,导致程序crash
  2. 类型溢出,导致数据读书和写入不一致
  3. 因对象权限未进行校验,可以访问其他用户敏感信息
  4. 状态处理不当,导致逻辑出现错乱
  5. 逻辑校验不完善,可利用漏洞获取非正当利益等

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内容里包括用例名称、是否执行、断言内容、执行结果、是否通过、参数名称。

  1. 用例名称:清晰明确本条用例验证点,便于后期维护。
  2. 是否执行:Y代表执行,N代表忽略。
  3. 断言内容:每条用例都有对应的断言内容,可以准确判断本条用例执行是否成功。
  4. 执行结果:执行用例后,手动记录用例的执行结果。---》修改为自动。
  5. 是否通过:执行用例后,手动记录用例执行的通过情况。--->修改为自动。
  6. 参数名:该接口对应的所有参数名称。

  用例数据一行代表一个用例。一个接口可以分正向用例和逆向用例,把一些常用的接口用例进行设置。(根据自己的实际情况进行编写)

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

 

 

posted @ 2021-02-18 12:07  wendyw  阅读(1374)  评论(0编辑  收藏  举报