zoukankan      html  css  js  c++  java
  • 接口测试自动化之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:Usersoutput.xml   //XML格式记录测试结果
    Log: C:Userslog.html        //测试日志,记录每一步的执行情况
    Report: C:Users...AppDataLocalTemp
    eport.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

     

     

  • 相关阅读:
    SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
    SpringCloud系列一:SpringCloud的简介和架构
    SpringBoot系列十二:SpringBoot整合 Shiro
    SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)
    SpringBoot系列十:SpringBoot整合Redis
    SpringBoot系列九:SpringBoot服务整合(整合邮件服务、定时调度、Actuator监控)
    SpringBoot系列八:SpringBoot整合消息服务(SpringBoot 整合 ActiveMQ、SpringBoot 整合 RabbitMQ、SpringBoot 整合 Kafka)
    SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源、配置 MyBatis、事务控制、druid 监控)
    SpringBoot系列六:SpringBoot整合Tomcat
    SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
  • 原文地址:https://www.cnblogs.com/wendyw/p/14366316.html
Copyright © 2011-2022 走看看