将接口文档转化为一套完整的自动化测试,生成可视化 HTML 报告,报告包含:
场景使用的执行器百望 ISP 开放平台接口isp-api-tester 的 run_isp_test.py(内置动态签名)通用 HTTP 接口本 skill 的 run_api_test.py
generate_report.py 和 report_template.html 被 isp-api-tester 跨 skill 引用。
从 Markdown 文档提取:
如果提供了数据库信息,先执行此步:
发票类型字段规则:
票种大类invoiceCodeinvoiceNumber数电票(31/32/51/59/61/83/84)❌ 不传E_INV_NUM(20位数电号码)税控票(01/03/04/08/10/11/14/15)INV_KIND``INV_NUM数电纸票(85/86/87/88)INV_KIND``INV_NUM
数电票的 invoiceCode 必须完全不传(传空串
""会触发 704 参数为空错误)
分组策略必填参数验证每个必填字段:缺失1条 + 空字符串1条分页参数验证正常值 + 边界值 + 负数枚举字段验证每个合法枚举值1条 + 非法值1条日期范围筛选正常范围 + 起止倒置 + 格式错误状态/标记字段每个合法值各1条综合多条件组合2~3字段组合 + 全量字段组合边界与异常参数超长字段 + 空body + 类型错误
正向用例(expect success=true)的入参字段值必须从数据库获取真实值。
ISP 接口(需要动态签名):
bash
python ~/.workbuddy/skills/isp-api-tester/scripts/run_isp_test.py --config test_config_xxx.json --output ./
通用 HTTP 接口:
bash
python ~/.workbuddy/skills/api-test-reporter/scripts/run_api_test.py --config test_config.json --output ./
文件说明test_report_<method>_<timestamp>.html可视化报告(双击打开)__REPORT_DATA__.js报告数据文件(与 HTML 同目录,不可删)test_results_<method>_<timestamp>.json原始结果 JSON
json
{
"meta": {
"title": "接口测试报告标题",
"base_url": "http://host/api/endpoint",
"method": "baiwang.input.invoice.queryinvoicepool",
"version": "6.0",
"timeout": 30,
"http_method": "POST",
"url_params": {},
"isp_auth": {
"appKey": "1000139",
"appSecret": "xxx",
"username": "cpy001",
"password": "Aa123456.",
"userSalt": "xxx"
}
},
"fixed_params": {
"taxNo": "91440606MA4WHN8C8X"
},
"db_fixture": {
"connection": {
"host": "10.115.96.247", "port": 3306,
"user": "jxindependent", "password": "Xj2zCkLJXTkEJ5j",
"database": "jxindependent0", "charset": "utf8mb4"
},
"queries": [
{
"name": "tax_invoice_sample",
"sql": "SELECT INV_KIND, INV_NUM FROM bw_jms_main1 WHERE INV_TYPE='01' LIMIT 1",
"mapping": {
"invoiceCode": "INV_KIND",
"invoiceNumber": "INV_NUM"
}
}
]
},
"test_cases": [
{
"id": "TC_001",
"group": "正常流程",
"name": "按发票号码查询",
"desc": "使用数据库真实发票号码查询",
"body": {
"invoiceCode": "{{invoiceCode}}",
"invoiceNumber": "{{invoiceNumber}}"
},
"expect": {
"success": true
}
},
{
"id": "TC_010",
"group": "异常参数",
"name": "缺少必填参数 taxNo",
"desc": "不传 taxNo,期望返回 success=false",
"remove_fixed": ["taxNo"],
"body": {},
"expect": {
"success": false
}
}
]
}
expect 校验规则速查#字段类型说明successbool校验响应体 success 字段值response.{field}any校验 response 节点下的字段,如 "response.invoiceType": "31"``model.{field}any校验 model 节点下的字段has_responsebool期望 response/model 字段存在且非 nullcheck_page_databool期望返回列表/分页数据error_field_existsbool期望 errorResponse 字段存在custom_checkslist自定义路径校验(见下方)
不使用 http_status 字段(百望 ISP 接口测试不校验 HTTP 状态码)。
success=true → 自动校验 invoiceList/response/model 非空success=false → 只校验 success 字段,不校验数据json
"custom_checks": [
{"path": "response.invoiceType", "op": "eq", "value": "31"},
{"path": "errorResponse.code", "op": "exists"},
{"path": "response", "op": "contains", "value": "invoiceNo"}
]
支持 op: eq / ne / contains / exists / not_exists / gt / lt
"success": true)的入参 必须从数据库获取真实值pageNum 参数"remove_fixed": ["字段名"]report_template.html:固定 HTML 骨架,不含测试数据,CSS/JS 全部内嵌__REPORT_DATA__.js:测试结果 JS 变量赋值文件( var reportData = {...})<script src="__REPORT_DATA__.js"> 加载数据并渲染file:// 协议下 CORS 会阻止 fetch 本地文件)bash
pip install requests pymysql