当前位置: 首页 > 工具软件 > Report Runner > 使用案例 >

Httprunner学习笔记

易英奕
2023-12-01

一、HttpRunner的介绍

HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求

二、HttpRunner的设计理念

1、追求不重复造轮子                                                                  2、遵循 约定大于配置 的准则
3、追求投入产出比

三、HttpRunner的核心特性

1、继承 Requests 的全部特性
2、采用 YAML/JSON 的形式描述测试场景,保障测试用例描述的统一性和可维护性
3、借助辅助函数(debugtalk.py),在测试脚本中轻松实现复杂的动态计算逻辑
4、支持完善的测试用例分层机制,充分实现测试用例的复用
5、测试前后支持完善的 hook 机制
6、响应结果支持丰富的校验机制
7、基于 HAR 实现接口录制和用例生成功能(har2case)
8、结合 Locust 框架,无需额外的工作即可实现分布式性能测试
9、执行方式采用 CLI 调用,可与 Jenkins 等持续集成工具完美结合
10、测试结果统计报告简洁清晰,附带详尽统计信息和日志记录
11、极强的可扩展性,轻松实现二次开发和 Web 平台化

四、HttpRunner基本使用

1、环境准备

(1)运行环境:建议使用 Python 3.4 及以上版本
(2)安装方式:pip install httprunner
(3)安装校验:打开cmd,输入hrun -V命令进行校验,出现版本号则说明安装成功

 

2、脚本录制

为了简化测试用例的编写工作,可以通过抓包工具,如Fiddler、Charles 等进行接口录制,然后导出为标准通用的 HAR 格式(HTTP Archive),再通过 HttpRunner 将 HAR 格式的数据包转换为YAML/JSON格式的测试用例文件,对应的转换工具为:har2case。
    下面以Fiddler为例,进行脚本录制和导出。

操作步骤:


    选中需要转换的接口(可多选或全选),点击菜单中的Flie->Export Sessions->Selected session(选择HTTP Archive v1.1类型)保存至本地即可.
 

用Charles录制的方法大致相同,操作步骤为:选中需要转换的接口(可多选或全选),点击右键,在悬浮的菜单目录中点击【Export...】,格式选择HTTP Archive(.har)后保存即可

3、脚本生成

(1)将HAR转换为默认的JSON脚本,转换命令为:har2case filename.har

(2)将HAR转换为YAML脚本,转换命令为:har2case -2y filename.har

4、执行脚本

执行脚本的命令为:hrun filename.json 或hrun filename.yml
json格式和yaml格式:

  

5、查看报告

可以直接复制报告地址,查看测试报告,报告内容很详尽。点击log按钮,可以查看具体某个接口的请求和返回数据。                                                                           

6、创建项目

创建项目命令:hrun --startproject 新项目名称

项目的文件组织结构如下:
 

五、HttpRunner的项目结构

1、项目文件结构

以下为项目文件目录样例:
myobject
├── .env
├── data
│ ├── acount.csv
├── api
│ ├── demo_api.yml
├── debugtalk.py
├── reports
│ ├── 1550999327.html
├── testcases
│ ├──demo_testcase.yml
└── testsuites
│ ├──demo_testsuite.yml

2、文件类型说明

(1).env:项目环境变量,用于存储敏感信息
编写格式:key=value
引用方式:在YAML/JSON脚本中,直接使用内置函数ENV引用,即${ENV(key)}

(2)debugtalk.py:项目中逻辑运算辅助函数
① 编写常见功能和业务相关的函数,使得测试用例中可以引用函数,实现一些动态的计算逻辑,如获取时间戳、生成随机数、处理签名等
② 编写hook函数,使得测试用例执行前后可以调用钩子函数,实现测试的准备和清理工作,如初始化某个请求参数、修改响应结果的某个值等

③引用方式:在 YAML/JSON 格式的测试用例中,通过${func()}的方式引用

(3)api:接口定义描述

(4)testcases:存放测试用例

(5)testsuites:存放测试用例集

(6)data:存放测试数据

(7)reports:存放测试报告

3、测试用例分层

在自动化测试领域,自动化测试用例的可维护性是极其重要的因素,测试用例分层机制的核心是将接口定义、测试步骤、测试用例、测试场景进行分离,单独进行描述和维护,从而尽可能地减少自动化测试用例的维护成本
几个核心概念:

① 测试用例(testcase)应该是完整且独立的,每条测试用例应该是都可以独立运行的
② 测试用例是测试步骤(teststep)的有序集合,每一个测试步骤对应一个API的请求描述
③ 测试用例集(testsuite)是测试用例的无序集合,集合中的测试用例应该都是相互独立,不存在先后依赖关系的;如果确实存在先后依赖关系,那就需要在测试用例中完成依赖的处理

六、HttpRunner的测试用例组织

1、编写接口描述(api)

(1)模板样例demo_api.yml                                                                  

(2)模板说明

name:接口名称,命名可随意,没有什么作用

