【python】httprunner接口自动化框架

httprunner接口自动化框架

一、为什么选择httprunner?

  • HttpRunner是一个开源的 API 测试工具环境搭建,相比于其它 API 测试工具,HttpRunner 最大的不同在于设计理念:
  • 约定大于配置:测试用例是标准结构化的,格式统一,方便协作和维护;
  • 标准开放:基于开放的标准,支持HAR/Postman/Swagger等工具对接,轻松实现用例生成和转换;
  • 一次投入多维复用:一套脚本可同时支持接口自动化测试、性能测试;
  • 追求不重复造轮子,追求投入产出比;
  • Httprunner和其他开源框架相比,我们只需在yaml文件维护测试用例即可,不需要代码要求,但是需要严格遵循yanl格式编写,否则在后续不好排查错误,这也是httprunner的一个缺点;
  • 目前市面上接口工具多,学习成本高,团队协作较困难,对语言能力有一定要求,门槛较高;

二、环境搭建(Python安装)

1、python版本:2.7/3.7及以上版本,建议3.7及以上版本

2、验证安装是否成功

  • 打开cmd命令行 输入python,如果能进入python命令模式就证明成功了

Untitled

3、安装httprunner第三方库

pip install httprunner==2.5.7 如果官网无法下载就加国内镜像 -i https://pypi.doubanio.com/simple

4、查看命令行指令(掌握几个常用即可)

  • 创建一个项目,可以在命令行查看httprunner帮助
  • httprunner -h 或者 hrun -h

Untitled

Untitled

5、创建脚手架

  • 创建项目:hrun –startproject demo

Untitled

6、安装第三方依赖()

  • 可以在根目录下建个requirements.txt文件,需要安装的python依赖都在这个文件里面,进入到目录下,执行以下命令进行安装:

pip install –r requirements2.txt

三、框架结构

1、目录结构

Untitled

分层思想:

  • api定义层:最底下的一层是api的定义层,最底
  • testcase层:测试用例层,调用定义层的内容,中间
  • testsuite:测试套件层,把用例装起来,最上

Untitled

api目录:存放描述api信息的yaml文件

  • 特别注意:yml文件需遵循严格的缩进,缩进多少格无所谓,只要保证同一层级的key对齐即可

Untitled

字段解释:

  • name:对api进行描述
  • variables:把参数作为变量从外部传给api,可以将变量的参数都定义在variables
  • request:这个字段下放的都是api的基本信息如
    • url(请求地址),
    • method(请求方法),
    • headers(请求头),
    • data/params/json/file (请求参数)

一般接口有3种方式的请求参数

  • 1.params字段传参:
    • 以key,value键值对方式放在url后面的参数用params字段去定义
  • 2.json字段传参:
    • 放在body以json格式参数的用json字段去定义
  • 3.c.data字段传参:
    • 放在body非json格式的参数用data字段去定义,如headers中

content-type=application/x-www-form-urlencoded

参数引用:引用符:$

Untitled

  • variables:api的ymal文件下:如果我们要把参数作为变量从外部传给api,那就把作为变量的参数都定义在variables字段下,如下图中的loginPara就可以被其它任何地方引用。

Untitled

  • validate:校验字段,需要校验的数据都写在这个字段下

Untitled

1.2 testcases目录:存放描述测试用例的yaml文件

  • config:指这条用例的配置信息,用例的一些配置信息可以写在这个字段下面,比如:
    • name(必须的): 这条用例的名字,
    • base_url(可选择的): 接口的host地址,一般写域名
    • variables(可选择的): 这条用例的一些变量,保存的变量,可以被下面引用
    • verify(可选,但默认false):指定是否验证服务器的TLS证书。如果想要记录testcase中的http数据特别有用。如果不设置或者设置为true则会产生SSLError错误。
    • export(可选择的,必须会):提取testcase的session变量。测试用例是为黑盒,config中的的variables视为输入,export为输出。特别是,当该testcase中的某个输出作为下一个testcase中的输入的时候特别有用。参数传递用的,
    • output(可选择的):为了把变量暴露出来,打印日志时看的更清楚(比如说你提取了token,可以打印一下这个token看看自己有没有提取成功)

