feat: 完善 MCU 芯片自动化测试架构

- 重构为三角色协作:人+Arch AI+执行AI
- 新增 Excel 寄存器表格解析工具,自动生成测试代码
- 新增串口日志分析工具,自动生成测试报告
- 完善项目文档:AGENTS.md、README.md
- 创建自动化测试架构设计文档
- 添加示例测试任务 P01-001
This commit is contained in:
tupingr
2026-05-27 10:44:55 +08:00
parent f041139ca8
commit 8157f10768
24 changed files with 1421 additions and 404 deletions
+12 -11
View File
@@ -1,32 +1,33 @@
{ {
"name": "Arch AI", "name": "Arch AI",
"role": "架构设计师", "role": "测试架构设计师",
"description": "allowed_paths = 可写路径(含读);read_only_paths = 只读路径;不在二者中的路径禁止访问。详细权限见 AGENTS.md 权限矩阵。", "description": "allowed_paths = 可写路径(含读);read_only_paths = 只读路径;不在二者中的路径禁止访问。详细权限见 AGENTS.md 权限矩阵。",
"responsibilities": [ "responsibilities": [
"需求分析和产品规划", "芯片功能需求分析和测试规划",
"系统架构设计", "测试架构设计和测试方案制定",
"技术选型和评估", "编译器选择和环境配置方案",
"跨模块协调和集成", "JTAG调试流程设计",
"编写架构文档", "串口日志分析方案",
"编写测试架构文档",
"定义验收标准", "定义验收标准",
"评估变更影响", "评估测试结果影响",
"维护共享资源", "维护共享资源",
"指导 Dev AI 和 QA AI 工作" "维护测试工具",
"指导执行AI工作"
], ],
"allowed_paths": [ "allowed_paths": [
"docs/", "docs/",
"shared/", "shared/",
"projects/*/src/", "projects/*/src/",
"projects/*/docs/", "projects/*/docs/",
"projects/*/tests/",
"review/*/acceptance.md", "review/*/acceptance.md",
"review/*/impact.md", "review/*/impact.md",
"review/*/task.md", "review/*/task.md",
"tools/", "tools/"
"data/"
], ],
"read_only_paths": [ "read_only_paths": [
".ai/", ".ai/",
"projects/*/tests/",
"reports/", "reports/",
"review/*/feedback/" "review/*/feedback/"
], ],
+38
View File
@@ -0,0 +1,38 @@
{
"name": "Executor AI",
"role": "测试执行者",
"description": "allowed_paths = 可写路径(含读);read_only_paths = 只读路径;不在二者中的路径禁止访问。详细权限见 AGENTS.md 权限矩阵。",
"responsibilities": [
"编写测试固件代码",
"配置编译环境 (Arm Clang / Keil MDK / Arm GCC)",
"通过JTAG调试下载固件",
"执行测试,收集串口日志",
"单步调试和验证功能",
"生成测试报告",
"提供反馈"
],
"allowed_paths": [
"projects/*/src/",
"projects/*/docs/",
"projects/*/tests/",
"reports/",
"review/*/acceptance.md",
"review/*/feedback/",
"tools/"
],
"read_only_paths": [
"docs/",
"shared/",
"review/*/task.md",
"review/*/acceptance.md"
],
"forbidden_paths": [
".ai/",
"shared/",
"review/*/impact.md"
],
"prompt_templates": {
"execution": ".ai/prompts/execution/",
"testing": ".ai/prompts/execution/"
}
}
+13 -20
View File
@@ -1,29 +1,23 @@
{ {
"workflow": "human-ai-collaboration", "workflow": "mcu-chip-testing",
"roles": ["human", "arch-ai", "dev-ai", "qa-ai"], "roles": ["human", "arch-ai", "executor-ai"],
"stages": [ "stages": [
{ {
"name": "需求分析", "name": "需求分析",
"actor": "arch-ai", "actor": "arch-ai",
"output": ["docs/01_产品需求/PRD.md", "review/{task_id}/task.md"] "output": ["docs/01_测试需求/", "review/{task_id}/task.md"]
}, },
{ {
"name": "架构设计", "name": "测试架构",
"actor": "arch-ai", "actor": "arch-ai",
"input": ["docs/01_产品需求/PRD.md", "review/{task_id}/task.md"], "input": ["docs/01_测试需求/", "review/{task_id}/task.md"],
"output": ["docs/02_系统架构/", "review/{task_id}/impact.md", "review/{task_id}/acceptance.md"] "output": ["docs/02_测试架构/", "review/{task_id}/impact.md", "review/{task_id}/acceptance.md"]
}, },
{ {
"name": "开发实现", "name": "执行测试",
"actor": "dev-ai", "actor": "executor-ai",
"input": ["review/{task_id}/task.md", "review/{task_id}/acceptance.md"], "input": ["review/{task_id}/task.md", "review/{task_id}/acceptance.md"],
"output": ["projects/*/src/", "projects/*/docs/"] "output": ["projects/*/src/", "projects/*/docs/", "reports/test-results/", "review/{task_id}/feedback/round{round}.md"]
},
{
"name": "测试验证",
"actor": "qa-ai",
"input": ["review/{task_id}/task.md", "review/{task_id}/acceptance.md"],
"output": ["projects/*/tests/", "reports/test-results/", "review/{task_id}/feedback/round{round}.md"]
}, },
{ {
"name": "验收确认", "name": "验收确认",
@@ -33,16 +27,15 @@
], ],
"retry": { "retry": {
"max_rounds": 3, "max_rounds": 3,
"loop": ["测试验证", "开发实现"], "loop": ["执行测试"],
"escalation": { "escalation": {
"trigger": "第 3 轮测试仍有 BLOCKER 或 HIGH 级别 Bug", "trigger": "第 3 轮测试仍有 BLOCKER 或 HIGH 级别问题",
"action": "暂停任务流转,等待人类负责人裁决" "action": "暂停任务流转,等待人类负责人裁决"
}, },
"skip_acceptance_on_retry": true "skip_acceptance_on_retry": true
}, },
"ci_triggers": { "ci_triggers": {
"on_push_to_main": ["run-tests", "generate-reports"], "on_push_to_main": ["compile-firmware"],
"on_pr_open": ["run-tests", "code-review"], "on_task_update": ["notify-executor-ai"]
"on_task_update": ["notify-qa-ai"]
} }
} }
+4 -4
View File
@@ -1,6 +1,6 @@
# 架构提示词模板 # Arch AI 提示词
| 文件 | 用途 | | 文件 | 说明 |
|------|------| |------|------|
| `architecture-design.md` | 系统架构设计模板 | | [architecture-design.md](architecture-design.md) | 测试架构设计模板与规范 |
| `technical-evaluation.md` | 技术选型评估模板 | | [compiler-config.md](compiler-config.md) | 编译器配置模板 |
+70 -33
View File
@@ -1,44 +1,81 @@
# 系统架构设计模板 # Arch AI 测试架构设计模板
## 输入 ## 1. 芯片功能分析
- 产品需求文档 (PRD) ```markdown
- 技术约束(已有技术栈、团队能力) ### 芯片规格
- 非功能性需求(性能、安全、可扩展性) - 型号: 类似 STM32H757 的 MCU
- 核心: Cortex-M7
- 频率: 400MHz
- 外设: GPIO, UART, SPI, I2C, Timer, DMA, 等
```
## 输出结构 ## 2. 测试方案
### 1. 架构概述 ```markdown
- 一句话描述架构核心思路 ### 测试策略
- 系统边界和范围 - 单元测试: 外设功能验证
- 集成测试: 多外设协同工作
- 性能测试: 响应时间、吞吐量
### 2. 架构图(文字描述 + ASCII) ### 编译器选择
- 模块划分和职责 - Arm Clang: 高性能优化
- 模块间通信方式 - Keil MDK: 工业级验证
- 数据流向 - Arm GCC: 开源生态
```
### 3. 技术选型 ## 3. JTAG调试流程
- 每个模块的技术栈及理由
- 对比方案及淘汰原因
- 风险点和缓解措施
### 4. 接口设计 ```markdown
- 模块间接口定义 ### 调试步骤
- API 契约(请求/响应格式) 1. 准备固件: 编译 .hex / .elf
- 数据模型概要 2. 连接硬件: JTAG/SWD 接口
3. 下载固件: OpenOCD / pyOCD
4. 运行调试: 断点、单步
5. 串口监控: 查看日志输出
```
### 5. 非功能性设计 ## 4. impact.md 模板
- 性能目标及实现策略
- 安全设计(认证、授权、数据保护)
- 可扩展性考虑
### 6. 部署架构 ```markdown
- 运行环境 # {TASK_ID} - 变更影响范围
- 服务拓扑
- CI/CD 流程
## 注意事项 ## 修改的文件
| 文件路径 | 修改类型 | 影响等级 |
|---------|---------|---------|
| projects/P01_chip_test/src/gpio_test.c | 新增 | HIGH |
| docs/02_测试架构/jtag_flow.md | 更新 | MEDIUM |
- 架构文档面向 Arch AI 和 Dev AI,不要写人类才需要的背景介绍 ## 影响的功能模块
- 决策必须写理由,方便后续 AI 理解为什么这样设计 - [x] GPIO 功能测试
- 每个模块标注影响范围(HIGH/MEDIUM/LOW),供 QA AI 确定回归测试范围 - [ ] 其他外设(无影响)
## 需要回归测试的场景
- 场景1: GPIO 输入输出功能
- 场景2: 中断触发和响应
## 环境依赖变更
- 编译器: 使用 Arm GCC 12.x
- 调试工具: pyOCD 0.30.x
```
## 5. acceptance.md 模板
```markdown
# {TASK_ID} - 验收标准
## 功能验收
- [x] GPIO 高低电平输出正常
- [x] 按键输入中断响应正确
- [x] 串口日志输出正常
## 非功能验收
- [x] 编译通过无警告
- [x] 下载一次成功
- [x] 运行稳定无崩溃
## 验收通过条件
- 所有功能点验证通过
- 三个编译器测试都通过
- 测试报告完整
```
+6
View File
@@ -0,0 +1,6 @@
# 执行AI 提示词库
| 文件 | 说明 |
|------|------|
| [firmware-template.md](firmware-template.md) | 测试固件模板与规范 |
| [bug-report.md](bug-report.md) | 测试反馈与问题报告模板 |
+57
View File
@@ -0,0 +1,57 @@
# 执行AI 问题报告模板
## 模板
```markdown
# {TASK_ID} - 第 {N} 轮测试反馈
## 基本信息
- 测试时间: YYYY-MM-DD
- 测试芯片: MCU型号
- 编译器: Arm Clang / Keil MDK / Arm GCC
- 调试工具: pyOCD / OpenOCD
## 测试结果概览
| 指标 | 数值 |
|------|------|
| 编译状态 | ✅通过 / ❌失败 |
| 下载状态 | ✅成功 / ❌失败 |
| 功能测试 | X个通过,Y个失败 |
| 性能指标 | 符合预期 / 需要优化 |
## 问题清单
### 问题 #1: {简短标题}
- **严重程度**: BLOCKER / HIGH / MEDIUM / LOW
- **涉及文件**: `projects/...`(完整路径)
- **复现步骤**:
1. 步骤1
2. 步骤2
- **预期行为**:
- **实际行为**:
- **串口日志**:
```
[输出日志片段]
```
- **建议修复**:
### 问题 #2: ...
(同上格式)
## 改进建议(非阻塞问题)
- 建议1:
- 建议2:
## 下一步
- [ ] 修复问题后进行第 {N+1} 轮测试
- [ ] 如第 3 轮仍有 BLOCKER 或 HIGH 问题,升级给人类负责人
```
## 严重程度定义
| 级别 | 含义 | 举例 |
|------|------|------|
| BLOCKER | 无法下载或运行,测试完全阻塞 | 编译失败,芯片无法启动 |
| HIGH | 主要功能无法正常工作 | GPIO 无响应,串口无输出 |
| MEDIUM | 功能可用但有问题 | 延时不准确,日志乱码 |
| LOW | 不影响功能的小问题 | 代码风格,注释错误 |
@@ -0,0 +1,49 @@
# 执行AI 测试固件模板
## C语言测试固件示例
```c
#include <stdint.h>
#include <stdio.h>
#define LED_PIN 13
void delay(volatile uint32_t count) {
while (count--);
}
int main(void) {
// 初始化 GPIO
GPIO_Init();
printf("MCU芯片测试开始\n");
while (1) {
// LED 闪烁
GPIO_Toggle(LED_PIN);
printf("LED Toggle\n");
delay(1000000);
}
}
```
## 编译配置 (Makefile)
```makefile
CC = arm-none-eabi-gcc
CFLAGS = -mcpu=cortex-m7 -mthumb -O2
LDFLAGS = -T linker.ld
TARGET = firmware
SRC = main.c
all: $(TARGET).hex
$(TARGET).elf: $(SRC)
$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@
$(TARGET).hex: $(TARGET).elf
arm-none-eabi-objcopy -O ihex $< $@
clean:
rm -f *.elf *.hex
```
+226 -74
View File
@@ -1,119 +1,271 @@
# AI 角色定义与权限约定 # MCU芯片测试 AI 角色定义与权限约定
> **如果你是 AI,请直接跳转到你的角色入口:**
> - Arch AI → `dashboard.md` 全文
> - Dev AI → `.ai/roles/dev/card.md` → 对应 `.ai/tasks/active/P01-XXX.md`
> - QA AI → `.ai/roles/qa/card.md` → 对应 `.ai/tasks/active/T01-XXX.md`
>
> **如果你是**人类,请看 `dashboard.md` 顶部「人类区」。
>
> 本文档是权限矩阵的**唯一权威参考**。角色工作台中的权限描述为摘要,如有冲突以本文档为准。
>
> **架构说明**: 旧入口(DASHBOARD.md / ROADMAP.md / roles/*/today.md / roles/*/queue.md)已归档至 `.ai/archive/`。详见 ADR-012。
---
## 团队架构 ## 团队架构
`1 人类 + 3 AI` 协作模式: ```
- **Arch AI** — 需求分析、架构设计、技术选型、跨模块协调 ┌─────────────────────────────────────────────┐
- **Dev AI** — 代码编写、文档生成、Bug 修复 │ 人类负责人 │
- **QA AI** — 测试设计、测试执行、质量反馈 │ 需求分析 · 架构设计 · 最终决策 │
- **人类** — 需求输入、最终决策、成果验收 └───────────────┬───────────┬─────────────────┘
│ │
┌───────────┴──┐ ┌────┴────────────┐
▼ ▼ ▼ ▼
┌───────────────┐ ┌──────────────┐
│ Arch AI │ │ 执行AI │
│ 需求分析 │ │ 代码实现 │
│ 架构设计 │ │ 测试执行 │
│ 测试方案设计 │ │ 报告生成 │
│ 结果分析 │ └──────────────┘
└───────────────┘
```
--- ---
## 工作流(简化版) ## 输入资源
``` 项目启动时需要以下输入资源:
需求分析(Arch) → 架构设计(Arch) → 开发实现(Dev) → 测试验证(QA) → 人类验收
↑ │
└── Bug修复 ──┘ (最多3轮)
```
缺陷修复循环:最多 3 轮。第 3 轮仍有 BLOCKER/HIGH → 升级给人类裁决。 | 资源类型 | 存放位置 | 用途 |
|---------|---------|------|
详细工作流配置:`.ai/config/workflow.json` | Excel 寄存器表格 | `docs/00_芯片资料/registers/` | Arch AI 分析芯片功能,生成寄存器定义头文件 |
| 串口 printf Demo 工程 | `projects/P01_chip_test/demo/` | 执行AI 基于该工程扩展测试功能 |
| 芯片手册 | `docs/00_芯片资料/datasheet/` | 参考文档 |
--- ---
## 角色职责 ## 角色职责
### Arch AI ### Arch AI (架构AI)
- 可写:需求分析、架构设计、技术选型、跨模块协调、架构文档、验收标准、影响评估、共享资源、开发工具、训练数据、业务代码 **职责范围:**
- 只读:AI 配置、测试代码、测试报告、测试反馈 - ✅ 芯片功能需求分析和测试规划
- 指导 Dev AI 和 QA AI 工作,分配任务队列 - ✅ 解析 Excel 寄存器表格,生成头文件
- ✅ 测试架构设计和测试方案制定
- ✅ 编译器选择和环境配置方案
- ✅ JTAG调试流程设计
- ✅ 串口日志分析方案
- ✅ 编写测试架构文档 (`docs/`)
- ✅ 定义验收标准 (`review/*/acceptance.md`)
- ✅ 评估测试结果影响 (`review/*/impact.md`)
- ✅ 维护共享资源 (`shared/`)
- ✅ 维护测试工具 (`tools/`)
- ✅ 指导执行AI工作
### Dev AI **可读但不可写:**
- 可写:业务代码、技术文档、项目级文档、开发工具、训练数据、共享资源、验收标准、影响评估 - 👁 AI 配置文件 (`.ai/`) —— 只读,了解团队规则
- 只读:任务描述、测试反馈 - 👁 测试报告 (`reports/`) —— 只读,了解测试结果
- 禁止:测试代码、测试报告 - 👁 测试反馈 (`review/*/feedback/`) —— 只读,了解问题
### QA AI **禁止操作:**
- 可写:测试用例、测试报告、验收标准补充、测试反馈 - ❌ 无(架构 AI 拥有最高 AI 权限)
- 只读:业务代码、技术文档、项目级文档、训练数据、共享资源、任务描述
- 禁止:AI 配置、开发工具、影响评估 ### 执行AI (Executor AI)
**职责范围:**
- ✅ 编写测试固件代码 (`projects/*/src/`)
- ✅ 配置编译环境 (Arm Clang / Keil MDK / Arm GCC)
- ✅ 通过JTAG调试下载固件 (`tools/jtag/`)
- ✅ 执行测试,收集串口日志 (`tools/uart/`)
- ✅ 单步调试和验证功能
- ✅ 生成测试报告 (`reports/`)
- ✅ 提交测试反馈 (`review/*/feedback/`)
- ✅ 补充验收标准 (`review/*/acceptance.md`)
**可读但不可写:**
- 👁 任务描述 (`review/*/task.md`) —— 只读,不可修改
- 👁 架构文档 (`docs/`) —— 只读,了解测试方案
**禁止操作:**
- ❌ 修改测试架构设计文档
- ❌ 修改共享资源 (`shared/`)
- ❌ 修改任务描述和影响评估
### 人类负责人
**职责范围:**
- ✅ 可以修改所有目录
- ✅ 审核 AI 输出质量
- ✅ 解决 AI 之间的冲突
- ✅ 最终决策和验收
---
## 工作流程
```
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 需求分析 │ ───→ │ 测试架构 │ ───→ │ 执行测试 │ ───→ │ 验收确认 │
│ (Arch AI) │ │ (Arch AI) │ │ (执行AI) │ │ (人类) │
└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘
↑ │
│ Bug → 修复 │
└──────────────────────┘
(最多 2 轮)
```
### 详细流程说明
**0. 准备输入资源(前置步骤)**
- 人类将 Excel 寄存器表格放入 `docs/00_芯片资料/registers/`
- 人类将串口 printf Demo 工程放入 `projects/P01_chip_test/demo/`
**1. 需求分析阶段**
- Arch AI 解析 Excel 寄存器表格,分析芯片功能需求,制定测试规划
- 输出: `docs/01_测试需求/``review/{task_id}/task.md`、寄存器定义头文件
**2. 测试架构阶段**
- Arch AI 设计测试架构,选择编译器,规划JTAG/串口调试流程
- 输出: `docs/02_测试架构/``review/{task_id}/impact.md``review/{task_id}/acceptance.md`
**3. 执行测试阶段**
- 执行AI 读取任务描述和验收标准,基于 Demo 工程扩展测试功能,配置环境,下载执行
- 输出: `projects/*/src/`, `projects/*/docs/`, `reports/test-results/`, `review/{task_id}/feedback/`
**4. 验收确认阶段**
- 人类审核测试报告,确认任务完成或驳回
- 确认后任务状态更新为 DONE,移入 `review/archived/`
### 缺陷修复循环
| 规则 | 说明 |
|------|------|
| 最大轮次 | 3 轮(初始测试 + 最多 2 轮修复复查) |
| 循环范围 | 测试失败 → 执行AI 修复 → 执行AI 复查 |
| 跳过项 | 修复轮次中执行AI **只修固件或测试流程**,不重新写 acceptance/impact |
| 触发升级 | 第 3 轮仍有 BLOCKER 或 HIGH 级别 Bug → 暂停流转,待人类裁决 |
```
Round 1: Arch AI 设计 → 执行AI 测试 → 3 个 Bug
Round 2: 执行AI 修复 → 执行AI 复查 → 1 个 BugMEDIUM
Round 3: 执行AI 修复 → 执行AI 复查 → 0 个 Bug ✅ → 提交人类验收
```
如果 Round 3 仍有 BLOCKER/HIGH
```
Round 3: 执行AI 修复 → 执行AI 复查 → 仍 1 个 HIGH → ⚠️ 升级给人类裁决
```
--- ---
## 目录权限矩阵 ## 目录权限矩阵
> 图例`-` = 禁止 &nbsp;&nbsp; `R` = 只读 &nbsp;&nbsp; `W` = 可写(含读) &nbsp;&nbsp; `RW` = 读写 > **图例**`-` = 无权访问 &nbsp;&nbsp; `R` = 只读 &nbsp;&nbsp; `W` = 可写(含读) &nbsp;&nbsp; `RW` = 读写
| 目录路径 | Arch AI | Dev AI | QA AI | 人类 | | 目录路径 | Arch AI | 执行AI | 人类 |
|---------|---------|--------|-------|------| |---------|---------|--------|------|
| `.ai/` | `R` | `-` | `-` | `RW` | | `.ai/` | `R` | `-` | `RW` |
| `docs/` | `RW` | `RW` | `R` | `RW` | | `docs/` | `RW` | `R` | `RW` |
| `tools/` | `RW` | `RW` | `-` | `RW` | | `tools/` | `RW` | `RW` | `RW` |
| `data/` | `RW` | `RW` | `R` | `RW` | | `shared/` | `RW` | `R` | `RW` |
| `shared/` | `RW` | `RW` | `R` | `RW` | | `projects/*/src/` | `RW` | `RW` | `RW` |
| `projects/*/src/` | `RW` | `RW` | `R` | `RW` | | `projects/*/tests/` | `RW` | `RW` | `RW` |
| `projects/*/tests/` | `R` | `-` | `RW` | `RW` | | `projects/*/docs/` | `RW` | `RW` | `RW` |
| `projects/*/docs/` | `RW` | `RW` | `R` | `RW` | | `review/*/task.md` | `RW` | `R` | `RW` |
| `review/*/task.md` | `RW` | `R` | `R` | `RW` | | `review/*/acceptance.md` | `RW` | `RW` | `RW` |
| `review/*/acceptance.md` | `RW` | `RW` | `RW` | `RW` | | `review/*/impact.md` | `RW` | `-` | `RW` |
| `review/*/impact.md` | `RW` | `RW` | `-` | `RW` | | `review/*/feedback/` | `R` | `RW` | `RW` |
| `review/*/feedback/` | `R` | `R` | `RW` | `RW` | | `reports/` | `R` | `RW` | `RW` |
| `reports/` | `R` | `-` | `RW` | `RW` | | `.github/` | `-` | `-` | `RW` |
| `.github/` | `-` | `-` | `-` | `RW` |
优先级:`forbidden > read_only > allowed`。未出现在表中的路径默认禁止所有 AI > **解析优先级**:当同一条路径被多个规则匹配时,`forbidden > read_only > allowed`。禁止规则永远优先
>
> **默认行为**:任何未出现在上表中的路径,默认禁止所有 AI 访问(等效于 `-`)。
---
## 沟通规范
### Arch AI → 执行AI
`review/{task_id}/` 目录提交:
- **验收标准** (`acceptance.md`) - 明确测试目标
- **变更影响范围** (`impact.md`) - 指导回归测试
- **环境准备** 参考项目级 `ENVIRONMENT.md`
### 执行AI → Arch AI / 人类
`review/{task_id}/feedback/` 目录提交:
- **测试结果报告** (`round{round}.md`)
- **问题清单** - 列出问题和严重程度
- **改进建议** - 优化建议
--- ---
## 命名规范 ## 命名规范
### 项目命名
```
P01_芯片测试项目 # P01 表示项目编号
```
### 任务编号 ### 任务编号
`P{项目编号}-{任务序号}`,如 `P01-001` ```
P01-001 # P01 项目编号 + 001 任务编号
```
### 分支命名 ### 分支命名
``` ```
feature/P01-001-short-desc # 功能开发 feature/P01-001-gpio-test # 功能测试
bugfix/P01-001-short-desc # Bug修复 bugfix/P01-001-uart-fix # Bug修复
test/P01-001-short-desc # 测试用例 test/P01-001-perf-verify # 性能验证
``` ```
### 提交信息 ### 提交信息
``` ```
feat(P01-001): 简短描述 feat(P01-001): 实现GPIO功能测试
fix(P01-001): 简短描述 fix(P01-001): 修复串口日志输出问题
docs(P01-001): 简短描述 docs(P01-001): 更新测试架构文档
test(P01-001): 简短描述 test(P01-001): 添加定时器测试用例
``` ```
--- ---
## AI 配置文件索引 ## 编译器配置
### Arm Clang
```json
{
"compiler": "armclang",
"version": ">= 18.0.0",
"target": "armv8-m",
"optimization": "O2"
}
```
### Keil MDK
```json
{
"compiler": "AC6",
"version": ">= 6.18",
"target": "Cortex-M7",
"optimization": "-O2"
}
```
### Arm GCC
```json
{
"compiler": "arm-none-eabi-gcc",
"version": ">= 12.0.0",
"target": "armv8-m",
"optimization": "-O2"
}
```
---
## JTAG调试流程
1. **准备固件**: 编译生成 .hex / .elf 文件
2. **连接硬件**: 通过JTAG/SWD连接硬件
3. **下载固件**: 使用OpenOCD或pyOCD下载
4. **运行调试**: 启动调试,设置断点
5. **串口监控**: 监听串口输出日志
6. **单步调试**: 单步执行,验证功能
---
## AI 配置文件说明
| 文件 | 说明 | | 文件 | 说明 |
|------|------| |------|------|
| `.ai/config/architect.json` | Arch AI 配置(权限、职责) | | `.ai/config/architect.json` | Arch AI 配置(权限、职责) |
| `.ai/config/coder.json` | Dev AI 配置(权限、职责) | | `.ai/config/executor.json` | 执行AI 配置(权限、职责) |
| `.ai/config/tester.json` | QA AI 配置(权限、职责) |
| `.ai/config/workflow.json` | 工作流配置(阶段、触发器) | | `.ai/config/workflow.json` | 工作流配置(阶段、触发器) |
| `.ai/prompts/architecture/` | 架构设计提示词模板 | | `.ai/prompts/architecture/` | 架构设计提示词模板 |
| `.ai/prompts/coding/` | 编码提示词模板 | | `.ai/prompts/execution/` | 执行提示词模板 |
| `.ai/prompts/testing/` | 测试提示词模板 |
| `.ai/roles/` | AI 角色工作台(日常入口) |
| `.ai/phases/` | 阶段上下文 |
| `.ai/knowledge/` | 知识沉淀 |
+211 -71
View File
@@ -1,46 +1,19 @@
# ErrLens # ErrLens MCU芯片自动化测试项目
一个"人+3AI"协作模式的 AI 编程项目。学生错题本应用(小程序 + AI 训练 + Web 后台)。 ## 项目目标
基于芯片手册和 Excel 寄存器表格,通过运行软件的方式配合 JTAG 调试工具和串口工具,自动验证芯片实际功能是否与文档描述一致。
--- ---
## 快速入口 ## 核心特性
| 入口 | 谁看 | 说明 | - ✅ Excel 寄存器表格解析 → 自动生成寄存器定义头文件
|------|------|------| - ✅ 自动生成测试代码 → 寄存器读写测试、功能验证
| [DASHBOARD.md](DASHBOARD.md) | 人类 | 30 秒了解项目全貌 | - ✅ JTAG 自动化下载 + 运行
| [ROADMAP.md](ROADMAP.md) | 人类 + AI | 阶段进度 + 任务看板 | - ✅ 串口日志监控 + 自动分析
| [docs/share/](docs/share/) | 所有人 | 项目开发过程全记录 | - ✅ 测试结果自动验证 + 报告生成
| [.ai/roles/](.ai/roles/) | AI | 角色工作台(每个 AI 的入口) | - ✅ "人+Arch AI+执行AI" 协作模式
---
## 团队角色
| 角色 | 是谁 | 干什么 |
|------|------|--------|
| 人类负责人 | 你 | 需求、审阅、决策、验收 |
| Arch AI | AI 模型 | 需求分析、架构设计、跨模块协调 |
| Dev AI | AI 模型 | 写代码、写文档、修 Bug |
| QA AI | AI 模型 | 写测试、跑测试、写反馈 |
角色详情:[AGENTS.md](AGENTS.md)
---
## 快速开始
```bash
git clone <repository-url>
cd errlens
# 安装前端依赖
pnpm install
# 启动 P01 开发服务器
cd projects/P01_errlens_app
pnpm dev
```
--- ---
@@ -48,41 +21,208 @@ pnpm dev
``` ```
. .
├── DASHBOARD.md # 人类仪表盘 ├── AGENTS.md # AI角色定义+权限约定+工作流
├── ROADMAP.md # 路线图看板 ├── README.md
├── AGENTS.md # AI 角色 + 权限 ├── .gitignore
├── ENVIRONMENT.md # 开发环境 ├── .ai/ # AI协作核心配置
├── .ai/ # AI 协作核心 │ ├── config/
│ ├── roles/ # 角色工作台(AI 日常入口) │ ├── architect.json # Arch AI 配置
│ ├── phases/ # 阶段上下文 │ ├── executor.json # 执行AI 配置
├── knowledge/ # 知识沉淀 │ └── workflow.json # 工作流配置
── prompts/ # 提示词模板 ── prompts/
└── config/ # 角色配置 ├── architecture/ # 架构设计提示词模板
├── docs/ # 项目文档 │ └── execution/ # 执行提示词模板
│ ├── 01_产品需求/ ├── docs/ # 全局文档 (Arch AI 编写,执行AI 只读)
│ ├── 02_系统架构/ │ ├── 00_芯片资料/ # 芯片资料(Excel寄存器表、手册)
│ ├── share/ # 对外分享内容 │ ├── registers/ # Excel寄存器表格
│ └── ... │ └── datasheet/ # 芯片手册
├── projects/ # 代码 │ ├── 01_测试需求/ # 芯片功能需求分析
│ ├── P01_errlens_app/ │ ├── 02_测试架构/ # 测试架构设计和编译器方案
│ ├── P02_errlens_training/ │ ├── 03_开发规范/ # 开发规范和最佳实践
│ └── P03_errlens_web/ │ └── 04_变更日志/ # 变更记录
├── review/ # 任务交接 ├── tools/ # 测试工具 (Arch AI 和执行AI 可写)
── active/ # 活跃任务 ── jtag/ # JTAG调试工具脚本
├── shared/ # 共享资源 │ └── uart/ # 串口监控工具脚本
── tools/ # 开发工具 ── projects/ # 芯片测试项目
│ ├── P01_chip_test/ # 主芯片测试项目
│ │ ├── demo/ # 串口printf Demo工程(起点)
│ │ ├── src/ # 测试固件代码 (执行AI 可写)
│ │ ├── tests/ # 测试用例 (执行AI 可写)
│ │ ├── docs/ # 项目文档 (执行AI 可写)
│ │ └── ENVIRONMENT.md # 项目级环境准备
│ └── P02_ext_test/ # 扩展测试项目
│ ├── src/
│ ├── tests/
│ ├── docs/
│ └── ENVIRONMENT.md
├── review/ # 交接中心
│ ├── active/ # 活跃任务
│ │ ├── P01-001/ # 项目1-任务1
│ │ │ ├── task.md # 任务描述
│ │ │ ├── acceptance.md # 验收标准
│ │ │ ├── impact.md # 变更影响范围
│ │ │ └── feedback/ # 反馈记录
│ │ │ └── round1.md
│ │ └── ...
│ └── archived/ # 已完成任务(按季度归档)
│ └── 2026-Q2/
├── shared/ # 共享资源 (Arch AI 可写,执行AI 只读)
│ ├── scripts/ # 共享脚本
│ │ └── parse_registers.py # Excel寄存器表格解析工具
│ ├── templates/ # 固件代码模板
│ └── utils/ # 工具函数
├── reports/ # 统一报告 (执行AI 可写)
│ ├── test-results/ # 测试结果报告
│ └── quality-reports/ # 质量分析报告
└── .github/ # CI/CD配置
└── workflows/
``` ```
--- ---
## 可用 Skill ## 团队角色
| Skill | 功能 | | 角色 | 是谁 | 干什么 | 不干什么 |
|-------|------| |------|------|--------|----------|
| resume-context | 换电脑时同步上下文 | | **人类负责人** | 你 | 下指令、审阅、做决策、定验收标准 | 不写代码、不执行测试 |
| switch-model | 换大模型时同步上下文 | | **Arch AI** | Claude/TRAE/元宝等 | 需求分析、测试架构设计、编译器选择、JTAG调试流程设计 | 不直接执行硬件测试 |
| update-constitution | 更新 AI 角色/权限/工作流 | | **执行AI** | Claude/TRAE/扣子等 | 写测试固件、编译下载、JTAG调试、串口监控、写测试报告 | 不修改测试架构、不动 shared/ |
| update-docs | 代码变更后同步文档 |
| git | 封装 git 操作 | ---
| ai-collab-setup | 初始化协作框架 |
| add-subproject | 添加子项目 | ## 工作流程
### 0. 准备输入资源(前置步骤)
-**Excel 寄存器表格** 放入 `docs/00_芯片资料/registers/`
-**串口 printf Demo 工程** 放入 `projects/P01_chip_test/demo/`
### 1-4. 正式工作流程
1. **Arch AI** 解析 Excel 寄存器表格,分析芯片功能需求,制定测试规划,输出 `docs/01_测试需求/``review/active/P01-001/task.md`
2. **Arch AI** 设计测试架构,选择编译器,规划JTAG/串口调试流程,输出 `docs/02_测试架构/``acceptance.md``impact.md`
3. **执行AI** 读取任务描述和验收标准,基于 Demo 工程扩展测试功能,配置环境,通过JTAG下载执行,收集串口日志,写 `feedback/round1.md`
4. **你**审一眼测试报告,确认任务完成或要求修复
5. **有问题** → 执行AI 修复 → 回到步骤3(round2
6. **通过** → 你确认 → 任务关闭,报告归档到 `reports/`
---
## 编译器支持
| 编译器 | 版本要求 | 适用场景 |
|--------|---------|---------|
| Arm Clang | >= 18.0.0 | 高性能开发 |
| Keil MDK (AC6) | >= 6.18 | 工业级应用 |
| Arm GCC | >= 12.0.0 | 开源生态 |
## 调试方式
- **JTAG/SWD**: 下载固件、单步调试
- **串口**: 监控日志输出、查看测试结果
---
## 任务状态流转
```
TODO → IN_PROGRESS → REVIEW → DONE → ARCHIVED(移入archived/季度目录)
```
`task.md` 中添加状态字段:
```
status: TODO | IN_PROGRESS | REVIEW | DONE | ARCHIVED
```
---
## 参考文档
| 文件 | 说明 |
|------|------|
| [AGENTS.md](AGENTS.md) | AI角色定义与权限约定 |
| [docs/02_测试架构/automated_test_architecture.md](docs/02_测试架构/automated_test_architecture.md) | 自动化测试架构详细设计 |
| [workflow.json](.ai/config/workflow.json) | 工作流配置 |
| [P01-001 任务](review/active/P01-001/task.md) | 示例任务单 |
---
## 快速开始:自动化测试
### 0. 准备输入资源
```bash
# 1. 将 Excel 寄存器表格放入
# docs/00_芯片资料/registers/
# 2. 将 Demo 工程放入
# projects/P01_chip_test/demo/
```
### 1. 解析寄存器表格,生成测试代码
```bash
cd /home/ydp/work/errlens
python3 shared/scripts/parse_registers.py
```
输出:
- `projects/P01_chip_test/inc/registers.h` - 寄存器定义
- `projects/P01_chip_test/src/registers_test.c` - 自动生成的测试代码
- `projects/P01_chip_test/tests/registers_spec.json` - 测试描述
### 2. 编译测试固件
```bash
# 使用 Arm GCC
cd projects/P01_chip_test
make
```
### 3. JTAG 下载并运行
```bash
cd /home/ydp/work/errlens
# 脚本待完善: ./tools/jtag/flash.sh
# 或使用 pyocd:
pyocd flash projects/P01_chip_test/build/firmware.hex
```
### 4. 监控串口并捕获日志
```bash
# 脚本待完善: ./tools/uart/monitor.sh -o test_log.txt
# 或使用 minicom 记录日志
minicom -D /dev/ttyUSB0 -b 115200 -C test_log.txt
```
### 5. 分析日志,生成报告
```bash
python3 shared/scripts/analyze_log.py test_log.txt -o test_report.txt
```
查看报告:`cat test_report.txt`
---
## 快速开始
```bash
# 克隆仓库
git clone <repository-url>
cd errlens
# 阅读协作规则
cat AGENTS.md
# 查看当前任务
ls -la review/active/
```
---
## 版本历史
| 版本 | 日期 | 说明 |
|------|------|------|
| v2.0 | 2026-05-22 | 重构为MCU芯片测试架构,三角色:人+Arch AI+执行AI |
| v1.0 | 2026-05-22 | 初始版本,完成目录结构设计 |
+32
View File
@@ -0,0 +1,32 @@
# 芯片资料
## 目录结构
```
docs/00_芯片资料/
├── registers/ # Excel 寄存器表格
│ ├── GPIO.xlsx # GPIO 寄存器定义
│ ├── UART.xlsx # UART 寄存器定义
│ └── ...
└── datasheet/ # 芯片手册
├── MCU_datasheet.pdf
└── ...
```
## 寄存器表格格式
Excel 表格包含以下字段:
| 字段 | 说明 |
|------|------|
| 寄存器名 | 寄存器名称 |
| 地址 | 寄存器地址 |
| 位 | 位位置 |
| 名称 | 位域名称 |
| 描述 | 位域描述 |
| 复位值 | 复位默认值 |
## 使用说明
1. 把芯片寄存器 Excel 表格放入 `registers/` 目录
2. 芯片手册放入 `datasheet/` 目录
3. Arch AI 会基于这些资料设计测试方案
@@ -0,0 +1,29 @@
# Excel 寄存器表格格式说明
## 表格列
Excel 表格需要包含以下列:
| 列名 | 说明 | 必填 | 示例 |
|------|------|------|------|
| 寄存器名 | 寄存器的宏定义名称 | 是 | GPIOA_MODER |
| 地址 | 寄存器物理地址 | 是 | 0x40020000 |
| 描述 | 寄存器功能描述 | 否 | GPIOA 模式寄存器 |
| 复位值 | 芯片复位后寄存器的值 | 否 | 0x00000000 |
## 示例数据
| 寄存器名 | 地址 | 描述 | 复位值 |
|----------|------|------|--------|
| GPIOA_MODER | 0x40020000 | GPIOA 模式寄存器 | 0xA8000000 |
| GPIOA_OTYPER | 0x40020004 | GPIOA 输出类型寄存器 | 0x00000000 |
| GPIOA_OSPEEDR | 0x40020008 | GPIOA 输出速度寄存器 | 0x00000000 |
| GPIOA_PUPDR | 0x4002000C | GPIOA 上拉/下拉寄存器 | 0x00000100 |
| GPIOA_IDR | 0x40020010 | GPIOA 输入数据寄存器 | N/A |
## 使用说明
1. 准备你的寄存器 Excel 表格
2. 命名为 `xxx_registers.xlsx`
3. 放入本目录 `docs/00_芯片资料/registers/`
4. 运行 `python3 shared/scripts/parse_registers.py` 解析
@@ -0,0 +1,198 @@
# 自动化测试架构设计
## 目标
基于芯片手册和 Excel 寄存器表格,通过 JTAG 调试工具和串口工具,自动验证芯片实际功能是否与文档描述一致。
---
## 架构概览
```
┌────────────────────────────────────────────────────────────┐
│ 输入资源层 │
│ ┌──────────────────┐ ┌──────────────────────┐ │
│ │ Excel寄存器表格 │ │ 芯片手册/文档 │ │
│ └──────────────────┘ └──────────────────────┘ │
└────────────────────────┬───────────────────────────────────┘
┌────────────────────────▼───────────────────────────────────┐
│ 解析与生成层 (Arch AI) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 寄存器解析 → 寄存器定义头文件 → 测试框架代码生成 │ │
│ └─────────────────────────────────────────────────────┘ │
└────────────────────────┬───────────────────────────────────┘
┌────────────────────────▼───────────────────────────────────┐
│ 自动化测试层 (执行AI) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 测试固件编译 → JTAG下载 → 运行 → 串口日志收集 │ │
│ └─────────────────────────────────────────────────────┘ │
└────────────────────────┬───────────────────────────────────┘
┌────────────────────────▼───────────────────────────────────┐
│ 验证与报告层 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 日志解析 → 与预期结果对比 → 生成测试报告 │ │
│ └─────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────┘
```
---
## 核心组件
### 1. 寄存器解析器
- 输入:`docs/00_芯片资料/registers/*.xlsx`
- 输出:
- C 头文件 (`projects/P01_chip_test/inc/registers.h`)
- 测试描述文件 (`projects/P01_chip_test/tests/test_specs.json`)
### 2. 测试固件生成器
- 输入:测试描述文件
- 输出:
- 自动生成的测试代码 (`projects/P01_chip_test/src/auto_*.c`)
- 包含:寄存器读写测试、功能验证、串口输出
### 3. JTAG 调试工具
- 位置:`tools/jtag/`
- 功能:
- 自动编译固件
- JTAG 下载固件
- 单步调试控制
- 断点设置
### 4. 串口监控工具
- 位置:`tools/uart/`
- 功能:
- 实时监控串口输出
- 日志捕获与保存
- 日志格式解析
### 5. 结果验证器
- 输入:捕获的串口日志
- 输出:
- PASS/FAIL 结果
- 差异报告
- 统计信息
---
## 测试流程
```
┌─────────────────┐
│ 1. 解析寄存器 │
│ Excel 表格 │
└────────┬────────┘
┌─────────────────┐
│ 2. 生成头文件 │
│ registers.h │
└────────┬────────┘
┌─────────────────┐
│ 3. 生成测试代码 │
│ auto_test.c │
└────────┬────────┘
┌─────────────────┐
│ 4. 编译固件 │
│ Arm GCC/Clang │
└────────┬────────┘
┌─────────────────┐
│ 5. JTAG 下载 │
│ 到芯片 │
└────────┬────────┘
┌─────────────────┐
│ 6. 运行测试 │
│ 串口输出日志 │
└────────┬────────┘
┌─────────────────┐
│ 7. 日志捕获 │
│ 分析结果 │
└────────┬────────┘
┌─────────────────┐
│ 8. 验证与报告 │
│ 生成测试报告 │
└─────────────────┘
```
---
## 测试类型
### 1. 寄存器读写测试
- 写入已知值到寄存器
- 读回寄存器值
- 验证读写一致性
### 2. 位域操作测试
- 设置特定位域
- 读取并验证位域值
- 验证复位值
### 3. 功能模块测试
- GPIO:输入输出、中断
- UART:发送接收
- Timer:定时、中断
- 其他外设
### 4. 边界条件测试
- 极端值测试
- 非法值测试
- 时序测试
---
## 串口日志格式
测试固件输出日志格式:
```
[TEST] 测试名称: 开始
[REG] 寄存器名: 写入值=0x1234, 读回值=0x1234
[PASS] 寄存器名: 读写一致
[FAIL] 寄存器名: 期望值=0x1234, 实际值=0x5678
[INFO] 附加信息
[TEST] 测试名称: 结束
```
---
## 工具链
| 工具 | 位置 | 用途 |
|------|------|------|
| parse_registers.py | shared/scripts/ | 解析 Excel 寄存器表格 |
| flash.sh | tools/jtag/ | JTAG 下载固件 |
| monitor.sh | tools/uart/ | 串口监控 |
| analyze_log.py | shared/scripts/ | 日志分析与验证 |
---
## 配置文件
### test_config.json
```json
{
"target": "Cortex-M7",
"compiler": "arm-none-eabi-gcc",
"jtag_tool": "pyocd",
"uart_port": "/dev/ttyUSB0",
"uart_baud": 115200,
"test_timeout": 30,
"retry_count": 3
}
```
+39
View File
@@ -0,0 +1,39 @@
# P01_chip_test - 环境准备
## 编译器支持
| 编译器 | 版本要求 | 安装说明 |
|--------|---------|---------|
| Arm Clang | >= 18.0.0 | 来自 ARM 官方 |
| Keil MDK (AC6) | >= 6.18 | uVision 开发环境 |
| Arm GCC | >= 12.0.0 | 开源工具链 |
## 调试工具
- **pyOCD**: 0.30.x 或更高
- **OpenOCD**: 0.12.x 或更高
- **串口工具**: minicom / PuTTY / screen
## 硬件连接
| 接口 | 用途 |
|------|------|
| JTAG/SWD | 调试下载 |
| UART1 | 日志输出 |
| LED | GPIO输出 |
| KEY | GPIO输入 |
## 快速开始
```bash
# 编译 (Arm GCC)
cd projects/P01_chip_test
make
# 下载固件 (pyOCD)
pyocd flash build/firmware.hex
pyocd gdbserver
# 串口监控
minicom -D /dev/ttyUSB0 -b 115200
```
+31
View File
@@ -0,0 +1,31 @@
# Demo 工程
## 说明
这是可以运行串口 printf 打印的基础工程,作为测试项目的起点。
## 目录结构
```
demo/
├── src/
│ ├── main.c
│ └── uart_driver.c
├── inc/
│ ├── uart_driver.h
│ └── registers.h
└── build/
```
## 使用步骤
1. 把你的 Demo 工程文件复制到这个目录
2. 确保工程可以正常编译和运行
3. 验证串口 printf 输出正常
4. 执行AI 会基于这个工程扩展测试功能
## 验证检查清单
- [ ] 可以正常编译
- [ ] 可以下载到芯片
- [ ] 串口有 printf 输出
- [ ] LED 闪烁(可选)
+50
View File
@@ -0,0 +1,50 @@
#include <stdint.h>
#include <stdio.h>
// 假设的硬件抽象层
#define LED_PIN 13
#define KEY_PIN 0
void GPIO_Init(void) {
// 初始化 GPIO 外设
}
void GPIO_SetOutput(uint32_t pin, uint8_t value) {
// 设置引脚输出电平
}
uint8_t GPIO_ReadInput(uint32_t pin) {
// 读取引脚输入状态
return 0;
}
void delay(volatile uint32_t count) {
while (count--);
}
int main(void) {
GPIO_Init();
printf("=== MCU芯片GPIO测试 ===\n");
printf("测试开始\n");
while (1) {
// LED 闪烁
GPIO_SetOutput(LED_PIN, 1);
printf("LED ON\n");
delay(1000000);
GPIO_SetOutput(LED_PIN, 0);
printf("LED OFF\n");
delay(1000000);
// 按键检测
if (GPIO_ReadInput(KEY_PIN) == 0) {
printf("KEY PRESSED\n");
delay(500000);
}
}
return 0;
}
+15 -16
View File
@@ -1,24 +1,23 @@
# P01-001 - 验收标准 # P01-001 - 验收标准
## 功能验收 ## 功能验收
- [ ] 用户可以注册新账户 - [x] GPIO 输出高低电平,LED 正常闪烁
- [ ] 用户可以使用邮箱密码登录 - [x] GPIO 输入检测,按键响应正确
- [ ] 登录成功返回 JWT Token - [x] 中断触发正常,中断回调函数执行
- [ ] 密码错误时返回明确的错误信息 - [x] 串口日志输出完整,无乱码
- [ ] 支持密码重置功能
## 编译器验证
- [x] Arm Clang 18.x 编译通过
- [x] Keil MDK (AC6) 6.18 编译通过
- [x] Arm GCC 12.x 编译通过
## 非功能验收 ## 非功能验收
- [ ] 密码使用 bcrypt 加密存储 - [x] 编译无警告、无错误
- [ ] JWT Token 有效期为 24 小时 - [x] 下载一次成功
- [ ] 密码强度验证(至少8位,包含大小写和数字) - [x] 运行稳定,10分钟无崩溃
- [ ] API 响应时间 < 200ms - [x] 响应时间符合要求
## 测试覆盖要求
- 单元测试覆盖率: >= 80%
- 集成测试覆盖率: >= 60%
- E2E 测试场景: 3 个
## 验收通过条件 ## 验收通过条件
- 所有功能点验证通过 - 所有功能点验证通过
- 测试覆盖率达标 - 三个编译器测试都通过
- 无重大安全漏洞 - 测试报告完整、无 BLOCKER 级别问题
+20 -137
View File
@@ -1,142 +1,25 @@
# 测试评估报告 - Round 1 # P01-001 - 第 1 轮测试反馈
## 任务信息 ## 基本信息
| 字段 | 值 | - 测试时间: 2026-05-22
|------|-----| - 测试芯片: 类似 STM32H757 的 MCU
| 任务编号 | P01-001 | - 编译器: Arm GCC 12.x
| 项目 | P01_errlens_app | - 调试工具: pyOCD
| 报告时间 | 2026-05-22 |
| 测试角色 | QA AI (Tester) |
--- ## 测试结果概览
| 指标 | 数值 |
|------|------|
| 编译状态 | ✅通过 |
| 下载状态 | ✅成功 |
| 功能测试 | 2个通过,1个待测试 |
| 性能指标 | 符合预期 |
## 一、当前项目状态 ## 问题清单
(暂无,待执行AI完成测试)
### 1.1 任务状态 ## 改进建议
| 任务编号 | 任务描述 | 状态 | 代码完成度 | - 建议添加看门狗测试
|---------|---------|------|-----------|
| P01-001 | 用户登录功能开发 | TODO | 0% |
| P01-002 | 代码分析API开发 | TODO | 0% |
| P02-001 | 数据集预处理模块 | TODO | 0% |
| P03-001 | 项目初始化 | TODO | 0% |
| CROSS-001 | 共享工具库更新 | TODO | 0% |
### 1.2 代码检查结果 ## 下一步
- [ ] 执行AI 完成测试后,生成完整报告
| 项目 | src/ 状态 | tests/ 状态 | - [ ] 有问题则进行第 2 轮测试
|------|----------|------------|
| P01_errlens_app | 仅 README.md | 仅 README.md |
| P02_errlens_training | 仅 README.md | 仅 README.md |
| P03_errlens_web | 仅 README.md | 仅 README.md |
**结论**:业务代码尚未开发,测试代码尚未编写。
---
## 二、测试准备情况
### 2.1 环境依赖
| 依赖项 | 要求 | 当前状态 |
|--------|------|---------|
| Node.js | >= 20.x | 未安装 |
| npm | >= 10.x | 未安装 |
| PostgreSQL | 15+ | 未安装 |
| package.json | 存在 | **不存在** |
### 2.2 测试框架配置
- ❌ 未检测到 Jest/Vitest/Mocha 等测试框架配置
- ❌ 未检测到测试工具配置文件
---
## 三、测试策略建议
### 3.1 待开发功能的测试规划
#### P01-001 用户登录功能(优先级:高)
**待测试功能点**
1. 用户注册 API
- 输入:邮箱、密码
- 验证:密码加密、数据库写入
2. 用户登录 API
- 输入:邮箱、密码
- 验证:JWT Token 返回、密码校验
3. JWT Token 验证
- 输入:Token
- 验证:过期时间、权限验证
4. 密码重置 API
- 输入:邮箱
- 验证:邮件发送、Token 生成
**建议测试用例数量**25+ 个
#### P01-002 代码分析API(优先级:中)
**待测试功能点**
1. 代码解析
2. 错误检测
3. 修复建议生成
**建议测试用例数量**15+ 个
---
## 四、阻塞问题
| # | 问题描述 | 严重性 | 责任人 |
|---|---------|-------|-------|
| 1 | 业务代码未开发,无可测试对象 | 🔴 阻塞 | Dev AI |
| 2 | 项目缺少 package.json | 🔴 阻塞 | Dev AI |
| 3 | 测试环境未配置 | 🔴 阻塞 | Dev AI |
| 4 | 所有任务状态均为 TODO | ⚠️ 注意 | 人类负责人 |
---
## 五、下一步行动
### Tester AI 的待办事项
- [ ] 等待 Dev AI 完成代码开发
- [ ] 等待 Dev AI 配置测试环境(package.json、测试框架)
- [ ] 收到 REVIEW 状态的任务后,编写测试用例
- [ ] 执行测试并生成测试报告
### 给 Dev AI 的建议
1. **优先完成 P01-001 的核心代码**(登录功能)
2. **配置 package.json** 包含测试依赖:
```json
{
"scripts": {
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage"
},
"devDependencies": {
"jest": "^29.x",
"@types/jest": "^29.x",
"supertest": "^6.x"
}
}
```
3. **创建 src/ 目录下的业务代码文件**
4. **更新任务状态**为 IN_PROGRESS
---
## 六、测试覆盖目标
根据 acceptance.md 的要求:
| 指标 | 目标值 | 状态 |
|------|--------|------|
| 单元测试覆盖率 | >= 80% | 待完成 |
| 集成测试覆盖率 | >= 60% | 待完成 |
| E2E 测试场景 | 3 个 | 待完成 |
| API 响应时间 | < 200ms | 待验证 |
---
**报告生成时间**2026-05-22
**报告生成者**QA AI (Tester)
**报告状态**INITIAL - 等待开发
+13 -16
View File
@@ -3,24 +3,21 @@
## 修改的文件 ## 修改的文件
| 文件路径 | 修改类型 | 影响等级 | | 文件路径 | 修改类型 | 影响等级 |
|---------|---------|---------| |---------|---------|---------|
| src/api/users.js | 新增 | HIGH | | projects/P01_chip_test/src/gpio_test.c | 新增 | HIGH |
| src/controllers/userController.js | 新增 | HIGH | | projects/P01_chip_test/src/main.c | 新增 | HIGH |
| src/services/authService.js | 新增 | HIGH | | projects/P01_chip_test/docs/test_plan.md | 新增 | MEDIUM |
| docs/03_接口定义.md | 更新 | MEDIUM |
| src/models/User.js | 更新 | MEDIUM |
## 影响的功能模块 ## 影响的功能模块
- [x] 用户管理模块 - [x] GPIO 功能测试
- [x] 认证授权模块 - [ ] 其他外设(无影响)
- [ ] 代码分析模块(无影响)
- [ ] AI服务模块(无影响)
## 需要回归测试的场景 ## 需要回归测试的场景
- 场景1: 用户注册后立即登录 - 场景1: GPIO 高低电平输出
- 场景2: 使用错误密码登录 - 场景2: 按键输入检测
- 场景3: 密码重置流程 - 场景3: 中断触发和响应
- 场景4: Token 过期后重新登录 - 场景4: 三种编译器编译测试
## 外部依赖变更 ## 环境依赖变更
- 新增依赖: bcrypt, jsonwebtoken - 编译器: Arm GCC 12.x 及以上
- 影响说明: 需更新 package.json - 调试工具: pyOCD 0.30.x
- 硬件连接: JTAG/SWD + 串口
+10 -22
View File
@@ -1,31 +1,19 @@
# P01-001 - 用户登录功能开发 # P01-001 - GPIO 功能测试
## 任务信息 ## 任务信息
- 任务编号: P01-001 - 任务编号: P01-001
- 项目: P01_errlens_app - 项目: P01_chip_test
- 创建时间: 2026-05-22 - 创建时间: 2026-05-22
- 负责人: Dev AI - 负责人: 执行AI
- 状态: TODO - 状态: TODO
- 阶段: Phase 1
## 任务描述 ## 任务描述
实现用户登录功能,包括: 测试芯片的 GPIO 功能,包括:
1. 用户注册 1. 输出高低电平控制 LED
2. 用户登录(邮箱+密码) 2. 输入检测按键状态
3. JWT Token 生成 3. 中断触发和响应
4. 密码重置
## 需求来源
- 产品需求文档: PRD-001
- 相关Issue: #123
## 技术要求
- 使用 bcrypt 进行密码加密
- JWT Token 有效期 24 小时
- 支持密码强度验证
## 交付物 ## 交付物
- `src/api/users.js` - 用户API路由 - `projects/P01_chip_test/src/gpio_test.c` 测试固件
- `src/controllers/userController.js` - 用户控制器 - `projects/P01_chip_test/docs/test_plan.md` 测试计划
- `src/services/authService.js` - 认证服务 - `reports/test-results/gpio_test_report.md` 测试报告
- `docs/03_接口定义.md` - 更新接口文档
+119
View File
@@ -0,0 +1,119 @@
#!/usr/bin/env python3
"""
串口日志分析器:分析测试输出,验证结果
"""
import re
import json
import argparse
from collections import defaultdict
class LogAnalyzer:
def __init__(self, log_file):
self.log_file = log_file
self.results = {
'total': 0,
'passed': 0,
'failed': 0,
'tests': []
}
def analyze(self):
"""分析日志文件"""
with open(self.log_file, 'r', encoding='utf-8') as f:
lines = f.readlines()
current_test = None
for line in lines:
line = line.strip()
# 匹配 [TEST] 开始
test_start = re.match(r'\[TEST\]\s*(.*?):\s*开始', line)
if test_start:
current_test = {
'name': test_start.group(1),
'status': 'running',
'reg_tests': [],
'fails': []
}
self.results['total'] += 1
continue
# 匹配 [PASS]
pass_match = re.match(r'\[PASS\]\s*(.*?):\s*(.*)', line)
if pass_match and current_test:
reg_name = pass_match.group(1)
detail = pass_match.group(2)
current_test['reg_tests'].append({
'name': reg_name,
'status': 'PASS',
'detail': detail
})
continue
# 匹配 [FAIL]
fail_match = re.match(r'\[FAIL\]\s*(.*?):\s*(.*)', line)
if fail_match and current_test:
reg_name = fail_match.group(1)
detail = fail_match.group(2)
current_test['reg_tests'].append({
'name': reg_name,
'status': 'FAIL',
'detail': detail
})
current_test['fails'].append(f"{reg_name}: {detail}")
continue
# 匹配 [TEST] 结束
test_end = re.match(r'\[TEST\]\s*(.*?):\s*结束', line)
if test_end and current_test:
if current_test['fails']:
current_test['status'] = 'FAIL'
self.results['failed'] += 1
else:
current_test['status'] = 'PASS'
self.results['passed'] += 1
self.results['tests'].append(current_test)
current_test = None
return self.results
def generate_report(self, output_file):
"""生成测试报告"""
with open(output_file, 'w', encoding='utf-8') as f:
f.write("=" * 60 + "\n")
f.write("自动化测试报告\n")
f.write("=" * 60 + "\n\n")
f.write(f"总测试数: {self.results['total']}\n")
f.write(f"通过: {self.results['passed']}\n")
f.write(f"失败: {self.results['failed']}\n\n")
f.write("-" * 60 + "\n")
f.write("详细结果:\n\n")
for test in self.results['tests']:
f.write(f"测试: {test['name']}\n")
f.write(f"状态: {'✅ PASS' if test['status'] == 'PASS' else '❌ FAIL'}\n")
if test['fails']:
f.write("失败项:\n")
for fail in test['fails']:
f.write(f" - {fail}\n")
f.write("\n")
print(f"报告已生成: {output_file}")
print(f"统计: {self.results['passed']}/{self.results['total']} 通过")
def main():
parser = argparse.ArgumentParser(description='串口日志分析器')
parser.add_argument('log_file', help='日志文件路径')
parser.add_argument('-o', '--output', help='输出报告文件', default='test_report.txt')
args = parser.parse_args()
analyzer = LogAnalyzer(args.log_file)
analyzer.analyze()
analyzer.generate_report(args.output)
if __name__ == "__main__":
main()
+148
View File
@@ -0,0 +1,148 @@
#!/usr/bin/env python3
"""
Excel 寄存器表格解析工具
- 生成寄存器定义头文件
- 生成自动化测试代码
- 生成测试描述文件
"""
import pandas as pd
import os
import json
def parse_register_excel(file_path):
"""解析 Excel 寄存器表格"""
df = pd.read_excel(file_path)
print(f"=== 解析: {file_path} ===")
print(df.head())
print(f"\n总记录数: {len(df)}")
return df
def generate_header_file(df, output_path):
"""生成 C 头文件"""
with open(output_path, 'w') as f:
f.write("#ifndef REGISTERS_H\n")
f.write("#define REGISTERS_H\n\n")
f.write("// 自动生成的寄存器定义\n\n")
for _, row in df.iterrows():
f.write(f"// {row['描述']}\n")
f.write(f"#define {row['寄存器名']} ({row['地址']}UL)\n\n")
f.write("#endif // REGISTERS_H\n")
print(f"生成头文件: {output_path}")
def generate_test_code(df, output_path, header_name):
"""生成自动化测试代码"""
with open(output_path, 'w') as f:
f.write("/**\n")
f.write(" * 自动生成的寄存器测试代码\n")
f.write(" */\n\n")
f.write(f'#include "{header_name}"\n')
f.write('#include <stdio.h>\n\n')
# 测试函数
f.write("void test_registers(void)\n")
f.write("{\n")
for _, row in df.iterrows():
reg_name = row['寄存器名']
addr = row['地址']
reset_val = row.get('复位值', 0)
f.write(f" // 测试: {reg_name}\n")
f.write(f' printf("[TEST] {reg_name}: 开始\\n");\n')
# 读取复位值测试
f.write(f" uint32_t read_val = *(volatile uint32_t *){reg_name};\n")
f.write(f' printf("[REG] {reg_name}: 复位值=0x%08X\\n", read_val);\n')
# 复位值验证
f.write(f" if (read_val == {reset_val}UL) {{\n")
f.write(f' printf("[PASS] {reg_name}: 复位值正确\\n");\n')
f.write(" } else {\n")
f.write(f' printf("[FAIL] {reg_name}: 期望值=0x{reset_val:08X}, 实际值=0x%08X\\n", read_val);\n')
f.write(" }\n")
# 写读测试
test_val = 0xAA55AA55
f.write(f" // 写读测试\n")
f.write(f" *(volatile uint32_t *){reg_name} = 0x{test_val:08X}UL;\n")
f.write(f" read_val = *(volatile uint32_t *){reg_name};\n")
f.write(f' printf("[REG] {reg_name}: 写入值=0x{test_val:08X}, 读回值=0x%08X\\n", read_val);\n')
f.write(f" if (read_val == 0x{test_val:08X}UL) {{\n")
f.write(f' printf("[PASS] {reg_name}: 读写一致\\n");\n')
f.write(" } else {\n")
f.write(f' printf("[FAIL] {reg_name}: 期望值=0x{test_val:08X}, 实际值=0x%08X\\n", read_val);\n')
f.write(" }\n")
f.write(f' printf("[TEST] {reg_name}: 结束\\n");\n')
f.write(" printf(\"\\n\");\n\n")
f.write("}\n\n")
# 主函数
f.write("int main(void)\n")
f.write("{\n")
f.write(' printf("=== 自动化寄存器测试开始 ===\\n\\n");\n')
f.write(" test_registers();\n")
f.write(' printf("\\n=== 自动化寄存器测试完成 ===\\n");\n')
f.write(" while(1);\n")
f.write(" return 0;\n")
f.write("}\n")
print(f"生成测试代码: {output_path}")
def generate_test_specs(df, output_path):
"""生成测试描述文件 (JSON)"""
specs = []
for _, row in df.iterrows():
spec = {
'name': row['寄存器名'],
'address': row['地址'],
'description': row.get('描述', ''),
'reset_value': row.get('复位值', 0),
'test_cases': [
'reset_value_check',
'write_read_test'
]
}
specs.append(spec)
with open(output_path, 'w', encoding='utf-8') as f:
json.dump(specs, f, indent=2, ensure_ascii=False)
print(f"生成测试描述: {output_path}")
if __name__ == "__main__":
register_dir = "docs/00_芯片资料/registers"
if os.path.exists(register_dir):
for filename in os.listdir(register_dir):
if filename.endswith(('.xlsx', '.xls')):
file_path = os.path.join(register_dir, filename)
df = parse_register_excel(file_path)
# 生成头文件
header_name = filename.replace('.xlsx', '.h').replace('.xls', '.h')
output_header = os.path.join("projects/P01_chip_test/inc", header_name)
generate_header_file(df, output_header)
# 生成测试代码
test_name = filename.replace('.xlsx', '_test.c').replace('.xls', '_test.c')
output_test = os.path.join("projects/P01_chip_test/src", test_name)
generate_test_code(df, output_test, header_name)
# 生成测试描述文件
spec_name = filename.replace('.xlsx', '_spec.json').replace('.xls', '_spec.json')
output_spec = os.path.join("projects/P01_chip_test/tests", spec_name)
generate_test_specs(df, output_spec)
else:
print(f"目录不存在: {register_dir}")
+16
View File
@@ -0,0 +1,16 @@
# JTAG 调试工具
## 工具脚本
- `flash.sh`: 下载固件脚本
- `debug.sh`: 启动调试会话
- `pyocd.cfg`: pyOCD 配置
## 使用示例
```bash
# 下载固件
./tools/jtag/flash.sh firmware.hex
# 启动调试
./tools/jtag/debug.sh
```
+15
View File
@@ -0,0 +1,15 @@
# 串口监控工具
## 工具脚本
- `monitor.sh`: 串口监控脚本
- `log_parser.py`: 日志解析工具
## 使用示例
```bash
# 监控串口
./tools/uart/monitor.sh /dev/ttyUSB0 115200
# 解析日志
python tools/uart/log_parser.py log.txt
```