ApiMeter
ApiMeter 是一个简洁优雅、功能强大的 HTTP(S) 接口测试框架,基于 httprunner.py 扩展,实现只需编写维护一份 YAML/JSON 脚本,便可高效实现接口自动化测试、性能测试、线上监控、持续集成等多种测试需求。Enjoy! ✨ 🚀 ✨
✨ 为什么选择 ApiMeter?
🔍 httprunner.py 已停止更新维护
- 2022-04-30 httprunner.py 发布 v2.5.9 后已停止更新维护;
- httprunner.py 简单强大轻量级,适合接口平台集成化开发,而 HttpRunner 已开始往大而全方向发展;
- httprunner.py 随着日常业务迭代与应用,越来越多的新需求不断产生且需要被满足,因此催生了 ApiMeter;
🔥 相比 httprunner.py 的核心优势
1. 增加更灵活的校验能力 - script 自定义脚本校验
validate校验方式需要记忆各种校验器语法,功能有限:
validate:
- eq: ["status_code", 200]
- len_eq: ["content.token", 16]
- eq: ["content.success", true]
script校验方式支持任意 Python 脚本,零学习成本:
script:
- assert status_code == 200
- assert len(content.token) == 16
- assert content.success is True
- |
if status_code == 200:
assert content.success is True
else:
assert content.error_code is not None
- |
for item in content.items:
assert item.get("id") is not None
- assert elapsed.total_seconds < 2.0
- ${validate_user_data(content.user)}
核心特性:
- ✅ 使用标准 Python 语法,符合开发者直觉
- ✅ 支持条件判断、循环、自定义函数
- ✅ 逐条执行,单条失败不中断其他校验,提供详细执行结果和错误信息
- ✅ 自定义函数校验遵循assert理念「失败即异常」,释放无限校验方式的可能性
- ✅ 非常适合批量数据校验场景,推荐结合通用数据校验器使用
2. 更强大的自定义函数参数支持
支持列表参数:
request:
json:
sign: ${get_sign_v2([$device_sn, $os_platform, $app_version])}
支持字典参数:
request:
json:
sign: "${get_sign_v3({device_sn: $device_sn, os_platform: $os_platform, app_version: $app_version})}"
支持复杂嵌套对象:
script:
- "${check_nested_list_fields(content, {list_path: productList, nested_field: sku, check_fields: [id, amount, currency]})}"
支持链式参数 + 通配符 + 正则表达式:
script:
- ${check(content, data.product.purchasePlan.*.sku.*.id, data.product.purchasePlan.*.sku.*.amount)}
- ${check(content, '_url ~= ^https?://[^\s/$.?#].[^\s]*$', 'default_currency =* [USD, CNY]', 'product @= dict')}
3. 更灵活的全局变量系统
无缝访问响应数据,无需特殊语法:
script:
- assert status_code == 200
- assert headers["Content-Type"] == "application/json"
- assert content.user.name is not None
- assert cookies.session_id is not None
- assert content.data.user.profile.age > 18
- assert content.items[0].price > 0
支持变量转义,解决字段名与全局变量冲突:
script:
- ${check_field_exists(data, \content)}
可用的全局变量:
status_code, headers, cookies, content, body, json, elapsed, ok, reason, url, response
4. 更友好的测试报告
智能内容折叠:
- 超过 15 行的内容自动折叠,提升可读性
- 一键展开/折叠和复制
JSON 树形展示:
- 自动识别 JSON 和 Python 字典
- 彩色语法高亮
- 节点级别展开/折叠
- 应用于所有关键数据字段(请求体、响应体、请求头、响应头、校验器、Script)
Script 执行结果展示:
- 每条脚本的执行结果
- 失败脚本的详细错误信息
- 执行结果返回值输出
报告优化选项:
hrun testcases/ --html report.html --skip-success
🚀 快速开始
安装
pip install apimeter
安装后可用命令:apimeter、meter、api、hrun、apilocust
5 分钟快速上手
创建测试文件 test_api.yml:
config:
name: "快速开始示例"
variables:
base_url: "https://httpbin.org"
teststeps:
- name: GET 请求测试
request:
url: $base_url/get
method: GET
params:
name: "ApiMeter"
script:
- assert status_code == 200
- assert json.args.name == "ApiMeter"
- assert json.url.startswith("https://httpbin.org")
- name: POST 请求测试
request:
url: $base_url/post
method: POST
json:
username: "test_user"
email: "test@example.com"
script:
- assert status_code == 200
- assert json.json.username == "test_user"
- |
# 复杂校验逻辑
if json.json.email:
assert "@" in json.json.email
运行测试
apimeter test_api.yml
apimeter test_api.yml --skip-success
📖 完整文档
🎓 快速学习
🆕 新特性专题
📚 核心功能
🎯 测试执行
💡 高级主题
📋 其他
在线文档:https://zhuifengshen.github.io/APIMeter/
🔥 核心校验特性对比
| 校验能力 | 固定校验器语法 | ✅ Python 脚本,无限可能 |
| 学习成本 | 需记忆特定语法 | ✅ 标准 Python,零学习成本 |
| 复杂逻辑 | 有限支持 | ✅ 完全支持(条件、循环、函数) |
| 错误处理 | 单点失败中断 | ✅ 逐条执行,容错处理 |
| 全局变量 | 有限的变量访问 | ✅ 链式取值 + 变量转义 |
| 函数参数 | 简单参数 | ✅ 列表/字典/嵌套对象/通配符 |
| 测试报告 | 基础展示 | ✅ 智能折叠 + JSON树形展示 |
| 数据校验 | 单一固定模式 | ✅ 自定义任意校验逻辑 |
| 调试能力 | 基础日志 | ✅ 详细执行结果和错误信息 |
💼 使用场景
场景 1:复杂业务逻辑校验
script:
- |
if content.user.type == "vip":
assert content.user.vip_level > 0
assert content.user.discount >= 0.8
elif content.user.type == "premium":
assert content.user.premium_expires is not None
else:
assert content.user.ads_enabled is True
场景 2:批量数据校验
script:
- |
assert len(content.products) > 0
for product in content.products:
assert product.get("id") is not None
assert product.get("price") > 0
assert product.get("status") in ["active", "inactive"]
if product.get("discount"):
assert 0 < product["discount"] < 1
场景 3:复杂签名生成
request:
json:
sign: "${generate_signature({
method: $method,
url: $url,
timestamp: $timestamp,
nonce: $nonce,
body: $request_body
})}"
场景 4:性能与功能结合测试
script:
- assert status_code == 200
- assert content.success is True
- assert elapsed.total_seconds < 1.0, f"响应时间过长: {elapsed.total_seconds}s"
- assert len(content.items) <= 100, "返回数据量过大"
🤝 贡献与支持
问题反馈
如果你在使用过程中遇到问题,欢迎提交 Issue:
贡献代码
🧩 欢迎提交 Pull Request,让 ApiMeter 变得更好!
⭐ 如果 ApiMeter 对你有帮助,请给个 Star 支持一下!
🚀 现在就开始你的 API 自动化测试之旅吧! → 10分钟快速上手
🙏 致谢
ApiMeter 基于以下优秀的开源项目:
🛡️ Copyright
Copyright (c) 2025 Devin Zhang
This software is based on httprunner.py,
which is licensed under the Apache License, Version 2.0.
This project continues to be distributed under the same license.
You may obtain a copy of the License at:
http://www.apache.org/licenses/LICENSE-2.0