目标是建立接口测试框架的思想。

1 什么是httprunner?

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

2 httprunner的设计理念

充分复用优秀的开源项目,不追求重复造轮子,而是将强大的轮子组装成战车。
遵循约定大于配置的准则,在框架功能中融入最佳工程实践。
追求投入产出比,一份投入即可实现多种测试需求。

3 安装httprunner

httprunner需要在python环境下才能使用。

3.1 安装python

安装python,查看python的版本,如下图所示:
在这里插入图片描述

3.2 使用pip命令安装httprunner

在命令提示符窗口输入:pip intall httprunner,会出现如下图错误:
在这里插入图片描述
原因:安装微软最新发布AutoML框架NNI出现问题,错误:无法卸载“ PyYAML”。 这是一个distutils安装的项目,因此我们无法准确确定属于该文件的文件,而这只会导致部分卸载。
解决方法:输入命令:pip install --upgrade nni --ignore-installed
在这里插入图片描述
再次输入:pip intall httprunner,成功,如下图所示:
在这里插入图片描述
查看httprunner的版本,如下图所示:
在这里插入图片描述

httprunner的5个基本命令,如下表:

命令描述
httprunner主命令,用于所有功能
hrun用于运行yaml/json/pytest格式的测试用例
hmake用于将yaml/json测试用例转化成pytest文件
har2case用于将har文件转化为yaml/json/pytest测试用例
locusts用于性能测试

4 应用httprunner

通过抓包工具生成har文件,导入Pycharm编辑器,生成yaml/json/pytest文件。

4.1 抓包,生成har文件

使用抓包工具Fiddler,抓包,导出har文件。
以微信公众平台为例子。
在Fiddler的Composer输入url,该url包括账号和密码,如下图所示:
在这里插入图片描述

选中包,File->Export Sessions->selected Sessions…,如下图所示:
在这里插入图片描述

选中HTTParchive v1.2,点击【Next】按钮,如下图所示:
在这里插入图片描述

文件命名为get_token,如下图所示:
在这里插入图片描述

4.2 生成yaml/json/pytest文件

把生成的har文件导入Pycharm,项目结构,如下图所示:
在这里插入图片描述

输入命令har2case .\get_token.har,生成json格式文件,如下图所示:
在这里插入图片描述
删除json文件中的access_token断言,因为token时效为10分钟,保存下来没有意义,删除如下内容:

,
	{
		"eq": [
			"content.access_token",
"45_zo0cI1hRQhNoUKfLxsDAyCw0ozZZB_lc7Gy62bj1H9uRnLlXshYqH_g5FBuWC3VlmNk8enL-hCsbN3qumyyg1mRTjRtuiriApZd6ZKeDxu0oikKn4yF4PgUautvgfciX5O07iIxsWJj7CCVTPQCfAEAZAM"
				]
	},
	{
		"eq": [
			"content.expires_in",
			7200
               ]
	}

删除内容如下图所示:
在这里插入图片描述

输入命令har2case .\get_token.har -2y,生成yml文件,如下图所示:
在这里插入图片描述

,因为token值有实效,此处做断言没有意义,删除断言,如下图所示:在这里插入图片描述

输入命令hmake .\get_token.yml,生成py文件,如下图所示:
在这里插入图片描述

5 yml测试用例结构

HttpRunner 测试用例包括且仅有两部分:
config:测试用例的公共配置部分,包括用例名称、base_url、参数化数据源、是否开启 SSL 校验等。
teststeps:有序步骤的集合。采用了 go interface 的设计理念,支持进行任意协议和测试类型的拓展(甚至包括 UI 自动化)

config: 配置
    name: 用例名称
    variables: 全局变量
teststeps: 步骤
-   name: 步骤名称
    request: 请求
        headers: 请求头
            Postman-Token: 
            User-Agent: PostmanRuntime/7.28.0
        method: 请求方式
        params: 请求参数
        url: 请求地址
    validate: 断言

重点记住!!!

name//名称
request: //请求
	headers: //请求头
	method: //请求方式
	data: //请求参数
	url: //请求路径
	cookie: //cookie信息
extract: //提取(通过content/body提取,是json提取。也支持正则提取,但是容易报错!)
validate: //断言
	equals: //相等
	str_eq(str(a) = str(b)):  //字符串相等
	contains: //包含

