|
|
@@ -0,0 +1,229 @@
|
|
|
+# odbtools / odbctest 测试工具梳理报告
|
|
|
+
|
|
|
+**生成时间:** 2026-05-10 15:50 CST
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、总览
|
|
|
+
|
|
|
+odbtools 是 odbserver 的配套工具集,包含 MQL 测试框架、数据同步、REST API 测试等模块。
|
|
|
+
|
|
|
+| 模块 | Go文件 | 行数 | MQL测试文件 | 功能 |
|
|
|
+|------|--------|------|------------|------|
|
|
|
+| odbctest/odbcmql | 9 | 3,214 | — | **MQL测试框架核心** |
|
|
|
+| odbctest/mql | 1 | 15 | **899** | MQL测试用例入口+用例集 |
|
|
|
+| datasync | 3 | 897 | — | 数据同步工具 |
|
|
|
+| restapi | 2 | 282 | — | REST API 测试 |
|
|
|
+| syslog | 1 | 117 | — | 系统日志工具 |
|
|
|
+| omtool | 1 | 6 | — | 工具接口定义 |
|
|
|
+| **合计** | **17** | **4,531** | **899** | |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、odbctest — MQL 测试框架(核心)
|
|
|
+
|
|
|
+### 2.1 框架架构
|
|
|
+
|
|
|
+```
|
|
|
+odbctest/
|
|
|
+├── odbcmql/ # 测试框架核心引擎(9文件,3,214行Go代码)
|
|
|
+│ ├── mql_run.go # 主引擎:文件遍历→解析→执行→断言(~1100行)
|
|
|
+│ ├── mql_prepare.go # MQL预处理:变量替换、动作解析
|
|
|
+│ ├── mqls_action.go # 动作定义与解析(/** ... **/ 标注块)
|
|
|
+│ ├── mqls_do.go # 执行器:发送MQL到odbserver
|
|
|
+│ ├── mqls_doaction.go # 执行后动作处理(output/count/match/schema等)
|
|
|
+│ ├── mqls_match.go # 结果匹配/断言逻辑
|
|
|
+│ ├── mqls_sub.go # 订阅/通知机制
|
|
|
+│ ├── mql_odbc_query.go # ODBC查询封装
|
|
|
+│ └── cfglog.go # 日志配置
|
|
|
+│
|
|
|
+└── mql/ # 测试用例入口 + MQL脚本集
|
|
|
+ ├── mql_test.go # Go test入口(15行)
|
|
|
+ ├── mql.conf # 配置文件(odbpath/keyspace/timeout)
|
|
|
+ ├── mqltest.sh # Shell启动脚本
|
|
|
+ └── {test_suites}/ # 899个 .mql 测试文件
|
|
|
+```
|
|
|
+
|
|
|
+### 2.2 运行方式
|
|
|
+
|
|
|
+```bash
|
|
|
+# 方式1: Go test
|
|
|
+go test -v -run TestMQL ./odbctest/mql/ -- ./
|
|
|
+
|
|
|
+# 方式2: 预编译的 mql 二进制
|
|
|
+./mql . # 循环执行当前目录所有匹配的mql文件
|
|
|
+./mql basic/10basic # 执行指定目录
|
|
|
+./mql . match=^\d+ # 文件名匹配过滤
|
|
|
+./mql -- "select * from /test" # 直接执行mql语句
|
|
|
+```
|
|
|
+
|
|
|
+**关键参数:**
|
|
|
+- `odb=ip:port` — 指定odbserver地址
|
|
|
+- `keyspace=xxx` — 指定keyspace
|
|
|
+- `match=正则` — 文件名过滤(默认 `^\d+.*` 即以数字开头)
|
|
|
+- `debug=true` — 调试模式
|
|
|
+
|
|
|
+### 2.3 MQL 测试文件格式
|
|
|
+
|
|
|
+每个 `.mql` 文件包含一条或多条 MQL 语句,语句间用 `;` 分隔。通过 `/** ... **/` 标注块附加执行控制指令。
|
|
|
+
|
|
|
+```sql
|
|
|
+-- 示例:创建类+插入数据+查询验证
|
|
|
+create class if not exists /test/basic (
|
|
|
+ v_int int, v_varchar text,
|
|
|
+ keys(v_varchar)
|
|
|
+) with core=cassandraonly;
|
|
|
+
|
|
|
+insert into /test/basic (v_int, v_varchar) values (5, 'hello')
|
|
|
+/** sleep(3s) **/;
|
|
|
+
|
|
|
+select v_int, v_varchar from /test/basic where v_varchar = 'hello'
|
|
|
+/** output() match(v_int, 5) **/;
|
|
|
+```
|
|
|
+
|
|
|
+### 2.4 标注动作(Actions)体系
|
|
|
+
|
|
|
+**执行前动作:**
|
|
|
+| 动作 | 功能 |
|
|
|
+|------|------|
|
|
|
+| `skip()` | 跳过当前语句 |
|
|
|
+| `params(V)` | 为 prepare 语句提供 JSON 参数 |
|
|
|
+| `loop(N)` | 循环执行 N 次 |
|
|
|
+| `parallel(N)` | 并发执行,N为最大并发数 |
|
|
|
+| `scope(S)` | 作用域:top/dir/file/mql |
|
|
|
+| `timeout(D)` | 超时设置 |
|
|
|
+| `set(S,V)` / `add(S,V)` | 变量操作 |
|
|
|
+| `beforerun(F,...)` | 执行前预定义函数 |
|
|
|
+| `subscribe(S)` / `unsubscribe(S)` | 消息订阅 |
|
|
|
+| `fork(G)` / `wait(G)` | 并行分支控制 |
|
|
|
+| `qmeta(O)` | 查询选项设置 |
|
|
|
+
|
|
|
+**执行后动作(断言/验证):**
|
|
|
+| 动作 | 功能 |
|
|
|
+|------|------|
|
|
|
+| `output()` | 输出执行结果 |
|
|
|
+| `outputcount()` | 输出结果行数 |
|
|
|
+| `count(N)` | 验证结果记录数为 N |
|
|
|
+| `equal(N,F,V)` | 验证第N条记录字段F的值为V |
|
|
|
+| `match(K,V)` | 验证存在键值匹配的记录 |
|
|
|
+| `matchcount(K,V,N)` | 验证键值匹配记录数为N |
|
|
|
+| `schema(C)` | 验证类C存在 |
|
|
|
+| `sleep(D)` | 执行后等待 |
|
|
|
+| `metainfo()` | 输出元信息 |
|
|
|
+
|
|
|
+**错误处理动作:**
|
|
|
+| 动作 | 功能 |
|
|
|
+|------|------|
|
|
|
+| `retry(N)` | 出错重试N次 |
|
|
|
+| `onerror(O,E)` | 错误处理:break/continue/must/exit |
|
|
|
+| `noerrinfo()` | 屏蔽错误输出 |
|
|
|
+
|
|
|
+### 2.5 变量替换系统
|
|
|
+
|
|
|
+MQL语句中的 `{%fmt,varname}` 会被替换为对应变量值:
|
|
|
+
|
|
|
+| 变量 | 含义 |
|
|
|
+|------|------|
|
|
|
+| `{%d,topi}` / `{%d,diri}` / `{%d,filei}` / `{%d,mqli}` | 各级循环计数 |
|
|
|
+| `{%d,topcount}` / `{%d,dircount}` / `{%d,filecount}` / `{%d,mqlcount}` | 各级总计数 |
|
|
|
+| `{%s,keyspace}` / `{%s,ksnative}` | keyspace名 |
|
|
|
+| `{%d,rand}` | 0~1000000随机数 |
|
|
|
+| `{%t,now}` | 当前时间 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、测试用例分布(899个MQL文件)
|
|
|
+
|
|
|
+| 测试套件 | 文件数 | 测试范围 |
|
|
|
+|----------|--------|---------|
|
|
|
+| **basic/** | 479 | 基础功能全覆盖(最大测试集) |
|
|
|
+| **test/** | 143 | 专项测试(冲突/缓存/分区/压力/事件等) |
|
|
|
+| **uino/** | 83 | UINO相关测试 |
|
|
|
+| **0/** | 58 | 根级散列测试(MQL函数/JSON/搜索等) |
|
|
|
+| **bench/** | 48 | 性能基准测试 |
|
|
|
+| **problem/** | 26 | 已知问题回归测试 |
|
|
|
+| **matrix/** | 21 | 矩阵相关测试 |
|
|
|
+| **basic_scenario/** | 11 | 场景化集成测试 |
|
|
|
+| **create/** | 11 | 并发建类测试 |
|
|
|
+| **uino72/** | 7 | UINO v72测试 |
|
|
|
+| **notify/** | 6 | 消息通知测试 |
|
|
|
+| **auth/** | 4 | 认证授权测试 |
|
|
|
+| **bgrimm/** | 1 | 后台IMM测试 |
|
|
|
+| **vector/** | 1 | 向量检索测试 |
|
|
|
+
|
|
|
+### basic/ 核心测试集细分(479文件)
|
|
|
+
|
|
|
+| 子模块 | 说明 |
|
|
|
+|--------|------|
|
|
|
+| 00init / 01clear | 初始化与清理 |
|
|
|
+| 10basic | 基础CRUD(class/data/valid/field/int/bool/enum) |
|
|
|
+| 10cachedb | 缓存数据库 |
|
|
|
+| 10index | 索引 |
|
|
|
+| 10memdb / 10memdbexpired | 内存数据库及过期 |
|
|
|
+| 10native | Native查询 |
|
|
|
+| 10order | 排序 |
|
|
|
+| 10pubsub | 发布订阅 |
|
|
|
+| 11cacheonly / 11cncachedb / 11cncassdb / 11cnmemdb | 不同存储后端数据源 |
|
|
|
+| 11collect / 11localdb | 数据收集与本地库 |
|
|
|
+| 12datetime | 日期时间 |
|
|
|
+| 13delete / 13tuihualei | 删除与退花类 |
|
|
|
+| 14enum | 枚举类型 |
|
|
|
+| 15oo | 面向对象 |
|
|
|
+| 16alter | 类结构变更 |
|
|
|
+| 17cypher / 17xbase.select | Cypher语法/xbase查询 |
|
|
|
+| 18batch_insert / 19batch_update / 20batch_delete | 批量操作 |
|
|
|
+| 21~24 bucket_* | 时序桶(logs/strulogs/tsdb/promdb) |
|
|
|
+| 25~27 ckey/concat | 组合键 |
|
|
|
+| 30conflict* | 冲突处理(标准/缓存/本地/内存) |
|
|
|
+| 31~37 seq/uuid/network/partition/mpartition/prepare_* | 序列键/UUID键/网络/分区/预编译 |
|
|
|
+| 40~42 search_* | 全文检索 |
|
|
|
+| 49mix | 混合场景 |
|
|
|
+| 51tempclass / 52ootest | 临时类/OO测试 |
|
|
|
+| 98syntax / 99cassdb / 99ver | 语法/Cassandra/版本 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、其他工具模块
|
|
|
+
|
|
|
+### 4.1 datasync(数据同步)
|
|
|
+- 3个Go文件,897行
|
|
|
+- 功能:从源odbserver同步数据到目标odbserver
|
|
|
+- 入口:`datasync/main.go`
|
|
|
+
|
|
|
+### 4.2 restapi(REST接口测试)
|
|
|
+- 2个Go文件,282行
|
|
|
+- `rest.go`:封装HTTP请求+JSON解析+状态校验
|
|
|
+- `insert_test.go`:REST插入测试
|
|
|
+
|
|
|
+### 4.3 omtool(工具接口)
|
|
|
+- 1个Go文件,6行
|
|
|
+- 定义统一的工具接口 `OMTool`(Init/Run)
|
|
|
+
|
|
|
+### 4.4 syslog(系统日志)
|
|
|
+- 1个Go文件,117行
|
|
|
+- 系统日志采集/监控
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 五、依赖关系
|
|
|
+
|
|
|
+```
|
|
|
+odbtools
|
|
|
+ ├── git.wecise.com/wecise/odb-go (数据库SDK)
|
|
|
+ ├── gitee.com/wecisecode/util (开源工具库)
|
|
|
+ ├── github.com/stretchr/testify (测试断言)
|
|
|
+ ├── github.com/gofrs/flock (文件锁)
|
|
|
+ └── (传递依赖)
|
|
|
+ ├── git.wecise.com/wecise/common
|
|
|
+ └── git.wecise.com/wecise/util
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 六、关键发现
|
|
|
+
|
|
|
+1. **测试体系完善** — 899个MQL测试文件,覆盖CRUD、缓存、冲突、分区、全文检索、批量操作等几乎所有功能领域
|
|
|
+2. **测试框架设计精巧** — 通过 `/** action() **/` 标注块实现声明式断言,支持循环、并发、作用域、变量替换、错误处理
|
|
|
+3. **basic/ 是最大测试集** — 479个文件覆盖基础功能,test/ 专注边界和异常场景
|
|
|
+4. **生产可用** — 有 `problem/`(回归测试)、`bench/`(性能基准)、`test/stress_*`(压力测试)等生产级质量保障
|
|
|
+5. **框架代码量小** — 核心引擎仅3,214行Go代码,支撑了899个测试用例的执行
|