teststeps::指用例中的步骤,每一步就是调用一个api,test下面配置的字段就是这个步骤中涉及的字段,比如:

  • name:步骤描述

  • api: 指定调用的api路径文件。基于根目录的相对路径

  • testcase: 指定testcase的路径文件

  • extract: 提取响应中的字段(比如这个接口返回中的某个字段作为下 一个接口的参数),可以提取的内容包含以下内容:

    • atus_code、cookies、elapsed(响应时间)、headers、content、 text、 json、 encoding、ok、 reason、url
  • variables:如果要把参数作为变量从外部传给api,那就把作为变量的 参数都定义在variables字段下,设置变量供下面用

    • 引用debugtalk里面的数据库查询方法时,要在这里定义一个字段,
      - 先把sql语句定义成一个字段,然后把sql语句引用到方法里面去,如下:
      - 参数引用${ENV(STATIONNAME)的时候,要在variables下面先定义再引用

      Untitled
  • validate:校验字段,需要校验的数据都写在这个字段下,就是断言,下面会讲断言用法

  • ⑦ 碰到列表的时候,用list.0去提取。点0是表示提取索引下标为0的列表进行提取

    • - eq: [ json.data.list.0.couponName, "自动化测试兑换" ]

testsuites目录:存放用例集的yaml文件

Untitled

字段解释:

  1. testcases:指这条用例集,要执行的用例都现在这个字段下面
  2. testcase:用例的路径字段
  3. parameters:参数化字段,外部传的参给用例,都可以写在这个字段下面,测试数据中的参数可以写在这下面

用例编写

  • 参数引用:在yaml文件中用“$”符号实现对参数的引用 比如:

Untitled

  • 2.2函数引用:在yaml文件中通过“${}”实现对函数的引用,比如:

Untitled

  • 所有函数都定义在debugtalk.py文件中,
  • 如果在测试中有需要写代码处理的,就可以把代码写在debugtalk.py文件中,然后用例中就可以直接引用了。

Untitled

运行接口

方式一:

  • 使用命令行调试:hrun .\testsuites\xx测试集.yml
  • 如果要打印运行详细日志,在命令后面加上–log-level

hrun .\testsuites\xx测试集.yml –log-level debug

Untitled

Untitled

方式二:

  • 在工程跟目录下有一个runtest.py文件,里面指定要执行的文件路径就可以运用用例了,右键——Run rentest 就可以执行,执行后会在report目录下生成测试报告
  • 通过os.system可以调用cmd命令,方便自己调试用。
  • 注意一下,cmd命令的斜杠是反斜杠,注意斜杠加t需要双斜杠,不然会编译错误

Untitled

Untitled

测试报告

报告保存在report目录下,每次执行完都会生成测试报告,用浏览器即可打开进行查看

Untitled

Untitled

一些特殊接口—图片上传接口

用抓包软件看到接口传参如图所示

注意:requests库会自动添加这个元素 {“Content-Type”:”multipart/form-data”} ;加了反而会报错,从而导致请求不成功。

在前端允许和支持上传的所有格式文件中,当选择不同格式文件时对接口发起请求时,

Form Data会自动识别文件的Content-Type【根据传入的文件格式自动解析为headers中的Content-Type】以及Content-Disposition【该字段中包括接口的传参类型(例如下图的form-data),传入文件名(例如下图的filename)等】。

Untitled

所以参数我们可以如图中files字段那样定义

Untitled

测试数据

Untitled

data目录下就是存放测试数据文件,我们需要上传文件或图片的数据可以放在这个目录下,或api中的一些参数数据可以以csv文件格式存放在这个目录下

参数化:

对测试数据的引用

  • 在用例中怎么使用测试数据文件中的数据呢,
  • 框架中有个读取数据文件的函数P,
  • 引用时参入数据文件地址作为参数 ${P(data/对应的csv.csv)} 对应的csv.csv 文件内容如图,

Untitled

  • 注意:只能在testsuite中对测试数据的引用,测试数据中的参数可以 字段名-字段名的方式进行获取。qudaologin.csv中有几条记录,这样用例就会执行几次
  • 再说一遍,只能在testsuite里面引用csv参数,
    • 在testcase的下面加一个字段parameters:下面再接需要被传参的字段名
    • csv的参数有多少行,对应的用例就会被执行多少次

Untitled

直接赋值参数

  • 多个关联参数,可以按照下图中的方式对用例参数进行赋值,进行该配置后,测试用例在运行时就会对 name,result实现数据驱动,即分别运行 3次测试,并且保证参数值总是成对使用。

Untitled

单个参数关联

  • 单个参数可以直接就可以按照如下方式进行配置,即分别使用 [1,2,3,4,5,6,7] 7个值运行测试用例。

Untitled

环境变量:

  • 工程目录下有个.env文件,里面可以配置测试环境的地址,如图所示

Untitled

  • 框架有个获取环境文件的函数ENV, 调用时可以引用函数获取变量${ENV(TESTENV)}

Untitled

9. 断言校验

框架中已实现如下校验

Untitled

Untitled

9.2自定义校验函数

对于自定义的校验函数,需要遵循三个规则:

  1. 自定义校验函数需放置到debugtalk.py中
  2. 参数有两个:第一个为原始数据,第二个为原始数据经过运算后得到的预期结果值
  3. 在校验函数中通过assert将实际运算结果与预期结果值进行比较

如图:在debugtalk.py文件中定义校验函数

Untitled

然后在用例校验的时候引用这个校验函数

Untitled

9.3修改框架校验函数:不建议

  • 在httprunner>builtin>comparator新增自定义校验,然后在parser文件中定义校验缩写方法

Untitled

Untitled

9.4校验支持正则校验:

Untitled

Untitled

9.5数据库校验:

框架实现了对数据库的查询,操作数据库的原理是根据输入的SQL语句 过滤出要操作的tableName, 然后去配置文件中找到对应得tableName所在的地址和库进行连接和操作,操作数据库需要做如下配置,在跟目录下有个database.ini文件,在里面配置数据库相关信息

Untitled

Untitled


【python】httprunner接口自动化框架
http://example.com/2023/12/24/httprunner接口自动化框架/
作者
Wangxiaowang
发布于
2023年12月24日
许可协议