6 测试用例中的接口关联

在request标签下一个标签写extract标签提取返回值,通过content或body提取。
使用$变量名使用该值。
例如:

extract:
	access_token: content.access_token
//通过$变量名使用
	access_token: $access_token

抓包,生成har文件,将select_flat.har导入项目中,如下图所示:
在这里插入图片描述

打开Command Prompt,如下图所示:
在这里插入图片描述

输入命令har2case -2y get_token.har,生成yml文件,在request标签下一个标签写extract标签提取access_token,通过content或body提取,如下图所示:
在这里插入图片描述
在该测试用例第二步,使用该access_token,使用方式:access_token: $access_token,如下图所示:
在这里插入图片描述

7 动态参数

通过debugtalk.py的热加载的方法实现。
创建一个debugtalk.py,写函数,实现功能。然后在yml文件中通过${函数名()}的方式调用。

以微信公众平台编辑标签为例子。
第一,生成har文件。抓包,生成har文件,将select_flat.har导入testcase03中,如下图所示:
在这里插入图片描述
第二,生成yml文件。输入命令har2case -2y edit_flag.har,如下图所示:
在这里插入图片描述

第三,查看yml文件,将第一步的access_token设置为动态获取,供第二步acceess_token使用,如下图所示:
在这里插入图片描述
第二步使用acceess_token,如下图所示:
在这里插入图片描述

第四,如何改变name中的后的数字呢?使用动态参数热加载的方式。
在testcase03下新建debugtalk.py,如下图所示:
在这里插入图片描述
第五,运行yml文件,输入命令hrun edit_flag.yml,查看日志文件,如下图所示:
在这里插入图片描述
最后,使用debugtalk.py实现热加载成功。

8 环境变量

环境变量主要分为测试环境,开发环境,预发布环境和线上环境。不同之处就是url地址的值。
在yml文件中的config添加:

base_url: url

例如:在edit_flag.yml设置base_url,如下图所示:
在这里插入图片描述
即在下面的步骤中不需要写https://api.weixin.qq.com,如下图所示:
在这里插入图片描述
输入命令hrun edit_flag.yml,成功运行结果,如下图所示:
在这里插入图片描述

9 全局变量和局部变量

全局变量在整个yml文件都可以使用,局部变量仅在某一个步骤中使用。
config下的variables是全局变量。
teststeps下的variables是局部变量。

9.1 设置全局变量

例如:在edit_flag.yml文件,把appid,grant_type和secret设置为全局变量,如下图所示:
在这里插入图片描述

不换行的写法,如下:

variables: {appid: xxxxxx,grant_type: client_credential,secret: xxxxxxxxxxxx}

9.2 设置局部变量

例子:以edit_flag.yml例子,teststeps中的id设置为局部变量,如下图所示:
在这里插入图片描述

10 生成HTML格式的报告

格式如下:

hrun 项目名 --html=项目名/输出文件路径/文件名.html

查看项目名称,如下图所示:
在这里插入图片描述
回退到Python_basictrain目录,输入命令
hrun test_httprunner --html=test_httprunner/reports/report.html
查看report.html,如下图所示:
在这里插入图片描述
和pytest里面的pytest-html插件的报告格式一样。

11 httprunner常规关键字

httprunner的yml文件的结构,也是测试用例的文件结构,如下:

config: //配置
	name://测试用例名称
	variables: //全局变量
teststeps://步骤
	name://步骤名
	request://请求
		headers://请求头
		method: //请求方式
		data: //参数
		url: //请求路径
		cookie: //cookie信息
	extract: //提取(通过content或body提取)
	validate: //断言
		equals //相等
		ne //不相等
		str_eq //str(a)=str(b)
		lt //小于
		le //小于或等于
		gt //大于
		ge //大于或等于
		contains //包含

如下图所示:
在这里插入图片描述

12 httprunner项目架构

重新构建项目结构,如下图所示:
在这里插入图片描述

项目结构分析,如下表:

文件描述
har存放har文件
reports存放报告
testcases存放测试用例
api存放yml文件,定义接口
data数据驱动
testsuites测试套件
.env存放环境变量
.gitgnore使用git做版本控制时,添加在此文件中的文件不会被git管理
debugtalkpy实现热加载

