Httprunner 1.X版本 - 接口自动化测试

小编是在去年开始了解并使用httprunner进行接口自动化测试,httprunner是一个开源框架,使用yaml、json文件编写测试用例,进行接口测试。
今年Httprunner已经更新至2.X版本,这次更新进行了很大的变动,因为团队年初决定做自己的接口自动化框架,小编也没有再继续进行学习使用了,再此对于Httprunner 1.X版本进行一次分享(1.X版本仍可使用,2.X版本对于层次理念上进行了大的调整,但是看官方文档对于基础的使用还是没有变化的,可以作为2.X版本使用的一个了解)

Httprunner对于requests模块、locust模块进行了良好的封装使用,但是因此个人也觉得受到了很多限制,这也是团队决定做自己的接口测试框架的原因

官方文档 https://cn.httprunner.org/

一、安装

安装Httprunner

  • 使用pip安装
pip3 install httprunner==1.5.15
  • 或者easy_install安装
easy_install httprunner
  • 安装校验
hrun -V
har2case -V

安装locust用于性能测试

使用pip安装

pip3 install locustio

安装PyCharm

因为Httprunner的是使用python编写的,所以就安装了编辑器(大家可以根据自己的喜好安装编辑器)

  • 将其移动到想要安装的目录,然后解压
tar xvfz pycharm-community-2017.3.2.tgz
  • 启动编辑器
cd xxxxx安装目录/bin; 
./pycharm.sh
  • 汉化PyCharm
sudo apt-get install git 安装git用于克隆汉化包
git clone https://github.com/ewen0930/PyCharm-Chinese  克隆汉化包
cd xxxx(具体的下载目录)/PyCharm-Chinese
bash package.cmd 设置bash环境
sudo cp resources_zh.jar xxxxxx(pycharm具体安装的目录)/lib    之后重启pycharm

二、构建项目

  • 建议直接使用脚手架
hrun --startproject apitest(实际的项目名称)

注意修改脚手架生成的时testsuite为suite

  • 默认项目架构
    -api
    ----根据具体项目拆分文件夹
    -suite(脚手架生成的时testsuite需要改为suite)
    ----根据具体项目拆分文件夹
    -testcase
    ----根据具体项目拆分文件夹
    -.env
    -debugtalk.py

三、项目架构介绍

在这里插入图片描述

  • 层次介绍
* api层(httprunner的基本层次):放置所有的api,并将其参数化。根据不同的项目-模块分层保存
* 数据层:所有需要访问业务数据库的方法文件
* 报告层(httprunner的基本层次):测试报告存放位置
* 方法层:httprunner的所有方法需要在根目录的debugtalk.py文件,为了便于维护简化debugtalk文件,只做一层方法引用(根据需要适当增加处理),所有方法存放于方法层
* suite层(httprunner的基本层次):对于某些可固定的流程用例,做成套件
* 测试用例层(httprunner的基本层次):通过api、suite、传参等其他处理组合成测试用例,用于最终执行
  • 结构如下:
xxxx(项目名称)
|-- api         ## 该文件夹存放所有接口使用的方法
`-- common      ## 该文件夹存放所有基础通用方法
`-- data        ## 该文件夹存放所有需要的测试数据(对应的导入方法),测试数据生成的脚本
    `-- create_data        ##数据生成器,通过随机数、任意选择等当时生成用例所需的数据
    `-- mysql                 ##数据库方法,对于测试过程中需要‘增删改查’数据库的操作
