文章目录
目标是建立接口测试框架的思想。
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管理 |
debugtalk | py实现热加载 |
分层架构,如下表所示:
层数 | 描述 |
---|---|
第一层(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(变量名)}