第十二章:测试与验证

第十二章:测试与验证

🧪 本章详细介绍 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 测试工具                                        │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

下一章:技术栈分析 →

← 返回目录