HttpRunner框架 核心知识的系统复习
1. HttpRunner 介绍
-
是什么:基于 Python 的开源接口自动化测试框架,支持 HTTP(S)/WebSocket/RPC 等协议,集成了接口测试、性能测试、持续集成等功能。
-
核心特性:
-
用例格式:支持 YAML/JSON/Python 编写测试用例。
-
链式调用:支持接口间的参数关联(提取响应数据供后续接口使用)。
-
数据驱动:支持 CSV、Excel、数据库等多种数据源。
-
多协议支持:HTTP/WebSocket/私有协议扩展。
-
性能测试:集成 Locust 实现压测。
-
-
适用场景:接口自动化测试、微服务测试、持续集成(CI/CD)。
2. 环境搭建
安装 HttpRunner
bash
复制
pip install httprunner
验证安装
bash
复制
hrun -V # 输出版本号(如 4.0+)
3. 项目结构
通过脚手架快速生成项目:
bash
复制
hrun --startproject demo_project # 生成标准项目结构
生成的目录结构:
复制
demo_project/ ├── testcases/ # 存放测试用例(YAML/JSON/Python) ├── reports/ # 测试报告 ├── env/ # 环境变量配置 ├── data/ # 测试数据(CSV/Excel) └── debugtalk.py # 自定义函数和全局变量
4. 用例编写规则
4.1 YAML/JSON 用例格式
-
核心字段:
yaml
复制
config: name: "用例名称" variables: {} # 全局变量 base_url: "http://api.example.com" verify: false # 关闭SSL验证 teststeps: - name: "步骤1_登录" request: method: POST url: /login json: username: test password: "123456" extract: # 提取响应数据 token: content.token validate: # 断言 - eq: [status_code, 200] - eq: [content.code, 0] - name: "步骤2_查询用户信息" request: method: GET url: /userinfo headers: Authorization: Bearer $token # 使用提取的token
4.2 Python 用例格式
支持用纯 Python 编写用例(类似 pytest):
python
复制
from httprunner import HttpRunner, Config, Step, RunRequest
class TestUser(HttpRunner):
config = Config("用户管理").base_url("http://api.example.com")
teststeps = [
Step(
RunRequest("登录")
.post("/login")
.with_json({"username": "test", "password": "123456"})
.extract()
.with_jmespath("body.token", "token") # 提取token
.validate()
.assert_equal("status_code", 200)
),
Step(
RunRequest("获取用户信息")
.get("/userinfo")
.with_headers({"Authorization": "Bearer $token"})
.validate()
.assert_equal("body.code", 0)
)
]
5. 核心功能
5.1 参数关联
-
提取响应数据:使用
extract
字段提取数据供后续步骤使用。yaml
复制
extract: user_id: content.user.id # 从JSON响应中提取user_id
5.2 变量优先级
有几种不同类型的variables,优先顺序可能会造成混淆。避免混淆的最好方法是使用不同的变量名。但是,如果必须使用相同的变量名,则应该了解优先级策略。
变量优先级按以下顺序排列:
存在extract提取变量值的,优先取提取中参数
在无extract时,优先取config变量
在无config变量时,优先取用例中变量
以上均无时,取api变量
5.3 数据驱动
-
CSV 数据驱动:
yaml
复制
config: name: "数据驱动示例" parameters: username-password: ${P(data/user.csv)} # 从CSV读取数据 teststeps: - name: "登录" request: method: POST url: /login json: username: $username password: $password
5.4 断言(Validate)
支持多种断言方式:
yaml
复制
validate:
- eq: [status_code, 200] # 状态码
- eq: [headers.Content-Type, "application/json"] # 响应头
- contains: [content.message, "success"] # 响应体包含文本
- regex_match: [content.data, "\\d{6}"] # 正则匹配
5.5 Hooks(钩子函数)
-
setup_hooks:在请求前执行(如加密参数)。
-
teardown_hooks:在请求后执行(如清理数据)。
yaml
复制
request: method: POST url: /payment json: amount: 100 setup_hooks: - ${encrypt_request($request)} # 调用自定义加密函数
httprunner 2.x,setup_hooks在variables下面需要缩进
6. 运行与报告
6.1 运行用例
bash
复制
hrun testcases/login.yml # 运行单个用例
hrun testcases/ --html report.html # 生成HTML报告
6.2 Allure 报告
-
安装依赖:
bash
复制
pip install allure-pytest
-
生成 Allure 报告:
bash
复制
hrun testcases/ --alluredir=./allure-results allure serve ./allure-results # 查看报告
7. 高级功能
7.1 性能测试(集成 Locust)
-
将接口用例转换为 Locust 压测脚本:
bash
复制
hrun testcases/demo.yml --locustfile locustfile.py
-
运行压测:
bash
复制
locust -f locustfile.py
7.2 自定义函数
在 debugtalk.py
中编写自定义函数:
python
复制
def encrypt_request(request):
request["json"]["sign"] = generate_md5(request["json"])
return request
在用例中调用:
yaml
复制
setup_hooks:
- ${encrypt_request($request)}
7.3 环境变量管理
在 env/
目录下定义环境变量(如 env/dev.env
):
ini
复制
base_url=http://dev.api.com
username=test_dev
password=dev_123456
运行指定环境:
bash
复制
hrun testcases/ --env dev
8. 最佳实践
-
用例分层设计:
-
将公共配置(如
base_url
)放在config
中。 -
使用
variables
管理全局变量。
-
-
数据与逻辑分离:
-
测试数据存储在
data/
目录(CSV/Excel)。 -
业务逻辑在
testcases/
中维护。
-
-
复用性优化:
-
使用
引用外部用例
(通过testcase
字段)复用步骤。
-
-
CI/CD 集成:
yaml
复制
# GitHub Actions 示例 - name: Run Tests run: hrun testcases/ --alluredir=./allure-results - name: Upload Report uses: actions/upload-artifact@v2 with: name: allure-report path: ./allure-results
9. 常见问题
9.1 动态参数处理
-
场景:接口需要动态生成的参数(如时间戳、随机手机号)。
-
解决:在
debugtalk.py
中定义函数生成参数:python
复制
import random def random_phone(): return f"138{random.randint(10000000, 99999999)}"
用例中调用:
yaml
复制
json: phone: ${random_phone()}
9.2 依赖登录态
-
场景:多个用例依赖登录接口返回的 Token。
-
解决:将登录步骤封装为
setup_suite
或使用session
共享 Cookie。
10. 总结
-
核心优势:
-
易用性:YAML/JSON 格式降低用例编写门槛。
-
灵活性:支持参数关联、数据驱动、自定义函数。
-
扩展性:与 Locust、Allure、CI/CD 工具无缝集成。
-
-
适用项目:HTTP 接口为主的 Web 服务、微服务架构系统。