diff --git a/.gitignore b/.gitignore index 58a78c6..977919a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,10 +2,18 @@ .idea /example/tpt/demo/ *.exe +*.test +*.out /example/config +/config/ +/tpt/ +example/tpt/swagger/ +**/swagger/ /.cursor/*.log *.sql *.py +*.log +logs/ # Cursor / agent debug NDJSON leftovers debug-*.log diff --git a/example/tpt/swagger/app/api-spec.json b/example/tpt/swagger/app/api-spec.json deleted file mode 100644 index 4237e95..0000000 --- a/example/tpt/swagger/app/api-spec.json +++ /dev/null @@ -1,2628 +0,0 @@ -{ - "endpoints": [ - { - "cases": [ - { - "name": "缓存全部测试", - "method": "GET", - "passed": true, - "response": { - "result": { - "cache_mode": "compatible", - "cleanup": "已清理所有测试缓存数据", - "name": "数据库缓存测试", - "success": true, - "tests": [ - { - "cached_value": { - "active": true, - "count": 123, - "name": "测试数据" - }, - "name": "1. 基础 set/get 测试", - "result": true - }, - { - "after_exists": false, - "before_exists": true, - "name": "2. delete 删除缓存测试", - "result": true - }, - { - "immediate_exists": true, - "name": "3. 过期时间测试(短超时)", - "note": "设置了2秒过期,可等待后再次访问验证过期", - "result": true - }, - { - "name": "4. 不存在的 key 读取测试", - "result": true, - "value": null - }, - { - "first": "第一次值", - "name": "5. 重复 set 同一个 key 测试", - "result": true, - "second": "第二次值", - "third": { - "version": 3 - } - }, - { - "after": { - "a": false, - "b": false, - "c": false - }, - "before": { - "a": true, - "b": true, - "c": true - }, - "name": "6. 通配删除测试 (key*)", - "result": true - }, - { - "bool": true, - "float": 3.14159, - "int": 12345, - "map": { - "key": "value", - "num": 100 - }, - "name": "7. 不同数据类型存储测试", - "result": true, - "slice": [ - 1, - 2, - 3, - "four", - { - "five": 5 - } - ], - "string": "字符串值" - }, - { - "name": "8. 自定义超时时间参数测试", - "result": true, - "value": "长期数据" - }, - { - "name": "9. 缓存表状态查询", - "new_table_count": 29, - "new_table_name": "hotime_cache", - "result": true - } - ] - }, - "status": 0 - }, - "expect": { - "result": { - "cache_mode": "sample", - "cleanup": "sample", - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample", - "result": true - } - ] - }, - "status": 0 - } - } - ], - "ctr": "cache", - "method": "GET", - "params": [], - "path": "/app/cache/all", - "project": "app", - "summary": "缓存全部测试", - "tested": true - }, - { - "cases": [ - { - "name": "批量缓存测试", - "method": "GET", - "passed": true, - "response": { - "result": { - "message": "批量缓存测试完成,请查看控制台输出和日志文件" - }, - "status": 0 - }, - "expect": { - "result": { - "message": "sample" - }, - "status": 0 - } - } - ], - "ctr": "cache", - "method": "GET", - "params": [], - "path": "/app/cache/batch", - "project": "app", - "summary": "批量缓存测试", - "tested": true - }, - { - "cases": [ - { - "name": "兼容模式测试", - "method": "GET", - "passed": true, - "response": { - "result": { - "success": true, - "test_name": "兼容模式白盒测试", - "tests": [ - { - "mode": "compatible", - "name": "1. 查询当前缓存模式", - "result": true - }, - { - "count": 0, - "data": [], - "legacy_table": "cached", - "name": "2. 查询老表cached现有数据", - "result": true - }, - { - "count": 5, - "data": [ - { - "create_time": "2026-04-18 05:26:58", - "end_time": "2026-07-14 12:37:13", - "id": 8, - "key": "INFORMATION_SCHEMA.TABLES:111a1ad16d7b315170077c5f0d2ed79f", - "modify_time": "2026-07-13 16:37:13", - "state": 0, - "value": "[{\"label\":\"\",\"name\":\"体育\"},{\"label\":\"\",\"name\":\"军事\"},{\"label\":\"\",\"name\":\"历史\"},{\"label\":\"\",\"name\":\"地理\"},{\"label\":\"\",\"name\":\"外语\"},{\"label\":\"\",\"name\":\"天文\"},{\"label\":\"\",\"name\":\"影音\"},{\"label\":\"\",\"name\":\"数学\"},{\"label\":\"\",\"name\":\"数学1\"},{\"label\":\"\",\"name\":\"文学\"},{\"label\":\"\",\"name\":\"生物\"},{\"label\":\"\",\"name\":\"综合\"},{\"label\":\"管理员表\",\"name\":\"admin\"},{\"label\":\"文章表\",\"name\":\"article\"},{\"label\":\"\",\"name\":\"auth_role\"},{\"label\":\"\",\"name\":\"auth_user\"},{\"label\":\"老版本缓存表\",\"name\":\"cached\"},{\"label\":\"分类表\",\"name\":\"ctg\"},{\"label\":\"\",\"name\":\"history\"},{\"label\":\"缓存管理\",\"name\":\"hotime_cache\"},{\"label\":\"\",\"name\":\"ibang0420_iqiyi\"},{\"label\":\"\",\"name\":\"question\"},{\"label\":\"\",\"name\":\"role\"},{\"label\":\"\",\"name\":\"role_user\"},{\"label\":\"\",\"name\":\"stroage\"},{\"label\":\"批量测试表\",\"name\":\"test_batch\"},{\"label\":\"\",\"name\":\"user\"},{\"label\":\"\",\"name\":\"version\"}]" - }, - { - "create_time": "2026-04-18 05:26:58", - "end_time": "2026-07-14 12:37:13", - "id": 9, - "key": "INFORMATION_SCHEMA.COLUMNS:a8e3500cce5681cb71ce9e5cb57edddd", - "modify_time": "2026-07-13 16:37:13", - "state": 0, - "value": "[{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qname\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase1\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase2\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase3\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase4\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qanswer\",\"type\":\"double\"},{\"dflt_value\":\"7\",\"label\":\"\",\"must\":\"YES\",\"name\":\"qcid\",\"type\":\"int(11)\"},{\"dflt_value\":\"1526019499\",\"label\":\"\",\"must\":\"YES\",\"name\":\"qtime\",\"type\":\"int(11)\"}]" - }, - { - "create_time": "2026-04-18 05:27:02", - "end_time": "2026-07-14 12:37:13", - "id": 10, - "key": "INFORMATION_SCHEMA.COLUMNS:15df4912fb74d22d53ac3000217e50ad", - "modify_time": "2026-07-13 16:37:13", - "state": 0, - "value": "[{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qname\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase1\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase2\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase3\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase4\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qanswer\",\"type\":\"double\"},{\"dflt_value\":\"10\",\"label\":\"\",\"must\":\"YES\",\"name\":\"qcid\",\"type\":\"int(11)\"},{\"dflt_value\":\"1526019499\",\"label\":\"\",\"must\":\"YES\",\"name\":\"qtime\",\"type\":\"int(11)\"}]" - }, - { - "create_time": "2026-04-18 05:27:02", - "end_time": "2026-07-14 12:37:13", - "id": 11, - "key": "INFORMATION_SCHEMA.COLUMNS:bfaf5c253bab96452cb68392e4e37e58", - "modify_time": "2026-07-13 16:37:13", - "state": 0, - "value": "[{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qname\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase1\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase2\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase3\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase4\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qanswer\",\"type\":\"double\"},{\"dflt_value\":\"4\",\"label\":\"\",\"must\":\"YES\",\"name\":\"qcid\",\"type\":\"int(4)\"},{\"dflt_value\":\"1526019499\",\"label\":\"\",\"must\":\"YES\",\"name\":\"qtime\",\"type\":\"int(11)\"}]" - }, - { - "create_time": "2026-04-18 05:27:03", - "end_time": "2026-07-14 12:37:13", - "id": 12, - "key": "INFORMATION_SCHEMA.COLUMNS:d79863ef6c6082a111b1e474d25ef746", - "modify_time": "2026-07-13 16:37:13", - "state": 0, - "value": "[{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qname\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase1\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase2\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase3\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qcase4\",\"type\":\"varchar(255)\"},{\"dflt_value\":null,\"label\":\"\",\"must\":\"YES\",\"name\":\"qanswer\",\"type\":\"double\"},{\"dflt_value\":\"8\",\"label\":\"\",\"must\":\"YES\",\"name\":\"qcid\",\"type\":\"int(11)\"},{\"dflt_value\":\"1526019499\",\"label\":\"\",\"must\":\"YES\",\"name\":\"qtime\",\"type\":\"int(11)\"}]" - } - ], - "name": "3. 查询新表hotime_cache现有数据", - "new_table": "hotime_cache", - "result": true - }, - { - "cache_api_result": null, - "key_in_new_table": false, - "name": "4. 测试兼容模式老表回退读取", - "result": false, - "test_key": "test_compat_fallback_1783934340909146200" - }, - { - "name": "5. 测试兼容模式写新删老", - "result": false, - "step1_legacy_before": true, - "step2_new_after": false, - "step3_legacy_after_deleted": false - }, - { - "after_legacy_deleted": false, - "after_new_deleted": false, - "before_legacy": true, - "before_new": true, - "name": "6. 测试兼容模式删除(删除两表)", - "result": false - } - ], - "timestamp": "2026-07-13 17:19:00" - }, - "status": 0 - }, - "expect": { - "result": { - "success": true, - "test_name": "sample", - "tests": [ - { - "name": "sample", - "result": true - } - ], - "timestamp": "sample" - }, - "status": 0 - } - } - ], - "ctr": "cache", - "method": "GET", - "params": [], - "path": "/app/cache/compat", - "project": "app", - "summary": "缓存兼容模式测试", - "tested": true - }, - { - "cases": null, - "ctr": "dmdb", - "method": "POST", - "params": [], - "path": "/app/dmdb/describe", - "project": "app", - "summary": "查询达梦表结构", - "tested": true - }, - { - "cases": null, - "ctr": "dmdb", - "method": "POST", - "params": [], - "path": "/app/dmdb/rawsql", - "project": "app", - "summary": "达梦原生 SQL 测试", - "tested": true - }, - { - "cases": null, - "ctr": "dmdb", - "method": "POST", - "params": [], - "path": "/app/dmdb/tables", - "project": "app", - "summary": "查询达梦所有表", - "tested": true - }, - { - "cases": [ - { - "name": "result是布尔", - "method": "GET", - "passed": true, - "response": { - "result": true, - "status": 0 - }, - "expect": { - "result": true, - "status": 0 - } - } - ], - "ctr": "expect_demo", - "method": "GET", - "params": [], - "path": "/app/expect_demo/bool_result", - "project": "app", - "summary": "返回布尔-结构+值校验", - "tested": true - }, - { - "cases": [ - { - "name": "名称为空-缺少必填字段", - "method": "POST", - "passed": true, - "form": { - "name": "" - }, - "response": { - "error": { - "msg": "名称不能为空", - "type": "请求参数异常" - }, - "result": { - "msg": "名称不能为空", - "type": "请求参数异常" - }, - "status": 3 - }, - "expect": { - "error": { - "msg": "名称不能为空", - "type": "请求参数异常" - }, - "result": { - "msg": "名称不能为空", - "type": "请求参数异常" - }, - "status": 3 - } - }, - { - "name": "名称正确-结构+值校验", - "method": "POST", - "passed": true, - "form": { - "name": "测试商品" - }, - "response": { - "result": { - "created": true, - "id": 1, - "name": "测试商品" - }, - "status": 0 - }, - "expect": { - "result": { - "created": true, - "id": 1, - "name": "sample" - }, - "status": 0 - } - } - ], - "ctr": "expect_demo", - "method": "POST", - "params": [ - { - "name": "name", - "required": true, - "type": "string", - "example": "测试商品", - "in": "form" - } - ], - "path": "/app/expect_demo/error_demo", - "project": "app", - "summary": "错误先行+正确请求完整校验", - "tested": true - }, - { - "cases": [ - { - "name": "result是小数", - "method": "GET", - "passed": true, - "response": { - "result": 3.14, - "status": 0 - }, - "expect": { - "result": 1, - "status": 0 - } - } - ], - "ctr": "expect_demo", - "method": "GET", - "params": [], - "path": "/app/expect_demo/float_result", - "project": "app", - "summary": "返回小数-结构+值校验", - "tested": true - }, - { - "cases": [ - { - "name": "result是Map-校验字段名+类型+值", - "method": "GET", - "passed": true, - "response": { - "result": { - "id": 1, - "in_stock": true, - "name": "示例商品", - "price": 19.9 - }, - "status": 0 - }, - "expect": { - "result": { - "id": 1, - "in_stock": true, - "name": "sample", - "price": 1 - }, - "status": 0 - } - } - ], - "ctr": "expect_demo", - "method": "GET", - "params": [], - "path": "/app/expect_demo/map_result", - "project": "app", - "summary": "返回对象-结构+值校验", - "tested": true - }, - { - "cases": [ - { - "name": "深层嵌套Map+Slice+Map", - "method": "GET", - "passed": true, - "response": { - "result": { - "customer": { - "id": 1, - "name": "张三", - "phone": "13800138000" - }, - "extra": { - "delivery": { - "address": "XX路1号", - "fee": 5 - } - }, - "id": 100, - "items": [ - { - "goods_name": "苹果", - "id": 1, - "price": 3.5, - "quantity": 5 - }, - { - "goods_name": "香蕉", - "id": 2, - "price": 2, - "quantity": 10 - } - ], - "title": "测试订单" - }, - "status": 0 - }, - "expect": { - "result": { - "customer": { - "id": 1, - "name": "sample", - "phone": "sample" - }, - "extra": { - "delivery": { - "address": "sample", - "fee": 1 - } - }, - "id": 1, - "items": [ - { - "goods_name": "sample", - "id": 1, - "price": 1, - "quantity": 1 - } - ], - "title": "sample" - }, - "status": 0 - } - } - ], - "ctr": "expect_demo", - "method": "GET", - "params": [], - "path": "/app/expect_demo/nested_result", - "project": "app", - "summary": "返回嵌套对象-结构+值校验", - "tested": true - }, - { - "cases": [ - { - "name": "有Verify值断言", - "method": "GET", - "passed": true, - "response": { - "result": { - "data": "无预期校验", - "id": 1 - }, - "status": 0 - }, - "expect": { - "result": { - "data": "sample", - "id": 1 - }, - "status": 0 - } - } - ], - "ctr": "expect_demo", - "method": "GET", - "params": [], - "path": "/app/expect_demo/no_expect", - "project": "app", - "summary": "最小正确用例-仍需值断言", - "tested": true - }, - { - "cases": [ - { - "name": "result是整数", - "method": "GET", - "passed": true, - "response": { - "result": 42, - "status": 0 - }, - "expect": { - "result": 1, - "status": 0 - } - } - ], - "ctr": "expect_demo", - "method": "GET", - "params": [], - "path": "/app/expect_demo/number_result", - "project": "app", - "summary": "返回整数-结构+值校验", - "tested": true - }, - { - "cases": [ - { - "name": "result直接是Slice", - "method": "GET", - "passed": true, - "response": { - "result": [ - { - "id": 1, - "name": "标签A" - }, - { - "id": 2, - "name": "标签B" - } - ], - "status": 0 - }, - "expect": { - "result": [ - { - "id": 1, - "name": "sample" - } - ], - "status": 0 - } - } - ], - "ctr": "expect_demo", - "method": "GET", - "params": [], - "path": "/app/expect_demo/slice_result", - "project": "app", - "summary": "返回数组-结构+值校验", - "tested": true - }, - { - "cases": [ - { - "name": "result是字符串", - "method": "GET", - "passed": true, - "response": { - "result": "操作成功", - "status": 0 - }, - "expect": { - "result": "样本", - "status": 0 - } - } - ], - "ctr": "expect_demo", - "method": "GET", - "params": [], - "path": "/app/expect_demo/string_result", - "project": "app", - "summary": "返回字符串-结构+值校验", - "tested": true - }, - { - "cases": [ - { - "name": "名称为空", - "method": "POST", - "passed": true, - "form": { - "name": "" - }, - "response": { - "error": { - "msg": "名称不能为空", - "type": "请求参数异常" - }, - "result": { - "msg": "名称不能为空", - "type": "请求参数异常" - }, - "status": 3 - }, - "expect": { - "error": { - "msg": "名称不能为空", - "type": "请求参数异常" - }, - "result": { - "msg": "名称不能为空", - "type": "请求参数异常" - }, - "status": 3 - } - }, - { - "name": "写入并校验DB+响应", - "method": "POST", - "passed": true, - "form": { - "name": "verify_test" - }, - "response": { - "result": { - "id": 213, - "name": "verify_test" - }, - "status": 0 - }, - "expect": { - "result": { - "id": 1, - "name": "sample" - }, - "status": 0 - } - } - ], - "ctr": "expect_demo", - "method": "POST", - "params": [ - { - "name": "name", - "required": true, - "type": "string", - "example": "verify_test", - "in": "form" - } - ], - "path": "/app/expect_demo/verify_demo", - "project": "app", - "summary": "Verify完整范式演示", - "tested": true - }, - { - "cases": [ - { - "name": "不传table参数", - "method": "GET", - "passed": true, - "response": { - "error": { - "msg": "请提供 table 参数", - "type": "内部系统异常" - }, - "result": { - "msg": "请提供 table 参数", - "type": "内部系统异常" - }, - "status": 1 - }, - "expect": { - "error": { - "msg": "请提供 table 参数", - "type": "内部系统异常" - }, - "result": { - "msg": "请提供 table 参数", - "type": "内部系统异常" - }, - "status": 1 - } - }, - { - "name": "DESCRIBE admin", - "method": "GET", - "passed": true, - "query": { - "table": "admin" - }, - "response": { - "result": { - "columns": [ - { - "Default": null, - "Extra": "auto_increment", - "Field": "id", - "Key": "PRI", - "Null": "NO", - "Type": "int(11) unsigned" - }, - { - "Default": null, - "Extra": "", - "Field": "name", - "Key": "", - "Null": "YES", - "Type": "varchar(100)" - }, - { - "Default": null, - "Extra": "", - "Field": "phone", - "Key": "UNI", - "Null": "YES", - "Type": "varchar(20)" - }, - { - "Default": "0", - "Extra": "", - "Field": "state", - "Key": "", - "Null": "YES", - "Type": "int(2)" - }, - { - "Default": null, - "Extra": "", - "Field": "password", - "Key": "", - "Null": "YES", - "Type": "varchar(100)" - }, - { - "Default": "0", - "Extra": "", - "Field": "role_id", - "Key": "", - "Null": "YES", - "Type": "int(11)" - }, - { - "Default": null, - "Extra": "", - "Field": "title", - "Key": "", - "Null": "YES", - "Type": "varchar(100)" - }, - { - "Default": null, - "Extra": "", - "Field": "create_time", - "Key": "", - "Null": "YES", - "Type": "datetime" - }, - { - "Default": null, - "Extra": "", - "Field": "modify_time", - "Key": "", - "Null": "YES", - "Type": "datetime" - } - ], - "sample_data": [ - { - "create_time": "2026-03-20 02:32:47", - "id": 1, - "modify_time": "2026-03-20 02:32:47", - "name": "超级管理员", - "password": "admin123", - "phone": "13800000001", - "role_id": 1, - "state": 1, - "title": "系统管理员" - }, - { - "create_time": "2026-03-20 02:32:47", - "id": 2, - "modify_time": "2026-03-20 02:32:47", - "name": "编辑员", - "password": "editor123", - "phone": "13800000002", - "role_id": 2, - "state": 1, - "title": "内容编辑" - }, - { - "create_time": "2026-03-20 02:32:47", - "id": 3, - "modify_time": "2026-03-20 02:32:47", - "name": "审核员", - "password": "review123", - "phone": "13800000003", - "role_id": 3, - "state": 1, - "title": "内容审核" - }, - { - "create_time": "2026-03-20 02:43:03", - "id": 6, - "modify_time": "2026-03-20 02:43:03", - "name": "测试管理员_1773974584", - "password": "test123456", - "phone": "13873974584", - "role_id": 1, - "state": 1, - "title": "更新后的职位" - }, - { - "create_time": "2026-03-20 02:43:09", - "id": 9, - "modify_time": "2026-03-20 02:43:09", - "name": "测试管理员_1773974590", - "password": "test123456", - "phone": "13873974590", - "role_id": 1, - "state": 1, - "title": "更新后的职位" - }, - { - "create_time": "2026-03-20 02:50:47", - "id": 12, - "modify_time": "2026-03-20 02:50:47", - "name": "测试管理员_1773975048", - "password": "test123456", - "phone": "13873975048", - "role_id": 1, - "state": 1, - "title": "更新后的职位" - }, - { - "create_time": "2026-03-20 02:57:19", - "id": 18, - "modify_time": "2026-03-20 02:57:19", - "name": "测试管理员_1773975440", - "password": "test123456", - "phone": "13873975440", - "role_id": 1, - "state": 1, - "title": "更新后的职位" - }, - { - "create_time": "2026-03-29 16:47:48", - "id": 22, - "modify_time": "2026-03-29 16:47:48", - "name": "测试管理员_1774802868", - "password": "test123456", - "phone": "13874802868", - "role_id": 1, - "state": 1, - "title": "更新后的职位" - }, - { - "create_time": "2026-03-29 16:47:49", - "id": 25, - "modify_time": "2026-03-29 16:47:50", - "name": "测试管理员_1774802869", - "password": "test123456", - "phone": "13874802869", - "role_id": 1, - "state": 1, - "title": "更新后的职位" - }, - { - "create_time": "2026-03-29 16:54:20", - "id": 28, - "modify_time": "2026-03-29 16:54:20", - "name": "测试管理员_1774803260", - "password": "test123456", - "phone": "13874803260", - "role_id": 1, - "state": 1, - "title": "更新后的职位" - } - ], - "table": "admin" - }, - "status": 0 - }, - "expect": { - "result": { - "columns": [], - "sample_data": [], - "table": "sample" - }, - "status": 0 - } - } - ], - "ctr": "mysql", - "method": "GET", - "params": [ - { - "name": "table", - "required": false, - "type": "string", - "example": "admin", - "in": "query" - } - ], - "path": "/app/mysql/describe", - "project": "app", - "summary": "查询 MySQL 表结构", - "tested": true - }, - { - "cases": [ - { - "name": "MySQL原生SQL", - "method": "GET", - "passed": true, - "response": { - "result": { - "name": "MySQL原生SQL测试", - "success": true, - "tests": [ - { - "count": 5, - "name": "Query 原生查询 (反引号)", - "result": true - }, - { - "affected": 1, - "name": "Exec 原生执行 (反引号)", - "result": true - }, - { - "count": 5, - "lastQuery": "SELECT id, title FROM `article` WHERE id IN (?, ?, ?, ?, ?) LIMIT 10", - "name": "IN (?) 非空数组展开", - "result": true - }, - { - "count": 0, - "lastQuery": "SELECT id, title FROM `article` WHERE 1=0 LIMIT 10", - "name": "IN (?) 空数组替换为1=0", - "result": true - }, - { - "count": 10, - "lastQuery": "SELECT id, title FROM `article` WHERE 1=1 LIMIT 10", - "name": "NOT IN (?) 空数组替换为1=1", - "result": true - } - ] - }, - "status": 0 - }, - "expect": { - "result": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample", - "result": true - } - ] - }, - "status": 0 - } - } - ], - "ctr": "mysql", - "method": "GET", - "params": [], - "path": "/app/mysql/rawsql", - "project": "app", - "summary": "MySQL 原生 SQL 测试", - "tested": true - }, - { - "cases": [ - { - "name": "SHOW TABLES", - "method": "GET", - "passed": true, - "response": { - "result": { - "tables": [ - { - "Tables_in_test": "体育" - }, - { - "Tables_in_test": "军事" - }, - { - "Tables_in_test": "历史" - }, - { - "Tables_in_test": "地理" - }, - { - "Tables_in_test": "外语" - }, - { - "Tables_in_test": "天文" - }, - { - "Tables_in_test": "影音" - }, - { - "Tables_in_test": "数学" - }, - { - "Tables_in_test": "数学1" - }, - { - "Tables_in_test": "文学" - }, - { - "Tables_in_test": "生物" - }, - { - "Tables_in_test": "综合" - }, - { - "Tables_in_test": "admin" - }, - { - "Tables_in_test": "article" - }, - { - "Tables_in_test": "auth_role" - }, - { - "Tables_in_test": "auth_user" - }, - { - "Tables_in_test": "cached" - }, - { - "Tables_in_test": "ctg" - }, - { - "Tables_in_test": "history" - }, - { - "Tables_in_test": "hotime_cache" - }, - { - "Tables_in_test": "ibang0420_iqiyi" - }, - { - "Tables_in_test": "question" - }, - { - "Tables_in_test": "role" - }, - { - "Tables_in_test": "role_user" - }, - { - "Tables_in_test": "stroage" - }, - { - "Tables_in_test": "test_batch" - }, - { - "Tables_in_test": "user" - }, - { - "Tables_in_test": "version" - } - ] - }, - "status": 0 - }, - "expect": { - "result": { - "tables": [] - }, - "status": 0 - } - } - ], - "ctr": "mysql", - "method": "GET", - "params": [], - "path": "/app/mysql/tables", - "project": "app", - "summary": "查询 MySQL 所有表", - "tested": true - }, - { - "cases": [ - { - "name": "聚合函数", - "method": "GET", - "passed": true, - "response": { - "result": { - "name": "聚合函数测试", - "success": true, - "tests": [ - { - "count": 11, - "name": "Count 总数统计", - "result": true - }, - { - "count": 9, - "name": "Count 条件统计", - "result": true - }, - { - "lastQuery": "SELECT SUM(click_num) FROM `article` WHERE `state` =? ;", - "name": "Sum 求和 (单字段名)", - "result": true, - "sum": 12311 - }, - { - "avg": 1367.8889, - "lastQuery": "SELECT AVG(click_num) FROM `article` WHERE `state` =? ;", - "name": "Avg 平均值 (单字段名)", - "result": true - }, - { - "lastQuery": "SELECT MAX(click_num) FROM `article` WHERE `state` =? ;", - "max": 9999, - "name": "Max 最大值 (单字段名)", - "result": true - }, - { - "lastQuery": "SELECT MIN(sort) FROM `article` WHERE `state` =? ;", - "min": 1, - "name": "Min 最小值 (单字段名)", - "result": true - }, - { - "name": "GROUP BY 分组统计", - "result": true, - "stats": [ - { - "article_count": 4, - "avg_clicks": 450, - "ctg_id": 2, - "total_clicks": 1800 - }, - { - "article_count": 3, - "avg_clicks": 3461, - "ctg_id": 1, - "total_clicks": 10383 - }, - { - "article_count": 1, - "avg_clicks": 32, - "ctg_id": 3, - "total_clicks": 32 - }, - { - "article_count": 1, - "avg_clicks": 96, - "ctg_id": 4, - "total_clicks": 96 - } - ] - }, - { - "lastQuery": "SELECT SUM(`article`.`click_num`) FROM `article` WHERE `state` =? ;", - "match_single_field": false, - "name": "Sum 求和 (table.column 格式)", - "result": true, - "sum": 0 - }, - { - "name": "聚合函数一致性验证", - "result": false, - "summary": "Sum: 12311=0, Avg: 1367.8889=0, Max: 9999=0, Min: 1=0" - }, - { - "lastQuery": "SELECT SUM(`article`.`click_num`) FROM `article` LEFT JOIN `ctg` ON `article`.`ctg_id` = `ctg`.`id` WHERE `article`.`state` =? ;", - "name": "Sum 带 JOIN (table.column 格式)", - "result": true, - "sum": 0 - }, - { - "count": 9, - "lastQuery": "SELECT COUNT(*) FROM `article` LEFT JOIN `ctg` ON `article`.`ctg_id` = `ctg`.`id` WHERE `article`.`state` =? ;", - "name": "Count 带 JOIN", - "result": true - } - ] - }, - "status": 0 - }, - "expect": { - "result": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - }, - "status": 0 - } - } - ], - "ctr": "test", - "method": "GET", - "params": [], - "path": "/app/test/aggregate", - "project": "app", - "summary": "聚合函数测试", - "tested": true - }, - { - "cases": [ - { - "name": "全部测试", - "method": "GET", - "passed": true, - "response": { - "result": { - "1_basic_crud": { - "name": "基础CRUD测试", - "success": true, - "tests": [ - { - "adminId": 76, - "lastQuery": "INSERT INTO `admin` (`name`,`phone`,`state`,`password`,`role_id`,`title`,`create_time`,`modify_time`) VALUES (?,?,?,?,?,?,NOW(),NOW());", - "name": "Insert 插入测试 (admin表)", - "result": true - }, - { - "admin": { - "create_time": "2026-07-13 09:19:02", - "id": 76, - "modify_time": "2026-07-13 09:19:02", - "name": "测试管理员_1783934341158219100", - "password": "test123456", - "phone": "13958219100", - "role_id": 1, - "state": 1, - "title": "测试职位" - }, - "name": "Get 获取单条记录测试", - "result": true - }, - { - "count": 5, - "name": "Select 单条件查询测试", - "result": true - }, - { - "count": 5, - "lastQuery": "SELECT * FROM `admin` WHERE `role_id` \u003e? AND `state` =? ORDER BY id DESC LIMIT 5 ;", - "name": "Select 多条件自动AND测试", - "result": true - }, - { - "affected": 1, - "name": "Update 更新测试", - "result": true - }, - { - "affected": 1, - "name": "Delete 删除测试", - "result": true - } - ] - }, - "2_condition_syntax": { - "name": "条件查询语法测试", - "success": true, - "tests": [ - { - "count": 3, - "name": "等于条件 (=)", - "result": true - }, - { - "count": 3, - "lastQuery": "SELECT id,title,state FROM `article` WHERE `state` !=? LIMIT 3 ;", - "name": "不等于条件 ([!])", - "result": true - }, - { - "count": 3, - "name": "大于小于条件 ([\u003e], [\u003c])", - "result": true - }, - { - "count": 3, - "name": "大于等于小于等于条件 ([\u003e=], [\u003c=])", - "result": true - }, - { - "count": 1, - "lastQuery": "SELECT id,title FROM `article` WHERE `title` LIKE ? LIMIT 3 ;", - "name": "LIKE 模糊查询 ([~])", - "result": true - }, - { - "count": 0, - "name": "右模糊查询 ([~!])", - "result": true - }, - { - "count": 3, - "lastQuery": "SELECT id,title,click_num FROM `article` WHERE `click_num` BETWEEN ? AND ? LIMIT 3 ;", - "name": "BETWEEN 区间查询 ([\u003c\u003e])", - "result": true - }, - { - "count": 3, - "name": "NOT BETWEEN 查询 ([\u003e\u003c])", - "result": true - }, - { - "count": 5, - "lastQuery": "SELECT id,title FROM `article` WHERE (`id` BETWEEN ? AND ? ) LIMIT 5 ;", - "name": "IN 查询", - "result": true - }, - { - "count": 5, - "name": "NOT IN 查询 ([!])", - "result": true - }, - { - "count": 3, - "name": "IS NULL 查询", - "result": true - }, - { - "count": 3, - "name": "IS NOT NULL 查询 ([!])", - "result": true - }, - { - "count": 3, - "lastQuery": "SELECT id,title,create_time FROM `article` WHERE create_time \u003e DATE_SUB(NOW(), INTERVAL 365 DAY) LIMIT 3 ;", - "name": "直接 SQL 片段查询 ([##])", - "result": true - }, - { - "count": 3, - "name": "显式 AND 条件", - "result": true - }, - { - "count": 5, - "name": "OR 条件", - "result": true - }, - { - "count": 5, - "lastQuery": "SELECT id,title,sort,state FROM `article` WHERE (( `click_num` \u003e? OR `sort` \u003e=? ) AND `state` =?) LIMIT 5 ;", - "name": "嵌套 AND/OR 条件", - "result": true - } - ] - }, - "3_chain_query": { - "name": "链式查询测试", - "success": true, - "tests": [ - { - "count": 9, - "name": "基本链式查询 Table().Where().Select()", - "result": true - }, - { - "count": 9, - "name": "链式 And 条件", - "result": true - }, - { - "count": 9, - "name": "链式 Or 条件", - "result": true - }, - { - "count": 5, - "name": "链式 Order 排序", - "result": true - }, - { - "count": 3, - "name": "链式 Limit 限制", - "result": true - }, - { - "article": { - "author": "管理员", - "id": 1, - "title": "数据库入门指南" - }, - "name": "链式 Get 获取单条", - "result": true - }, - { - "count": 9, - "name": "链式 Count 统计", - "result": true - }, - { - "count": 5, - "name": "链式 Page 分页", - "result": true - }, - { - "name": "链式 Group 分组", - "result": true, - "stats": [ - { - "cnt": 3, - "ctg_id": 1 - }, - { - "cnt": 4, - "ctg_id": 2 - }, - { - "cnt": 1, - "ctg_id": 3 - }, - { - "cnt": 1, - "ctg_id": 4 - } - ] - }, - { - "affected": 1, - "name": "链式 Update 更新", - "result": true - } - ] - }, - "4_join_query": { - "name": "JOIN查询测试", - "success": true, - "tests": [ - { - "count": 5, - "data": [ - { - "ctg_name": "新闻资讯", - "id": 1, - "title": "数据库入门指南" - }, - { - "ctg_name": "新闻资讯", - "id": 2, - "title": "新闻发布系统上线公告" - }, - { - "ctg_name": "新闻资讯", - "id": 11, - "title": "高点击量文章" - }, - { - "ctg_name": "技术文档", - "id": 3, - "title": "Go语言最佳实践" - }, - { - "ctg_name": "技术文档", - "id": 4, - "title": "API接口设计规范" - } - ], - "name": "LEFT JOIN 链式查询", - "result": true - }, - { - "count": 5, - "lastQuery": "SELECT `article`.`id`, `article`.`title`, `ctg`.`name` as ctg_name FROM `article` LEFT JOIN `ctg` ON `article`.`ctg_id` = `ctg`.`id` WHERE `article`.`state` =? LIMIT 5 ;", - "name": "传统 JOIN 语法", - "result": true - }, - { - "count": 5, - "data": [ - { - "admin_name": "超级管理员", - "ctg_name": "新闻资讯", - "id": 1, - "title": "数据库入门指南" - }, - { - "admin_name": "编辑员", - "ctg_name": "新闻资讯", - "id": 2, - "title": "新闻发布系统上线公告" - }, - { - "admin_name": "编辑员", - "ctg_name": "新闻资讯", - "id": 11, - "title": "高点击量文章" - }, - { - "admin_name": "超级管理员", - "ctg_name": "技术文档", - "id": 3, - "title": "Go语言最佳实践" - }, - { - "admin_name": "审核员", - "ctg_name": "技术文档", - "id": 4, - "title": "API接口设计规范" - } - ], - "name": "多表 JOIN", - "result": true - }, - { - "count": 5, - "name": "INNER JOIN", - "result": true - } - ] - }, - "5_aggregate": { - "name": "聚合函数测试", - "success": true, - "tests": [ - { - "count": 11, - "name": "Count 总数统计", - "result": true - }, - { - "count": 9, - "name": "Count 条件统计", - "result": true - }, - { - "lastQuery": "SELECT SUM(click_num) FROM `article` WHERE `state` =? ;", - "name": "Sum 求和 (单字段名)", - "result": true, - "sum": 12311 - }, - { - "avg": 1367.8889, - "lastQuery": "SELECT AVG(click_num) FROM `article` WHERE `state` =? ;", - "name": "Avg 平均值 (单字段名)", - "result": true - }, - { - "lastQuery": "SELECT MAX(click_num) FROM `article` WHERE `state` =? ;", - "max": 9999, - "name": "Max 最大值 (单字段名)", - "result": true - }, - { - "lastQuery": "SELECT MIN(sort) FROM `article` WHERE `state` =? ;", - "min": 1, - "name": "Min 最小值 (单字段名)", - "result": true - }, - { - "name": "GROUP BY 分组统计", - "result": true, - "stats": [ - { - "article_count": 4, - "avg_clicks": 450, - "ctg_id": 2, - "total_clicks": 1800 - }, - { - "article_count": 3, - "avg_clicks": 3461, - "ctg_id": 1, - "total_clicks": 10383 - }, - { - "article_count": 1, - "avg_clicks": 32, - "ctg_id": 3, - "total_clicks": 32 - }, - { - "article_count": 1, - "avg_clicks": 96, - "ctg_id": 4, - "total_clicks": 96 - } - ] - }, - { - "lastQuery": "SELECT SUM(`article`.`click_num`) FROM `article` WHERE `state` =? ;", - "match_single_field": false, - "name": "Sum 求和 (table.column 格式)", - "result": true, - "sum": 0 - }, - { - "name": "聚合函数一致性验证", - "result": false, - "summary": "Sum: 12311=0, Avg: 1367.8889=0, Max: 9999=0, Min: 1=0" - }, - { - "lastQuery": "SELECT SUM(`article`.`click_num`) FROM `article` LEFT JOIN `ctg` ON `article`.`ctg_id` = `ctg`.`id` WHERE `article`.`state` =? ;", - "name": "Sum 带 JOIN (table.column 格式)", - "result": true, - "sum": 0 - }, - { - "count": 9, - "lastQuery": "SELECT COUNT(*) FROM `article` LEFT JOIN `ctg` ON `article`.`ctg_id` = `ctg`.`id` WHERE `article`.`state` =? ;", - "name": "Count 带 JOIN", - "result": true - } - ] - }, - "6_pagination": { - "name": "分页查询测试", - "success": true, - "tests": [ - { - "count": 5, - "name": "PageSelect 分页查询", - "result": true - }, - { - "count": 4, - "name": "PageSelect 第二页", - "result": true - }, - { - "count": 3, - "name": "链式 Page 分页", - "result": true - }, - { - "count": 3, - "lastQuery": "SELECT id,title FROM `article` WHERE (`state` =?) LIMIT 3 OFFSET 2 ;", - "name": "Offset 偏移查询", - "result": true - } - ] - }, - "7_batch_insert": { - "name": "批量插入测试", - "success": true, - "tests": [ - { - "affected": 3, - "lastQuery": "INSERT INTO `test_batch` (`name`, `state`, `title`) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?)", - "name": "Inserts 批量插入", - "result": true - }, - { - "affected": 2, - "name": "Inserts 带 [#] 标记", - "result": true - } - ] - }, - "8_upsert": { - "name": "Upsert测试", - "success": true, - "tests": [ - { - "affected": 1, - "lastQuery": "INSERT INTO `admin` (`password`, `role_id`, `title`, `create_time`, `modify_time`, `name`, `phone`, `state`) VALUES (?, ?, ?, NOW(), NOW(), ?, ?, ?) ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `state` = VALUES(`state`), `title` = VALUES(`title`), `modify_time` = NOW()", - "name": "Upsert 插入新记录 (admin表)", - "result": true - }, - { - "affected": 2, - "name": "Upsert 更新已存在记录", - "result": true, - "updatedAdmin": { - "create_time": "2026-07-13 09:19:02", - "id": 77, - "modify_time": "2026-07-13 09:19:02", - "name": "Upsert更新后管理员", - "password": "test123", - "phone": "19983934341", - "role_id": 2, - "state": 1, - "title": "更新后职位" - } - } - ] - }, - "9_transaction": { - "name": "事务测试", - "success": true, - "tests": [ - { - "name": "事务成功提交", - "recordExists": true, - "result": true - }, - { - "name": "事务回滚", - "recordRolledBack": false, - "result": true - } - ] - } - }, - "status": 0 - }, - "expect": { - "result": { - "1_basic_crud": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample", - "result": true - } - ] - }, - "2_condition_syntax": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample", - "result": true - } - ] - }, - "3_chain_query": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - }, - "4_join_query": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - }, - "5_aggregate": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - }, - "6_pagination": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - }, - "7_batch_insert": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - }, - "8_upsert": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - }, - "9_transaction": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - } - }, - "status": 0 - } - } - ], - "ctr": "test", - "method": "GET", - "params": [], - "path": "/app/test/all", - "project": "app", - "summary": "运行全部通用测试", - "tested": true - }, - { - "cases": [ - { - "name": "批量插入", - "method": "GET", - "passed": true, - "response": { - "result": { - "name": "批量插入测试", - "success": true, - "tests": [ - { - "affected": 3, - "lastQuery": "INSERT INTO `test_batch` (`name`, `state`, `title`) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?)", - "name": "Inserts 批量插入", - "result": true - }, - { - "affected": 2, - "name": "Inserts 带 [#] 标记", - "result": true - } - ] - }, - "status": 0 - }, - "expect": { - "result": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - }, - "status": 0 - } - } - ], - "ctr": "test", - "method": "GET", - "params": [], - "path": "/app/test/batch", - "project": "app", - "summary": "批量插入测试", - "tested": true - }, - { - "cases": [ - { - "name": "链式查询", - "method": "GET", - "passed": true, - "response": { - "result": { - "name": "链式查询测试", - "success": true, - "tests": [ - { - "count": 9, - "name": "基本链式查询 Table().Where().Select()", - "result": true - }, - { - "count": 9, - "name": "链式 And 条件", - "result": true - }, - { - "count": 9, - "name": "链式 Or 条件", - "result": true - }, - { - "count": 5, - "name": "链式 Order 排序", - "result": true - }, - { - "count": 3, - "name": "链式 Limit 限制", - "result": true - }, - { - "article": { - "author": "管理员", - "id": 1, - "title": "数据库入门指南" - }, - "name": "链式 Get 获取单条", - "result": true - }, - { - "count": 9, - "name": "链式 Count 统计", - "result": true - }, - { - "count": 5, - "name": "链式 Page 分页", - "result": true - }, - { - "name": "链式 Group 分组", - "result": true, - "stats": [ - { - "cnt": 3, - "ctg_id": 1 - }, - { - "cnt": 4, - "ctg_id": 2 - }, - { - "cnt": 1, - "ctg_id": 3 - }, - { - "cnt": 1, - "ctg_id": 4 - } - ] - }, - { - "affected": 0, - "name": "链式 Update 更新", - "result": true - } - ] - }, - "status": 0 - }, - "expect": { - "result": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - }, - "status": 0 - } - } - ], - "ctr": "test", - "method": "GET", - "params": [], - "path": "/app/test/chain", - "project": "app", - "summary": "链式查询测试", - "tested": true - }, - { - "cases": [ - { - "name": "条件查询", - "method": "GET", - "passed": true, - "response": { - "result": { - "name": "条件查询语法测试", - "success": true, - "tests": [ - { - "count": 3, - "name": "等于条件 (=)", - "result": true - }, - { - "count": 3, - "lastQuery": "SELECT id,title,state FROM `article` WHERE `state` !=? LIMIT 3 ;", - "name": "不等于条件 ([!])", - "result": true - }, - { - "count": 3, - "name": "大于小于条件 ([\u003e], [\u003c])", - "result": true - }, - { - "count": 3, - "name": "大于等于小于等于条件 ([\u003e=], [\u003c=])", - "result": true - }, - { - "count": 1, - "lastQuery": "SELECT id,title FROM `article` WHERE `title` LIKE ? LIMIT 3 ;", - "name": "LIKE 模糊查询 ([~])", - "result": true - }, - { - "count": 0, - "name": "右模糊查询 ([~!])", - "result": true - }, - { - "count": 3, - "lastQuery": "SELECT id,title,click_num FROM `article` WHERE `click_num` BETWEEN ? AND ? LIMIT 3 ;", - "name": "BETWEEN 区间查询 ([\u003c\u003e])", - "result": true - }, - { - "count": 3, - "name": "NOT BETWEEN 查询 ([\u003e\u003c])", - "result": true - }, - { - "count": 5, - "lastQuery": "SELECT id,title FROM `article` WHERE (`id` BETWEEN ? AND ? ) LIMIT 5 ;", - "name": "IN 查询", - "result": true - }, - { - "count": 5, - "name": "NOT IN 查询 ([!])", - "result": true - }, - { - "count": 3, - "name": "IS NULL 查询", - "result": true - }, - { - "count": 3, - "name": "IS NOT NULL 查询 ([!])", - "result": true - }, - { - "count": 3, - "lastQuery": "SELECT id,title,create_time FROM `article` WHERE create_time \u003e DATE_SUB(NOW(), INTERVAL 365 DAY) LIMIT 3 ;", - "name": "直接 SQL 片段查询 ([##])", - "result": true - }, - { - "count": 3, - "name": "显式 AND 条件", - "result": true - }, - { - "count": 5, - "name": "OR 条件", - "result": true - }, - { - "count": 5, - "lastQuery": "SELECT id,title,sort,state FROM `article` WHERE (( `click_num` \u003e? OR `sort` \u003e=? ) AND `state` =?) LIMIT 5 ;", - "name": "嵌套 AND/OR 条件", - "result": true - } - ] - }, - "status": 0 - }, - "expect": { - "result": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample", - "result": true - } - ] - }, - "status": 0 - } - } - ], - "ctr": "test", - "method": "GET", - "params": [], - "path": "/app/test/condition", - "project": "app", - "summary": "条件查询语法测试", - "tested": true - }, - { - "cases": [ - { - "name": "CRUD测试", - "method": "GET", - "passed": true, - "response": { - "result": { - "name": "基础CRUD测试", - "success": true, - "tests": [ - { - "adminId": 79, - "lastQuery": "INSERT INTO `admin` (`phone`,`state`,`password`,`role_id`,`title`,`create_time`,`modify_time`,`name`) VALUES (?,?,?,?,?,NOW(),NOW(),?);", - "name": "Insert 插入测试 (admin表)", - "result": true - }, - { - "admin": { - "create_time": "2026-07-13 09:19:02", - "id": 79, - "modify_time": "2026-07-13 09:19:02", - "name": "测试管理员_1783934341599114700", - "password": "test123456", - "phone": "13999114700", - "role_id": 1, - "state": 1, - "title": "测试职位" - }, - "name": "Get 获取单条记录测试", - "result": true - }, - { - "count": 5, - "name": "Select 单条件查询测试", - "result": true - }, - { - "count": 5, - "lastQuery": "SELECT * FROM `admin` WHERE `role_id` \u003e? AND `state` =? ORDER BY id DESC LIMIT 5 ;", - "name": "Select 多条件自动AND测试", - "result": true - }, - { - "affected": 1, - "name": "Update 更新测试", - "result": true - }, - { - "affected": 1, - "name": "Delete 删除测试", - "result": true - } - ] - }, - "status": 0 - }, - "expect": { - "result": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample", - "result": true - } - ] - }, - "status": 0 - } - } - ], - "ctr": "test", - "method": "GET", - "params": [], - "path": "/app/test/crud", - "project": "app", - "summary": "基础 CRUD 测试", - "tested": true - }, - { - "cases": [ - { - "name": "JOIN查询", - "method": "GET", - "passed": true, - "response": { - "result": { - "name": "JOIN查询测试", - "success": true, - "tests": [ - { - "count": 5, - "data": [ - { - "ctg_name": "新闻资讯", - "id": 1, - "title": "数据库入门指南" - }, - { - "ctg_name": "新闻资讯", - "id": 2, - "title": "新闻发布系统上线公告" - }, - { - "ctg_name": "新闻资讯", - "id": 11, - "title": "高点击量文章" - }, - { - "ctg_name": "技术文档", - "id": 3, - "title": "Go语言最佳实践" - }, - { - "ctg_name": "技术文档", - "id": 4, - "title": "API接口设计规范" - } - ], - "name": "LEFT JOIN 链式查询", - "result": true - }, - { - "count": 5, - "lastQuery": "SELECT `article`.`id`, `article`.`title`, `ctg`.`name` as ctg_name FROM `article` LEFT JOIN `ctg` ON `article`.`ctg_id` = `ctg`.`id` WHERE `article`.`state` =? LIMIT 5 ;", - "name": "传统 JOIN 语法", - "result": true - }, - { - "count": 5, - "data": [ - { - "admin_name": "超级管理员", - "ctg_name": "新闻资讯", - "id": 1, - "title": "数据库入门指南" - }, - { - "admin_name": "编辑员", - "ctg_name": "新闻资讯", - "id": 2, - "title": "新闻发布系统上线公告" - }, - { - "admin_name": "编辑员", - "ctg_name": "新闻资讯", - "id": 11, - "title": "高点击量文章" - }, - { - "admin_name": "超级管理员", - "ctg_name": "技术文档", - "id": 3, - "title": "Go语言最佳实践" - }, - { - "admin_name": "审核员", - "ctg_name": "技术文档", - "id": 4, - "title": "API接口设计规范" - } - ], - "name": "多表 JOIN", - "result": true - }, - { - "count": 5, - "name": "INNER JOIN", - "result": true - } - ] - }, - "status": 0 - }, - "expect": { - "result": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - }, - "status": 0 - } - } - ], - "ctr": "test", - "method": "GET", - "params": [], - "path": "/app/test/join", - "project": "app", - "summary": "JOIN 查询测试", - "tested": true - }, - { - "cases": [ - { - "name": "分页查询", - "method": "GET", - "passed": true, - "response": { - "result": { - "name": "分页查询测试", - "success": true, - "tests": [ - { - "count": 5, - "name": "PageSelect 分页查询", - "result": true - }, - { - "count": 4, - "name": "PageSelect 第二页", - "result": true - }, - { - "count": 3, - "name": "链式 Page 分页", - "result": true - }, - { - "count": 3, - "lastQuery": "SELECT id,title FROM `article` WHERE (`state` =?) LIMIT 3 OFFSET 2 ;", - "name": "Offset 偏移查询", - "result": true - } - ] - }, - "status": 0 - }, - "expect": { - "result": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - }, - "status": 0 - } - } - ], - "ctr": "test", - "method": "GET", - "params": [], - "path": "/app/test/pagination", - "project": "app", - "summary": "分页查询测试", - "tested": true - }, - { - "cases": [ - { - "name": "固定返回错误码2", - "method": "GET", - "passed": true, - "response": { - "error": { - "msg": "dsadasd", - "type": "访问权限异常" - }, - "result": { - "msg": "dsadasd", - "type": "访问权限异常" - }, - "status": 2 - }, - "expect": { - "error": { - "msg": "dsadasd", - "type": "访问权限异常" - }, - "result": { - "msg": "dsadasd", - "type": "访问权限异常" - }, - "status": 2 - } - } - ], - "ctr": "test", - "method": "GET", - "params": [], - "path": "/app/test/test", - "project": "app", - "summary": "固定错误返回", - "tested": true - }, - { - "cases": [ - { - "name": "事务测试", - "method": "GET", - "passed": true, - "response": { - "result": { - "name": "事务测试", - "success": true, - "tests": [ - { - "name": "事务成功提交", - "recordExists": true, - "result": true - }, - { - "name": "事务回滚", - "recordRolledBack": false, - "result": true - } - ] - }, - "status": 0 - }, - "expect": { - "result": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - }, - "status": 0 - } - } - ], - "ctr": "test", - "method": "GET", - "params": [], - "path": "/app/test/transaction", - "project": "app", - "summary": "事务测试", - "tested": true - }, - { - "cases": [ - { - "name": "Upsert测试", - "method": "GET", - "passed": true, - "response": { - "result": { - "name": "Upsert测试", - "success": true, - "tests": [ - { - "affected": 1, - "lastQuery": "INSERT INTO `admin` (`create_time`, `modify_time`, `name`, `phone`, `state`, `password`, `role_id`, `title`) VALUES (NOW(), NOW(), ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `state` = VALUES(`state`), `title` = VALUES(`title`), `modify_time` = NOW()", - "name": "Upsert 插入新记录 (admin表)", - "result": true - }, - { - "affected": 2, - "name": "Upsert 更新已存在记录", - "result": true, - "updatedAdmin": { - "create_time": "2026-07-13 09:19:02", - "id": 80, - "modify_time": "2026-07-13 09:19:02", - "name": "Upsert更新后管理员", - "password": "test123", - "phone": "19983934341", - "role_id": 2, - "state": 1, - "title": "更新后职位" - } - } - ] - }, - "status": 0 - }, - "expect": { - "result": { - "name": "sample", - "success": true, - "tests": [ - { - "name": "sample" - } - ] - }, - "status": 0 - } - } - ], - "ctr": "test", - "method": "GET", - "params": [], - "path": "/app/test/upsert", - "project": "app", - "summary": "Upsert 测试", - "tested": true - } - ], - "flows": [ - { - "desc": "expect_demo 多接口联调", - "group": "expect_demo", - "name": "expect_chain", - "passed": true, - "prep": "依次调用 string_result 与 map_result。\n步骤通过 FromCase 复用单接口验收用例的请求模板,跑通后回写该用例的响应与通过状态。", - "steps": [ - { - "bindCase": "result是字符串", - "caseName": "步骤1-字符串", - "expect": { - "result": "样本", - "status": 0 - }, - "failReason": "", - "form": null, - "index": 1, - "json": null, - "method": "GET", - "name": "字符串结果", - "note": "校验字符串 result:期望返回「操作成功」。", - "passed": true, - "path": "/app/expect_demo/string_result", - "query": null, - "response": { - "result": "操作成功", - "status": 0 - }, - "verifyError": "" - }, - { - "bindCase": "result是Map-校验字段名+类型+值", - "caseName": "步骤2-Map", - "expect": { - "result": { - "id": 1, - "in_stock": true, - "name": "sample", - "price": 1 - }, - "status": 0 - }, - "failReason": "", - "form": null, - "index": 2, - "json": null, - "method": "GET", - "name": "Map结果", - "note": "校验对象 result:至少包含 id=1,用于串联后续步骤前的结构确认。", - "passed": true, - "path": "/app/expect_demo/map_result", - "query": null, - "response": { - "result": { - "id": 1, - "in_stock": true, - "name": "示例商品", - "price": 19.9 - }, - "status": 0 - }, - "verifyError": "" - } - ] - } - ], - "title": "My API", - "version": "1.0.0" -} \ No newline at end of file diff --git a/example/tpt/swagger/app/index.html b/example/tpt/swagger/app/index.html deleted file mode 100644 index 145b4d0..0000000 --- a/example/tpt/swagger/app/index.html +++ /dev/null @@ -1,700 +0,0 @@ - -