第十二章:测试与验证
🧪 本章详细介绍 MiniClaw 的测试机制和验证方法。
12.1 验证脚本分析
12.1.1 verify_kernel.ts 功能
┌─────────────────────────────────────────────────────────────────────┐
│ verify_kernel.ts 概述 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 位置:scripts/verify_kernel.ts │
│ 功能:验证 MiniClaw 内核功能是否正常工作 │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 验证项目: │ │
│ │ ├── ✅ 运行时信息生成 │ │
│ │ ├── ✅ 身份注入 │ │
│ │ ├── ✅ 子代理模式 │ │
│ │ ├── ✅ 工作空间感知 │ │
│ │ └── ✅ 执行能力 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 运行方式: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ npx ts-node scripts/verify_kernel.ts │ │
│ │ # 或 │ │
│ │ node --loader ts-node/esm scripts/verify_kernel.ts │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
12.1.2 验证项目详解
┌─────────────────────────────────────────────────────────────────────┐
│ 验证项目详解 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1️⃣ 运行时信息生成 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 验证内容: │ │
│ │ • 当前时间戳是否正确 │ │
│ │ • 时间模式是否匹配当前时段 │ │
│ │ • 运行时环境信息是否完整 │ │
│ │ │ │
│ │ 预期输出: │ │
│ │ { │ │
│ │ "timestamp": "2026-02-12T14:30:00Z", │ │
│ │ "timeMode": "work", │ │
│ │ "platform": "darwin", │ │
│ │ "nodeVersion": "v20.0.0" │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 2️⃣ 身份注入 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 验证内容: │ │
│ │ • IDENTITY.md 是否存在 │ │
│ │ • 身份信息是否正确加载 │ │
│ │ • Emoji 是否正确显示 │ │
│ │ │ │
│ │ 预期输出: │ │
│ │ { │ │
│ │ "name": "Claw", │ │
│ │ "emoji": "🦞", │ │
│ │ "vibe": "helpful and resourceful" │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 3️⃣ 子代理模式 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 验证内容: │ │
│ │ • minimal 模式是否正常工作 │ │
│ │ • 子代理上下文是否精简 │ │
│ │ • 是否跳过不必要的加载 │ │
│ │ │ │
│ │ 预期输出: │ │
│ │ • 上下文大小 < 500 字符 │ │
│ │ • 不包含 MEMORY.md 内容 │ │
│ │ • 不包含工作空间感知 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 4️⃣ 工作空间感知 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 验证内容: │ │
│ │ • 项目名称是否正确识别 │ │
│ │ • Git 状态是否正确检测 │ │
│ │ • 技术栈是否正确识别 │ │
│ │ │ │
│ │ 预期输出: │ │
│ │ { │ │
│ │ "projectName": "miniclaw", │ │
│ │ "gitBranch": "main", │ │
│ │ "techStack": ["TypeScript", "Node.js"] │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 5️⃣ 执行能力 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 验证内容: │ │
│ │ • 安全命令是否能执行 │ │
│ │ • 危险命令是否被拒绝 │ │
│ │ • 超时机制是否生效 │ │
│ │ │ │
│ │ 预期输出: │ │
│ │ • "echo hello" → 成功 │ │
│ │ • "rm -rf /" → 拒绝 │ │
│ │ • 超时命令 → 超时错误 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
12.2 测试建议
12.2.1 单元测试覆盖
┌─────────────────────────────────────────────────────────────────────┐
│ 单元测试建议 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 建议测试框架:Jest / Vitest │
│ │
│ 测试文件结构: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ tests/ │ │
│ │ ├── unit/ │ │
│ │ │ ├── kernel.test.ts # 内核单元测试 │ │
│ │ │ ├── skillCache.test.ts # 技能缓存测试 │ │
│ │ │ ├── entityStore.test.ts # 实体存储测试 │ │
│ │ │ └── utils.test.ts # 工具函数测试 │ │
│ │ │ │ │
│ │ └── integration/ │ │
│ │ ├── boot.test.ts # 启动集成测试 │ │
│ │ ├── tools.test.ts # 工具集成测试 │ │
│ │ └── prompts.test.ts # 提示词集成测试 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 关键测试用例: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ describe('SkillCache', () => { │ │
│ │ it('should cache skills with TTL', async () => {...}); │ │
│ │ it('should invalidate cache on demand', async () => {...});│ │
│ │ }); │ │
│ │ │ │
│ │ describe('EntityStore', () => { │ │
│ │ it('should add and retrieve entities', async () => {...});│ │
│ │ it('should link related entities', async () => {...}); │ │
│ │ it('should surface relevant entities', async () => {...});│ │
│ │ }); │ │
│ │ │ │
│ │ describe('getTimeMode', () => { │ │
│ │ it('should return morning at 7am', () => {...}); │ │
│ │ it('should return work at 10am', () => {...}); │ │
│ │ it('should return night at 2am', () => {...}); │ │
│ │ }); │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
12.2.2 集成测试场景
┌─────────────────────────────────────────────────────────────────────┐
│ 集成测试场景 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 场景 1:完整启动流程 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1. 创建临时测试目录 │ │
│ │ 2. 初始化模板文件 │ │
│ │ 3. 调用 kernel.boot() │ │
│ │ 4. 验证上下文内容 │ │
│ │ 5. 清理测试目录 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 场景 2:工具调用流程 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1. 模拟 MCP 工具调用请求 │ │
│ │ 2. 调用 miniclaw_note │ │
│ │ 3. 验证日志文件创建 │ │
│ │ 4. 调用 miniclaw_update │ │
│ │ 5. 验证文件更新 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 场景 3:记忆蒸馏流程 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1. 创建大量日志条目 │ │
│ │ 2. 触发蒸馏评估 │ │
│ │ 3. 验证蒸馏条件判断 │ │
│ │ 4. 执行蒸馏操作 │ │
│ │ 5. 验证 MEMORY.md 更新 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 场景 4:心跳机制 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1. 模拟心跳触发 │ │
│ │ 2. 验证状态更新 │ │
│ │ 3. 验证蒸馏评估 │ │
│ │ 4. 验证日志记录 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
12.2.3 端到端测试流程
┌─────────────────────────────────────────────────────────────────────┐
│ 端到端测试流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 测试环境准备 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1. 启动测试用 MCP 客户端 │ │
│ │ 2. 配置 MiniClaw MCP Server │ │
│ │ 3. 准备测试数据目录 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 测试用例 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ TC-001: 首次启动流程 │ │
│ │ ├── 输入:空数据目录 │ │
│ │ ├── 操作:启动 MCP Server │ │
│ │ └── 预期:创建默认模板文件 │ │
│ │ │ │
│ │ TC-002: 身份询问 │ │
│ │ ├── 输入:用户询问"你是谁" │ │
│ │ ├── 操作:调用 miniclaw_wakeup │ │
│ │ └── 预期:返回身份信息 │ │
│ │ │ │
│ │ TC-003: 记忆记录 │ │
│ │ ├── 输入:用户说"记住我喜欢简洁" │ │
│ │ ├── 操作:调用 miniclaw_note + miniclaw_update │ │
│ │ └── 预期:USER.md 更新,日志记录 │ │
│ │ │ │
│ │ TC-004: 命令执行 │ │
│ │ ├── 输入:执行 "ls -la" │ │
│ │ ├── 操作:调用 miniclaw_exec │ │
│ │ └── 预期:返回目录列表 │ │
│ │ │ │
│ │ TC-005: 危险命令拒绝 │ │
│ │ ├── 输入:执行 "rm -rf /" │ │
│ │ ├── 操作:调用 miniclaw_exec │ │
│ │ └── 预期:返回拒绝错误 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
12.3 测试覆盖率目标
┌─────────────────────────────────────────────────────────────────────┐
│ 测试覆盖率目标 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 模块 目标覆盖率 │ │
│ │ ───────────────────────────────────────────────────────── │ │
│ │ kernel.ts > 80% │ │
│ │ index.ts > 70% │ │
│ │ 工具函数 > 90% │ │
│ │ 整体 > 75% │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 关键测试点: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ ✅ 时间模式检测 │ │
│ │ ✅ Token 预算编译 │ │
│ │ ✅ 命令白名单检查 │ │
│ │ ✅ 实体管理操作 │ │
│ │ ✅ 技能缓存机制 │ │
│ │ ✅ 文件读写操作 │ │
│ │ ✅ 错误处理路径 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
12.4 调试技巧
12.4.1 日志调试
┌─────────────────────────────────────────────────────────────────────┐
│ 日志调试技巧 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 启用调试日志 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ # 设置环境变量启用调试 │ │
│ │ DEBUG=miniclaw:* npx -y miniclaw │ │
│ │ │ │
│ │ # 或在代码中添加 │ │
│ │ console.error('[DEBUG]', message); │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 关键日志点 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ • boot() 启动流程 │ │
│ │ • 时间模式检测 │ │
│ │ • Token 预算分配 │ │
│ │ • 工具调用 │ │
│ │ • 命令执行 │ │
│ │ • 错误捕获 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
12.4.2 手动测试命令
┌─────────────────────────────────────────────────────────────────────┐
│ 手动测试命令 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 测试上下文编译 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ # 使用 MCP CLI 测试 │ │
│ │ npx @modelcontextprotocol/inspector npx -y miniclaw │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 测试工具调用 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ # 在 MCP Inspector 中测试 │ │
│ │ 1. 连接到 miniclaw server │ │
│ │ 2. 调用 miniclaw_status │ │
│ │ 3. 检查返回结果 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 测试资源读取 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ # 读取上下文资源 │ │
│ │ GET miniclaw://context │ │
│ │ │ │
│ │ # 读取技能索引 │ │
│ │ GET miniclaw://skills │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
本章小结
┌─────────────────────────────────────────────────────────────────────┐
│ 第十二章 核心要点 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 🧪 验证脚本 │
│ • verify_kernel.ts 验证核心功能 │
│ • 5 个验证项目:运行时、身份、子代理、工作空间、执行 │
│ │
│ 📋 测试建议 │
│ • 单元测试:Jest/Vitest,目标覆盖率 > 75% │
│ • 集成测试:完整流程验证 │
│ • 端到端测试:MCP 客户端集成 │
│ │
│ 🔍 调试技巧 │
│ • DEBUG=miniclaw:* 启用调试日志 │
│ • MCP Inspector 测试工具 │
│ │
└─────────────────────────────────────────────────────────────────────┘
下一章:技术栈分析 →