# 全站测试体系设计(2026-06-08) ## 背景与目标 Nexus 6.0 已有 **~60 个 pytest 模块**、`tests/test_api.py` 门控脚本、`frontend/e2e/full-acceptance.spec.mjs`(15 条 UI 冒烟)、`scripts/run_nexus_acceptance.py` 统一验收入口。缺口在于: - 单元测试按**功能域**未全覆盖,前端几乎无单测 - 集成测试以手写 `urllib` 为主,缺契约快照与 DB 夹具规范 - **链条测试**(多 API / 多页面 / WS / 后台任务)用例未系统化 - Agent **MCP 浏览器点页**有 Playwright MCP,但未沉淀为可重复用例清单 **目标**:建立四层测试金字塔 + Agent MCP 探索层,全部有**编号用例**、可 CI、可 `run_nexus_acceptance.py` 汇总。 ## 方案对比 | 方案 | 优点 | 缺点 | 结论 | |------|------|------|------| | A. 仅扩 pytest | 与现门控一致 | 无真实 UI 交互 | 作为 L1–L3 底座 | | B. 仅 Playwright | 贴近用户 | 慢、脆、难测纯逻辑 | 作为 L4 | | C. MCP 临时点页 | Agent 灵活 | 不可 CI、难回归 | 作为 L5 探索 + 用例沉淀到 B | | **D. 四层 + MCP 规程(选定)** | 分工清晰、可渐进 | 初期文档/用例工作量大 | ✅ | ## 选定架构 ``` ┌─────────────────────┐ │ L5 Agent MCP 探索 │ 新功能/回归抽测 → 沉淀为 L4 └──────────┬──────────┘ ┌──────────▼──────────┐ │ L4 UI E2E (Playwright)│ frontend/e2e/*.spec.mjs └──────────┬──────────┘ ┌──────────▼──────────┐ │ L3 链条 (Chain) │ tests/chain/ + pytest markers └──────────┬──────────┘ ┌──────────▼──────────┐ │ L2 集成 (API+DB) │ tests/integration/ + test_api.py └──────────┬──────────┘ ┌──────────▼──────────┐ │ L1 单元 (Unit) │ tests/unit/ 按域拆分 └─────────────────────┘ ``` ### 工具链 | 层 | 工具 | CI | Agent MCP | |----|------|-----|-----------| | L1 | pytest + pytest-asyncio + 内存 SQLite/假 Redis | ✅ gitea workflow | 否 | | L2 | pytest + httpx AsyncClient + docker mysql/redis | ✅ 可选 job | MySQL MCP 验数 | | L3 | pytest markers `@pytest.mark.chain` | ✅ nightly | 否 | | L4 | `@playwright/test` | ✅ `--with-ui` | Playwright MCP 对照用例 | | L5 | Playwright MCP `browser_*` | ❌ 人工触发 Agent | ✅ | ### 目录规划(渐进迁移,不一次性搬空 tests/) ``` tests/ unit/ # 纯函数、schema、utils(从现有 test_*.py 归类迁入) integration/ # API + DB,httpx TestClient / 活 API chain/ # 多步业务流 fixtures/ # 共享 conftest 分层 acceptance_catalog.py # 扩展 layer: unit|integration|chain|ui|mcp frontend/e2e/ pages/ # 每页一个 spec(从 full-acceptance 拆分) flows/ # 链条:登录→推送→进度→历史 docs/testing/ test-case-matrix.md # 全量用例 SSOT(编号) mcp-browser-playbook.md # Agent MCP 点页规程 ``` ### MCP Agent 点页规程(原则) 1. **用例先行**:每个 MCP 探索必须对应 `docs/testing/test-case-matrix.md` 中 `MCP-*` 编号 2. **步骤可复现**:snapshot → click → assert 文本;截图存 `docs/reports/e2e-screenshots/` 3. **禁止生产破坏性操作**:推送/脚本执行/批量删除仅对 `test-*` 子机或 dry-run 4. **沉淀**:MCP 通过的流程 7 日内写入 Playwright spec(L4) ### 安全与性能约束 - 测试账号:`NEXUS_TEST_ADMIN_*`,禁止写生产密钥入 git - E2E 默认 `127.0.0.1:8600`;生产 URL 仅只读冒烟且需用户批准 - 链条测试子机:标记 `is_test=1` 或使用 ID 段约定(文档化) - 单 CI job pytest 目标 < 10min;chain/ui 放 nightly ## 验收标准(体系本身) - [ ] `docs/testing/test-case-matrix.md` 覆盖 15 SPA 页 + 安装向导 + Agent 心跳 - [ ] 每层有 ≥1 个可运行示例用例与命令 - [ ] `run_nexus_acceptance.py` 能 rollup unit/integration/chain/ui 四层 - [ ] Agent 手册 `mcp-browser-playbook.md` 含登录、推送提交、脚本执行看板 3 条标准 MCP 流 - [ ] CI:PR 跑 L1+L2;main nightly 跑 L3+L4