`-- docs        ## 该文件夹存放所有的文件、图片等文件
`-- reports     ## 该文件夹存放自动生成的测试报告
`-- testsuite       ## 该文件夹存放所有测试模块
`-- testcases   ## 该文件夹存放所有测试用例
`-- .env    ## 该文件写所有的环境配置数据
`-- debugtalk.py     ## 该文件定义所有api、测试模块、测试用例用到的方法
`-- requirements.txt    ## 该文件记录所有需要用的框架(以便更换环境一键安装)

四、具体编写方法

小编推荐直接查看官网,讲解非常清楚 https://cn.httprunner.org/

五、具体编写注意(小编踩过的坑)

1、分层

该框架分为api(接口)、suite(模块)、test(测试步骤)、config(测试用例)

api->suite->test->config
api->test->config

由于分层结构,所以影响hook机制的使用

  • 当api中使用hook,则suite、test中将不再可以使用hook(使用也是无效的,运行时不会跑这一块代码)
  • 当suite使用hook,则test中将不再可以使用hook(使用也是无效的,运行时不会跑这一块代码)
  • 一个测试用例中,最后一个步骤已经使用hook机制,config处的teardown_hooks基本也是无效的(目前邮件可用)
  • 所以api处尽量不使用hook。将hook机制用于测试步骤、用例中

2、参数

  • 如果在config中使用parameters引入数据,则取值必须时数组形式[{“a”,“b”,“c”}]
  • 如果在config中使用variables引入数据,则直接取值"a"
  • 如果在test中使用variables引入数据,则直接取值"a"
  • 数组类型
    config中使用parameters(全局参数),需要将数据转化为数组类型
  • int类型
    test中的json实际使用中,参数为int类型时,需要将数据转化为int类型
  • string类型
    config、test中使用variables(全局变量),需要将数据转化为string类型
    python中通过函数传入的非数字,默认string类型
    python中通过函数传入的数字,默认是int类型

利用函数引用数据

在debugtalk.py中使用函数取相应的值
注意:由于上一个脚本获取到的是字符串类型,如果有些参数是整数类型,取值时需要将字符串转化为需要的类型;
同时注意:如果接口参数中“”传输的字符,不需要转化即使是数字。接口参数中不加“”的类型,使用int()方法转化即可。
此处的转化主要取绝于测试步骤有没有加”“,另:如果某参数用于url,不需要将其转化类型,字符串类型即可,框架会自动识别

def get_loan_days():
    return [{"loan_days": int(new_mysql.GetMysqlData(loan_days}]
  • 在测试用例config部分添加引入,并在具体测试步骤中引用具体数据
- config:
    parameters:
        - loan_days: ${get_loan_days()}
  • 具体步骤中引用
$loan_days

3、引用

api、suite引用

  • 由于引用均使用的是def方法,所以api、suite都是可以使用参数方法的使用场景:某一接口用于两种类型的操作。可以将类型写为参数。在测试步骤中引用xxx(xx)即可
  • api中使用参数化方式,某些值选择有函数传入时,注意参数命名一定要与方法中的任何字段不同(并且字段中不能包含参数名)例:api中有1个字段为is_first,参数化时命名绝不能使用is、first

方法引用

该框架所有测试步骤、用例中使用的方法均需要再debugtalk文件中声明
所以方法引用规则:
具体的方法要单独一个文件来编写
在debugtalk文件中声明(推荐只做声明,或嵌套参数传出方法)

4、运行

由于报告会自动生成,所以需要cd到项目内部,再hrun xxx.yml。这样报告会显示在项目内的报告文件夹中,否则会自动创建一个文件夹存储

六、样例

api.yml

- api:
    def: api_aa_bb_POST()
    name: xxxx
    request:
      headers: {"Content-Type":"application/json"}
      url: $gwhost/xxxx/xxxx/xxxx
      method: POST
      json:
        {
          "phone":"$phone"
        }
    validate:
        - eq: ["ok", true]
        - eq: ["reason", OK]

suite.yml

- config:
    def: suite_bb_cc()
    name: xxxx

- test:
    name:  xxxx
    api: api_xxxx_xxxx_POST()

case.yml

- config:
    name: xxxxxxxxx
    parameters:
        - phone: ${get_p2g_smoke_main_test_data(phone)}
        - password: ${get_p2g_smoke_main_test_data(password)}

- test:
    name: xxxxx
    api: api_aa_bb_POST()
 
 - test:
    name: xxxxx
    suite: suite_bb_cc()

- test:
    name: xxxxx
    variables:
        - order_no: ${get_approval_applications_from_customer_id_order_no(SMS, $phone)}
    api: api_management_peso2goUpdateAuditingResult()
    setup_hooks:
        - ${get_approval_applications_from_order_no_application_status($order_no)}
    teardown_hooks:
        - ${hook_sleep(60)}
        - ${get_core_loans_from_order_no_repay_status($order_no)}
发布了77 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/baidu_36943075/article/details/96351984