分层架构,如下表所示:

层数描述
第一层(api)接口定义层。管理接口,每一个接口定义尽量能够单独运行。
第二层(testcases)测试用例层。测试用例由一个或多个接口构成。
第三层(testsuites)测试套件层。由一条或多条用例组成。

testcases层调用api层,使用api关键字。testsuites调用testcases层,使用testcase关键字。

12.1 har文件夹

通过抓包工具Fiddler,在Composer地址栏输入请求地址,如下图所示:
在这里插入图片描述

将抓到的三个包导入项目的har文件夹,如下图所示:
在这里插入图片描述

12.2 api文件夹

api文件存放yml格式文件。
进入har文件夹目录下,输入命令:har2case get_token.har -2y,转换为yml文件,如下图所示:
在这里插入图片描述
再将yml文件存放在api文件夹下,如下图所示:
在这里插入图片描述
将teststeps中的数据参数化,设置为全局变量,如下图所示:
在这里插入图片描述

提取access_token值,供其他接口使用,如下图所示:
在这里插入图片描述

12.3 testcases文件夹

testcases文件夹存放测试用例。
设置get_token_case.yml测试用例,将获取token值设置为一条测试用例,写上teststeps的name,如下图所示:
在这里插入图片描述

在httprunner_demo目录下,即项目的根目录,输入hrun testcases/get_token_case.yml,如下图所示:
在这里插入图片描述
编写查询标签的测试用例,查询标签之前必须要有access_token值,所以该测试用例分两步。第一步,查询access_token;第二步,查询标签,需要export引入access_token。编写测试用例yml文件,如下图所示:
在这里插入图片描述

12.4 testsuites文件夹

testsuites文件夹存放夹具,即多条测试用例。
testsuites文件存放测试用例,将testcases中的get_token_case.yml和select_flag_case.yml放到同一夹具test_suites.yml中,如下图所示:
在这里插入图片描述

在httprunner_demo目录下,输入hrun testsuites/test_suites.yml,如下图所示:
在这里插入图片描述
运行结果,如下图所示:
在这里插入图片描述

12.5 .env文件

在.env文件中可以写开发环境,测试环境,生产环境和线上环境等等。不同之处就是url不同,.env文件内容,如下图所示:
在这里插入图片描述
注意:.env文件是在跟目录下的。
调用.env文件中的变量格式如下:

${ENV(变量名)}

在api文件夹下的get_token.yml调用product_env变量,如下图所示:
在这里插入图片描述

在项目根目录httprunner_demo下,直接使用夹具,输入命令hrun testsuites/test_suites.yml,如下图所示:
在这里插入图片描述

运行结果,如下图所示:
在这里插入图片描述
问题:每次运行都要输入命令,不够快捷。
办法:在根目录新建all.py文件,代码如下:

import os

if __name__ == '__main__':
    os.system("hrun testsuites/test_suites.yml")

运行结果,如下图所示:
在这里插入图片描述

小结

hrun用于运行yaml/json/pytest格式的测试用例。
har2case用于将har文件转化为yaml/json/pytest测试用例。

yml测试用例结构重点记住

name//名称
request: //请求
	headers: //请求头
	method: //请求方式
	data: //请求参数
	url: //请求路径
	cookie: //cookie信息
extract: //提取(通过content/body提取,是json提取。也支持正则提取,但是容易报错!)
validate: //断言
	equals: //相等
	str_eq(str(a) = str(b)):  //字符串相等
	contains: //包含

在request标签下一个标签写extract标签提取返回值,通过content或body提取,实现接口关联。
通过debugtalk.py的热加载的方法实现动态参数。
环境变量是为了切换url地址。
全局变量在整个yml文件都可以使用,局部变量仅在某一个步骤中使用。
config下的variables是全局变量。
teststeps下的variables是局部变量。
har文件由抓包工具获得。
api文件夹存放yml文件,yml文件由har文件转换过来的,命令har2case xxx.har。
testcases文件夹存放测试用例。测试用例是yml文件。
testsuites文件夹存放夹具,即多条测试用例。testcases下存放testcases,testcases的值为参数用例yml文件。
.env文件存放环境变量。调用.env文件中的变量格式:${ENV(变量名)}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