variables:变量信息,格式为key: value(注意冒号后面有一个空格,这是ymal文件规定的格式)

request:请求信息
       url:请求地址
     method:请求方法
       header:请求头
       data:请求参数 ,格式为key: value,value一般引用变量或函数,格式为:${var}、${func()}

validate:结果断言

2、编写测试用例(testcases)

(1)模板样例demo_testcase.yml                                                                

(2)模板说明

config:整个测试用例的全局配置
       name:测试用例名称,测试报告会显示该名称
       variables:全局变量
       teststeps:测试步骤,下面以列表形式编写一个或多个测试步骤,并且每一个测试步骤前面有‘-’
       name:测试步骤名称,测试报告会显示该名称
       api:引用接口描述文件,相对路径从根目录开始
       variables:局部变量,优先于全局变量,若此处填写了局部变量,则会覆盖config中的variable                  s全局变量
       extract:从响应结果中提取参数,并保存到变量中,给其他测试步骤引用
       validate:结果断言

(3)测试用例说明

① 每个测试用例都是一个独立用例,原则上不依赖其他测试用例,不考虑执行顺序
       ② extract结果断言的字段有:status_code、content、text,json、cookies、elapsed、headers、reason、enconding、ok、url
       若响应结果为json格式,可以通过content.xxx.0.id获取id(content为响应内容,xxx和id为字典的key,0为数组第一位。
       若响应结果为xml/html,可通过正则表达式来获取结果参数。
       ③ 校验器有:eq(=)、lt(<)、le(<=)、gt(>)、ge(>=)、ne(!=)、str_eq、len_eq、len_gt、len_ge、len_lt、len_le、contains、contained_by、type_match、regex_match、startswith、endswith

3、编写测试用例集(testsuites)

(1)模板样例demo_testsuite.yml                                                              

(2)模板说明

config:全局配置项
       name:测试用例集的名称

testcases:测试用例的集合
       name:测试用例名称
       parameters:参数化,有多种实现方式,具体参考下文中的参数化数据驱动(data)
       testcase:引用测试用例文件,相对路径从根目录开始
       variables:环境变量

(3)测试用例集说明

测试用例集的testcases是1个数组,数组的每个值为1个测试用例,一般有name和testcase两个参数,除此之外还可以进行参数化数据驱动。

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

七、HttpRunner的参数化数据驱动(data)

1、参数化方式

有三种方式,以下以登录为例:
(1)在 YAML/JSON 中直接指定参数列表:该种方式最为简单易用,适合参数列表比较小的情况    
 

(2)通过内置的 parameterize(可简写为P)函数引用 CSV 文件:该种方式需要准备 CSV 数据文件,适合数据量比较大的情况                                                                   

注:在 parameters 中指定的参数名称必须与 CSV 文件中第一行的参数名称一致,顺序可以不一致,参数个数也可以不一致。

(3)调用 debugtalk.py 中自定义的函数生成参数列表:该种方式最为灵活,可通过自定义 Python 函数实现任意场景的数据驱动机制,当需要动态生成参数列表时也需要选择该种方式                   

八、HttpRunner的hook机制和skip机制

1、编写hook函数

(1)两个层级
              测试用例层面(testcase):config 中新增关键字
              测试步骤层面(teststep): 测试步骤中新增关键字
       (2)关键字)
              setup_hooks: 在 HTTP 请求发送前执行 hook 函数,主要用于准备工作;也可以实现对请                                求的 request 内容进行预处理。
              teardown_hooks: 在 HTTP 请求发送后执行 hook 函数,主要用于测试后的清理工作;也                                可以实现对响应的 response 进行修改,例如进行加解密等处理。

在 debugtalk.py 文件中编写hook函数:

2、调用hook函数

hook 函数的定义放置在项目的 debugtalk.py 中,在 YAML/JSON 中调用 hook 函数采用 :${func(a)}的形式,a为函数里面的变量。

  1. skip/skipIf/skipUnless

skip:无条件跳过

skipIf :条件成立,返回值为True时跳过

skipUnless: 条件不成立,返回值为False时跳过

九、拓展应用

1、并发执行用例

并发执行可提高用例执行效率,一个进程执行一个yml文件,每个yml文件中的用例执行顺序还是一次执行的。修改httprunner源码的api.py文件中_run_suite函数。

2、修改报告模板

httprunner输出的html测试报告:默认的模板文件的路劲为 (python安装路径)+Lib+site-packages+httprunner/templates/report/html/template.html(使用的是jinja2的格式),可在gen_report.py中的gen_html_report方法中找到:

修改template.html模板中以下代码,需在末尾处添加endif

执行测试用例时,添加--report-template 路径/template_fail.html,如下:其中路径更换为自己默认所在的路径哦,以下是服务器的路径:

hrun  --report-template=/usr/local/python3/lib/python3.6/site-packages/httprunner/report/html/template_fail.html testcases/ --report-file=reports/${report_name}

 类似资料: