1.httprunner介绍
HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份YAML/JSON脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。
中文用户手册:
https://cn.httprunner.org/
开发设计文档:
https://debugtalk.com/tags/HttpRunner/
2.核心特性
继承 Requests 的全部特性,轻松实现 HTTP(S) 的各种测试需求
测试用例与代码分离,采用YAML/JSON的形式描述测试场景,保障测试用例具备可维护性
测试用例支持分层机制,充分实现测试用例的复用
测试用例支持参数化和数据驱动机制
使用 skip 机制实现对测试用例的分组执行控制
支持热加载机制,在文本测试用例中轻松实现复杂的动态计算逻辑
基于 HAR 实现接口录制和用例生成功能(har2case)
结合 Locust 框架,无需额外的工作即可实现分布式性能测试
执行方式采用 CLI 调用,可与 Jenkins 等持续集成工具完美结合
测试结果统计报告简洁清晰,附带详尽统计信息和日志记录
具有可扩展性,便于扩展实现 Web 平台化(HttpRunnerManager)
3.框架流程
4.环境配置
HttpRunner 是一个基于 Python 开发的测试框架,可以运行在 macOS、Linux、Windows 系统平台上。
Python 版本:HttpRunner 支持 Python 3.4 及以上的所有版本,并使用 Travis-CI 进行了持续集成测试,测试覆盖的版本包括 2.7/3.4/3.5/3.6/3.7。虽然 HttpRunner 暂时保留了对 Python 2.7 的兼容支持,但强烈建议使用 Python 3.4 及以上版本。
HttpRunner 的稳定版本托管在 PyPI 上,可以使用 pip 进行安装。
控制台上使用
pip install httprunner
建议使用PyCharm进行安装:
File—>Settings—>Project Interpreter—>+ 搜索httprunner选择安装。
坑:安装httprunner固定版本2.3.2
安装成功后,找到hrun.exe所在的目录,添加到环境变量path中
cmd验证
hrun -V
5.HttpRuuner json用例基本格式
注意 httprunner中所有的键 都是固定
config 作为整个测试用例集的全局配置项
base_url 主机路径
name 所属模块名称
variables 环境变量(参数化)…根据需要的话,添加这个variables
teststeps测试步骤(指的是每一条接口测试用例)
{}表示一条测试用例
每一条测试用例包含:
name:接口名称
request:表示一个接口请求对象
method:请求方式
url:请求路径
params:get方式的请求参数
data:post方式的请求参数
json:表示上传json格式数据
headers:请求头
validate:预期结果,预期结果可以有多个 —列表
{}表示一条预期结果
eq=equals 预期结果和实际结果是否一致
contains 实际结果是否包含预期结果
content用于表示返回的实体内容 ----> 类似于postman里面用json表示返回实体内容对象
6.指令生成项目基本结构(脚手架)
6.1、Win+R打开终端,cd进入创建项目的目录下输入
6.2、hrun --startproject 项目名称
6.3、将项目导入Pycharm中目录结构如下:
api目录下为接口的详细信息
reports目录下为生成的报告
testcases目录下为测试用例
testsuites为测试套件
.env存储项目环境变量,通常用于存储项目敏感信息
debugtalk.py文件用于编写函数辅助测试
7.pycharm中设置json文件打开方式
8.发送get请求
{
“config”: {
“name”: “作文大全”,
“base_url”: “http://zuowen.api.juhe.cn”,
“variables”: {
}
},
“teststeps”: [
{
“name”: “作文list接口”,
“request”: {
“method”: “GET”,
“url”: “/zuowen/typeList”,
“params”: {
“id”: “1”,
“key”: “be7aba223449062e97f5a2ca98c74103”
}
},
“validate”:[
{“eq”:[“status_code”,200]}
]
}
]
}
9.单个Test_Case执行
import os
os.system(“测试用例路径”)
10.发送post请求
{
“config”: {
“name”: “周公解梦”,
“base_url”: “http://open.smallsword.cn”,
“variables”: {
}
},
“teststeps”: [
{
“name”: “暗恋的人”,
“request”: {
“method”: “post”,
“url”: “/api.php”,
“params”: {
“c”: “meng”,
“a”: “jiemeng”
},
“data”:{
“mengid”: “5”,
“openudid”: “1256FA0F-FF3B-40F3-A2B7-C4127EC8063D”
}
},
“validate”:[
{“eq”:[“status_code”,200]},
{“eq”:[“content.msg”,“操作成功。”]}
]
}
]
}
11.多个Test_Case执行
{
“config”: {
“name”: “测试用例集合”
},
“testcases”: [
{
“name”: “GET请求”,
“testcase”: “testcases/test01.json”
},
{
“name”: “POST请求”,
“testcase”: “testcases/test02.json”
}
]
}
执行
import os
os.system(“hrun C:\Users\Asan\Desktop\code\Httprunner_demo\testsuites\test_suites.json”)
12.HTML报告解析
13.配置json创建模板
模板内容
{
“config”:{
“name”: “模块名称”,
“base_url”: “主机路径”,
“variables”: {
}
},
“teststeps”: [
{
“name”: “接口名称”,
“request”: {
“method”: “请求方式”,
“url”: “接口路径”,
“params”: {
“参数名”: “参数值”
}
},
“validate”: [
{“eq”: [“断言”]}
]
}
]
}
14.环境变量(.env)
14.1.环境变量的作用
在自动化测试中,有时需要借助环境变量实现某些特定的目的,常见的场景包括:
切换测试环境
切换测试配置
存储敏感数据(从信息安全的角度出发)
14.2.通过.env设置环境变量
HttpRunner 运行时,会自动将 .env 文件中的内容加载到运行时(RunTime)的环境变量中,然后在运行时中就可以对环境变量进行读取了,存储采用 name=value 的格式
14.3.引用环境变量
15.参数化
15.1.variables中参数化
作用于整个测试用例(json/yml文件),可用于里面的每个请求中
15.2.Testsuites中参数化
15.3.cvs参数化
1.data文件夹下面放csv数据,第一行为变量名称
2.测试套件testsuites里面 关联需要测试的测试用例文件 并读取csv数据
3.测试用例里面引用,就可以实现写一个接口用例 执行多次
15.4.debugtalk.py调用python函数(参数化)
HttpRunner 的实现方式为,支持热加载的插件机制(debugtalk.py),可以在 YAML/JSON 中调用 Python 函数
我们可以在测试用例文件的同级或其父级目录中创建一个 debugtalk.py 文件,然后在其中定义相关的函数和变量
import random
def getrandomid():
return random.randint(1,5)
在 YAML/JSON 测试用例文件中,引用变量的方式是采用$ + 变量名称的方式;调用函数的方式为${函数名()}
16.文件上传
debugtalk.py中编写函数提供上传文件对象
json测试用例编写
17.接口依赖
在 HttpRunner 中,支持接口之间的依赖,提取参数值使用extract 关键字和引用提取的数据使用$var,extract 的列表中可指定一个或多个需要提取的参数
在提取参数时,当 HTTP 的响应结果为 JSON 格式,则可以采用.运算符的方式,逐级往下获取到参数值;响应结果的整体内容引用方式为 content 或者 body
content对象取值
{
“code”: 0,
“msg”: “login success!”,
“username”: “test”,
“token”: “b3f7e8e12d23591ea671374dee818c63b1599d4d”
}
content.code 取出code后面对应的值0
content.msg 取出msg后面的对应值"login success!"
list类型取值
[{
“age”: 20,
“create_time”: “2019-09-15”,
“id”: 1,
},
{ “age”: 21,
“create_time”: “2019-09-16”,
“id”: 2,
} ]
content.1 取出list里面的第二组数据{“age”: 21, “create_time”: “2019-09-16”, “id”: 2}
content.0.age取出第一组数据的age对应值20
{
“config”: {
“name”: “接口依赖”,
“base_url”: “http://v.juhe.cn/historyWeather”
},
“teststeps”: [
{
“name”: “获取支持省份列表”,
“request”: {
“url”: “/province”,
“method”: “GET”,
“params”: {
“key”: “eee1da697c1e08cfc566cbc5d84ad5f9”
}
},
“extract”: [
{
“id”: “content.result.0.id”
}
],
“validate”: [
{“eq”:[“status_code”,200]}
]
},
{
“name”: “获取支持的城市地区列表”,
“request”: {
“url”: “/citys”,
“method”: “get”,
“params”: {
“province_id”: “$id”,
“key”: “eee1da697c1e08cfc566cbc5d84ad5f9”
}
},
“validate”: [
{“eq”:[“status_code”,200]}
]
}
]
}