139 lines
8.2 KiB
Markdown
139 lines
8.2 KiB
Markdown
# dbtool-tui-v1 测试策略(阶段 2 分层版)
|
||
|
||
## 目标
|
||
|
||
- 把 `dbtool-tui-v1` 的 shell baseline 验收、第二阶段 live integration 验收、以及非交互 / 发布前验证彻底拆层。
|
||
- 让 QA 对每个关键用户流都能给出“已执行通过 / 未执行 / 被 blocker 卡住”的可审计判断。
|
||
- 让 CTO 和 Product Manager 看到真实优先级:先 shared app 契约,再 live 接线,最后才是 live 验收闭环。
|
||
|
||
## 当前资产盘点
|
||
|
||
### 已存在的共享资产
|
||
|
||
- `apps/tui/src/main.rs`:TUI 主实现,当前已接入 `sqlite-local` 与 PostgreSQL / MySQL demo profile 的真实 connect / inspect / query / export 路径
|
||
- `apps/tui/README.md`:当前交互范围与产品/体验说明
|
||
- `TUI_ACCEPTANCE_CHECKLIST.md`:阶段 2 分层验收矩阵
|
||
- `TUI_REGRESSION_CHECKLIST.md`:阶段 2 分层回归清单
|
||
- `plans/2026-03-27-dbtool-tui-v1-phase-2-scope.md`:CTO 第二阶段范围与 gating
|
||
- `backlog/2026-03-27-dbtool-tui-v1-phase-2-issues.md`:owner-backed issue 分解
|
||
- `scripts/tui/demo-stack.sh`:无 `docker compose` 子命令时的 demo stack / seed 统一入口
|
||
- `scripts/tui/live-network-smoke.sh`:PostgreSQL / MySQL 的 TTY live smoke 入口
|
||
|
||
### 已发现的测试资产
|
||
|
||
- `apps/tui/src/main.rs` 内当前有 9 个内联测试,覆盖:
|
||
- query 草稿切换
|
||
- editor `Enter` 触发 running
|
||
- empty query 完成态
|
||
- results 宽表列分页
|
||
- insert mode 录入
|
||
- export 成功态映射
|
||
- 非 TTY 提示文案
|
||
- TTY 检测辅助函数
|
||
- connection-qualified query draft 生成
|
||
- 当前存在可执行的预构建二进制:`target/debug/dbtool-tui`
|
||
- 当前最小可重复 smoke 入口:`scripts/tui/smoke-tty.sh ./target/debug/dbtool-tui`
|
||
|
||
### 2026-03-27 ~ 2026-03-31 已执行证据
|
||
|
||
- TTY shell smoke:`./target/debug/dbtool-tui` 在 `120x40` 下可启动、渲染并以 `q` 退出,退出码 `0`
|
||
- 小终端降级:同一二进制在 `90x20` 下显示 `Terminal Too Small` 与 `Resize the terminal`,退出码 `0`
|
||
- 源码重建:`CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse cargo build -p dbtool-tui` 直接通过
|
||
- 源码测试:`CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse cargo test -p dbtool-tui` 直接通过,`9` 个测试全绿
|
||
- 非交互限制:源码重建后的 `./target/debug/dbtool-tui --help` 在无 TTY 场景下返回退出码 `1`,并明确提示需要交互式 TTY 以及 `scripts/tui/smoke-tty.sh`
|
||
- PostgreSQL live smoke:`scripts/tui/live-network-smoke.sh postgres ./target/debug/dbtool-tui` 直接通过
|
||
- MySQL live smoke:`scripts/tui/live-network-smoke.sh mysql ./target/debug/dbtool-tui` 直接通过
|
||
- PostgreSQL auth-failure visibility:`/tmp/dbtool-tui-postgres-auth-failure.log` 已见 `Connection Failure`、`Recovery path`、`postgres authentication failed`
|
||
- PostgreSQL empty / error result:`/tmp/dbtool-tui-postgres-empty-result.log` 已见 `0 rows returned in 77 ms`;`/tmp/dbtool-tui-postgres-bad-sql.log` 已见 `Query error`
|
||
- MySQL empty schema / browse stability:`/tmp/dbtool-tui-mysql-empty-schema.log` 已见 `Schema dbtool_demo is empty...`;`/tmp/dbtool-tui-mysql-browse-stability.log` 已见 `4 rows returned in 2 ms` 与 `Result columns paged to 2-5 of 6`
|
||
- PostgreSQL restricted-schema probe:2026-03-31 当前 runner 已直接复验 `/tmp/cmp64-role-probe-v4.json`、`/tmp/cmp64-postgres-root-inspect-v4.json`、`/tmp/cmp64-postgres-restricted-schema-inspect-v4.stderr.txt`、`/tmp/cmp64-postgres-restricted-query-v4.stderr.txt` 与 `/tmp/cmp64-tui-restricted-live-v6.log`;当前可直接观察到 non-superuser demo role、schema-level `restricted`、inspect error、query error 与 TUI query-blocking copy
|
||
|
||
### 当前缺口
|
||
|
||
- 当前 repo 仍只有内置 `sqlite-local` / `reporting-postgres` / `orders-mysql` profile;连接 profile 的新增 / 编辑 / 删除 / 保存与 session-only secret cache 仍未进入当前可执行验收面。
|
||
- 当前 runner 默认裸 `cargo` 会因为空的 `CARGO_REGISTRIES_CRATES_IO_PROTOCOL` 环境变量直接失败;runbook 必须显式写出 override
|
||
- `.github/workflows/release-smoke.yml` 当前只覆盖 `dbtool`
|
||
- 当前 runner 已补齐 failure、empty、bad-SQL、browse-stability 与 PostgreSQL restricted-schema 的直证;剩余缺口已收敛为 packaged binary / CI / 非开发者复验,而不是 runner-side live semantics
|
||
- release artifact / packaged binary 仍缺真实 smoke
|
||
- 状态恢复与键盘一致性需要单独留痕,避免 QA 按旧文档复核不存在的快捷键
|
||
|
||
## 测试分层
|
||
|
||
### 1. 源码层验证
|
||
|
||
- 目标:确认实现可重建、内联测试可运行
|
||
- 当前命令:
|
||
- `CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse cargo build -p dbtool-tui`
|
||
- `CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse cargo test -p dbtool-tui`
|
||
- 当前判断:
|
||
- 这是必要层,且 2026-03-28 当前 runner 已给出直接通过结论
|
||
- 默认裸 `cargo` 失败仍应记为环境口径风险,不能误写成产品失败
|
||
|
||
### 2. TTY shell smoke
|
||
|
||
- 目标:最低成本确认 TUI 可启动、可渲染、可退出、可在小终端降级
|
||
- 当前建议:
|
||
- 使用 `scripts/tui/smoke-tty.sh` 固化 TTY 启动路径
|
||
- 用预构建二进制先取证,再视环境补做源码重建后的同路径复核
|
||
- 注意:
|
||
- `dbtool-tui` 不是普通 CLI;不要用 `--help` 替代交互 smoke
|
||
- 共享执行口径收敛到 `TUI_SMOKE_RUNBOOK.md`
|
||
|
||
### 3. Shell 交互回归(当前可见工作区)
|
||
|
||
- 目标:验证当前 shell 已实现的交互骨架,但不把当前可见工作区直接误记为完整的 network-live 能力
|
||
- 范围:
|
||
- 视图切换
|
||
- 焦点切换
|
||
- 静态连接激活
|
||
- 静态 schema / object 浏览
|
||
- 查询草稿切换、插入模式、运行占位、结果分页
|
||
- 错误 / 空状态 / 恢复路径
|
||
- `Esc` / `r` / `Enter` / `[` / `]` 的键位一致性
|
||
- 输出要求:
|
||
- 明确标记“这是 shell 示例状态验证,不是 shared app live 数据验证”
|
||
|
||
### 4. 第二阶段 live integration 验收
|
||
|
||
- 目标:在当前已存在的 runner-side live path 之上,对连接、inspect、query、results、export 给出更完整的验收判断
|
||
- 当前已具备的 happy-path 入口:
|
||
- `scripts/tui/live-network-smoke.sh postgres ./target/debug/dbtool-tui`
|
||
- `scripts/tui/live-network-smoke.sh mysql ./target/debug/dbtool-tui`
|
||
- 必验路径:
|
||
- 真实连接 `loading` / `success` / `failure`
|
||
- 真实 inspect ready / empty / restricted
|
||
- 真实 query running / success / empty / error
|
||
- export 成功 / 失败反馈
|
||
- shared app 边界复用,无 CLI 文本解析旁路
|
||
|
||
### 5. 发布前 / 非交互验证
|
||
|
||
- 目标:确认非开发者与 CI 都能重复最小验收
|
||
- 当前判断:
|
||
- 尚未建立
|
||
- 若后续仍要求 TTY 启动,应在 runbook 与 workflow 中显式写清,不得假装支持普通非交互 `--help` / `--version` smoke
|
||
|
||
## 证据规则
|
||
|
||
- 每个“通过”项都必须附带命令、终端尺寸、输入按键、输出摘要或错误摘要
|
||
- 每个“未执行”项都必须标原因:未实现、缺环境、被上游 issue 卡住、或超出当前范围
|
||
- 代码阅读、README 声明、和真实执行证据必须分开写
|
||
- 不能用 CLI 已通过来替代 TUI 已通过
|
||
- 不能把静态示例状态写成真实数据库能力
|
||
- 不能把 TTY 程序的 `--help` 失败误写成已支持的 smoke 入口
|
||
|
||
## 当前优先级
|
||
|
||
1. 保住 shell baseline 证据,不让第二阶段重构把它冲掉
|
||
2. 补 TUI CI / packaged-binary / release smoke
|
||
3. 固化非开发者可重复 runbook
|
||
4. 保持现有 live 证据不回退
|
||
|
||
## 当前验收判断
|
||
|
||
- shell baseline:有预构建二进制级别的可重复 smoke,属“通过”
|
||
- 源码层验证:当前 runner 已通过,但需要在 runbook 中固化 cargo 环境变量 override
|
||
- 第二阶段 live integration:当前 runner 内 PostgreSQL / MySQL demo happy path、failure visibility、empty / error result、empty schema、browse-stability 与 PostgreSQL restricted schema 已补齐直接证据;当前未就绪项已切换为 release / artifact / CI 证据
|
||
- 连接管理:当前仍 blocked;当前 TUI 只支持内置 demo profile 与启动前 env override,不能把这组 operator 路径上抬成已交付的 profile CRUD / secret-management 验收
|
||
- 发布前状态:未就绪,因为 `dbtool-tui` 仍缺 CI 与 release artifact smoke
|