---
name: 文件预览语法高亮验收用例
description: 详细的测试场景,包括正向路径、错误路径、边界条件和安全测试
type: acceptance-cases
---
# 验收测试用例:文件预览语法高亮
## 命名约定
- **AC-P**: 正向路径 (Positive Path)
- **AC-E**: 错误路径 (Error Path)
- **AC-B**: 边界条件 (Boundary)
- **AC-S**: 安全测试 (Security)
---
## 正向路径测试
### AC-P-001: Python 文件语法高亮
- **前置条件**:用户已登录,技能包含 Python 文件(< 500KB)
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的 `main.py` 文件
3. 等待文件预览弹窗加载
- **预期结果**:
- 显示语法高亮的 Python 代码
- 关键字(`def`, `class`, `import`)显示为特定颜色
- 字符串显示为特定颜色
- 注释显示为特定颜色
- 样式与 Markdown 代码块一致
- **相关约束**:BR-001, BR-007
### AC-P-002: Shell 脚本语法高亮
- **前置条件**:用户已登录,技能包含 Shell 脚本(< 500KB)
- **步骤**:
1. 打开审核详情页
2. 点击文件树中的 `install.sh` 文件
3. 等待文件预览弹窗加载
- **预期结果**:
- 显示语法高亮的 Shell 代码
- 命令(`echo`, `cd`, `mkdir`)显示为特定颜色
- 变量(`$VAR`)显示为特定颜色
- 注释(`#`)显示为特定颜色
- **相关约束**:BR-001, BR-007
### AC-P-003: JSON 配置文件语法高亮
- **前置条件**:用户已登录,技能包含 JSON 文件(< 500KB)
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的 `config.json` 文件
3. 等待文件预览弹窗加载
- **预期结果**:
- 显示语法高亮的 JSON 代码
- 键名显示为特定颜色
- 字符串值显示为特定颜色
- 数字值显示为特定颜色
- 布尔值显示为特定颜色
- **相关约束**:BR-001, BR-007
### AC-P-004: YAML 配置文件语法高亮
- **前置条件**:用户已登录,技能包含 YAML 文件(< 500KB)
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的 `skill.yaml` 文件
3. 等待文件预览弹窗加载
- **预期结果**:
- 显示语法高亮的 YAML 代码
- 键名显示为特定颜色
- 字符串值显示为特定颜色
- 缩进结构清晰可见
- **相关约束**:BR-001, BR-007
### AC-P-005: 多种语言混合测试
- **前置条件**:用户已登录,技能包含多种语言文件
- **步骤**:
1. 打开技能详情页
2. 依次点击 `main.py`, `install.sh`, `config.json`, `README.md`
3. 观察每个文件的渲染效果
- **预期结果**:
- 每种文件类型都正确渲染
- Python 显示语法高亮
- Shell 显示语法高亮
- JSON 显示语法高亮
- Markdown 显示富文本渲染(已有功能)
- **相关约束**:BR-001, BR-007
### AC-P-006: 语言自动识别
- **前置条件**:用户已登录,技能包含代码文件
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的 `script.py` 文件
3. 观察语法高亮效果
- **预期结果**:
- 根据文件扩展名 `.py` 自动识别为 Python
- 应用 Python 语法高亮规则
- 无需用户手动选择语言
- **相关约束**:BR-001
### AC-P-007: 主题自动切换(Light → Dark)
- **前置条件**:用户已登录,系统主题为 Light 模式
- **步骤**:
1. 打开技能详情页,预览 Python 文件
2. 切换系统主题到 Dark 模式
3. 观察语法高亮颜色变化
- **预期结果**:
- 语法高亮主题自动切换到 Dark 模式
- 颜色对比度适合暗色背景
- 无需刷新页面
- **相关约束**:BR-006
### AC-P-008: 主题自动切换(Dark → Light)
- **前置条件**:用户已登录,系统主题为 Dark 模式
- **步骤**:
1. 打开技能详情页,预览 Python 文件
2. 切换系统主题到 Light 模式
3. 观察语法高亮颜色变化
- **预期结果**:
- 语法高亮主题自动切换到 Light 模式
- 颜色对比度适合亮色背景
- 无需刷新页面
- **相关约束**:BR-006
### AC-P-009: 复制代码功能
- **前置条件**:用户已登录,正在预览 Python 文件
- **步骤**:
1. 打开文件预览弹窗
2. 点击"复制"按钮
3. 粘贴到文本编辑器
- **预期结果**:
- 复制完整文件内容到剪贴板
- 复制的是纯文本(无 HTML 标签)
- 显示"已复制到剪贴板"提示
- 复制按钮显示动画效果(旋转 → ✅)
- **相关约束**:BR-008
### AC-P-010: 下载代码功能
- **前置条件**:用户已登录,正在预览 Python 文件
- **步骤**:
1. 打开文件预览弹窗
2. 点击"下载"按钮
- **预期结果**:
- 下载文件到本地
- 文件名为原文件名(如 `main.py`)
- 文件内容完整
- **相关约束**:BR-008
---
## 错误路径测试
### AC-E-001: 无法识别的语言(自定义扩展名)
- **前置条件**:用户已登录,技能包含自定义扩展名文件(如 `.custom`)
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的 `script.custom` 文件
3. 等待文件预览弹窗加载
- **预期结果**:
- 显示纯文本(无语法高亮)
- 不显示错误提示
- 复制和下载功能正常
- **相关约束**:BR-003
### AC-E-002: 语法高亮渲染失败
- **前置条件**:模拟 highlight.js 渲染异常
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的 Python 文件
3. 触发渲染异常(通过测试 mock)
- **预期结果**:
- 降级到纯文本显示
- 显示友好的错误提示:"语法高亮加载失败,已切换到纯文本模式"
- 复制和下载功能正常
- 记录错误日志到控制台
- **相关约束**:BR-004
### AC-E-003: 内存不足导致渲染失败
- **前置条件**:模拟浏览器内存不足
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的大文件(接近 500KB)
3. 触发内存不足异常(通过测试 mock)
- **预期结果**:
- 降级到纯文本显示
- 显示提示:"文件较大,已切换到纯文本模式以节省内存"
- 复制和下载功能正常
- **相关约束**:BR-005
### AC-E-004: 网络请求失败
- **前置条件**:模拟网络请求失败
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的 Python 文件
3. 触发网络请求失败(通过测试 mock)
- **预期结果**:
- 显示错误提示:"文件加载失败,请重试"
- 提供"重试"按钮
- 不显示文件内容
- **相关约束**:无(现有错误处理)
### AC-E-005: 文件内容为空
- **前置条件**:用户已登录,技能包含空文件
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的空文件(0 字节)
3. 等待文件预览弹窗加载
- **预期结果**:
- 显示空白内容区域
- 不显示错误提示
- 复制按钮禁用或显示"文件为空"
- **相关约束**:无
---
## 边界条件测试
### AC-B-001: 文件大小刚好 500KB
- **前置条件**:用户已登录,技能包含 500KB 的 Python 文件
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的 500KB Python 文件
3. 等待文件预览弹窗加载
- **预期结果**:
- 显示语法高亮(500KB 是阈值,包含在内)
- 渲染时间 < 500ms
- 无性能问题
- **相关约束**:BR-001
### AC-B-002: 文件大小 501KB(超过语法高亮阈值)
- **前置条件**:用户已登录,技能包含 501KB 的 Python 文件
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的 501KB Python 文件
3. 等待文件预览弹窗加载
- **预期结果**:
- 显示纯文本(无语法高亮)
- 显示提示:"文件较大(501KB),已切换到纯文本模式"
- 复制和下载功能正常
- **相关约束**:BR-001
### AC-B-003: 文件大小刚好 1MB
- **前置条件**:用户已登录,技能包含 1MB 的 Python 文件
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的 1MB Python 文件
3. 等待文件预览弹窗加载
- **预期结果**:
- 显示纯文本(无语法高亮)
- 显示提示:"文件较大(1MB),已切换到纯文本模式"
- 复制和下载功能正常
- **相关约束**:BR-001, BR-002
### AC-B-004: 文件大小 1.1MB(超过预览上限)
- **前置条件**:用户已登录,技能包含 1.1MB 的 Python 文件
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的 1.1MB Python 文件
3. 观察文件预览弹窗
- **预期结果**:
- 不显示文件内容
- 仅显示下载按钮
- 显示提示:"文件过大(1.1MB),请下载后查看"
- **相关约束**:BR-002
### AC-B-005: 文件名包含特殊字符
- **前置条件**:用户已登录,技能包含特殊字符文件名(如 `my-script (1).py`)
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的特殊字符文件
3. 等待文件预览弹窗加载
- **预期结果**:
- 正常显示语法高亮
- 文件名正确显示(包含特殊字符)
- 下载时文件名保持原样
- **相关约束**:无
### AC-B-006: 文件内容包含 Unicode 字符
- **前置条件**:用户已登录,技能包含 Unicode 字符的 Python 文件(如中文注释)
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的 Python 文件
3. 等待文件预览弹窗加载
- **预期结果**:
- 正常显示语法高亮
- Unicode 字符(中文注释)正确显示
- 复制时保留 Unicode 字符
- **相关约束**:无
### AC-B-007: 极长的单行代码(> 1000 字符)
- **前置条件**:用户已登录,技能包含极长单行代码的文件
- **步骤**:
1. 打开技能详情页
2. 点击文件树中的文件
3. 观察渲染效果
- **预期结果**:
- 正常显示语法高亮
- 水平滚动条出现
- 不影响页面布局
- **相关约束**:无
---
## 安全测试
### AC-S-001: XSS 防护(恶意 HTML 标签)
- **前置条件**:用户已登录,技能包含包含 HTML 标签的代码文件
- **步骤**:
1. 上传包含 `` 的 Python 文件
2. 打开技能详情页
3. 点击文件树中的该文件
4. 观察是否执行脚本
- **预期结果**:
- HTML 标签被转义显示为纯文本
- 不执行任何脚本
- 语法高亮正常工作
- **相关约束**:安全约束
### AC-S-002: XSS 防护(恶意事件处理器)
- **前置条件**:用户已登录,技能包含包含事件处理器的代码文件
- **步骤**:
1. 上传包含 `
` 的文件
2. 打开技能详情页
3. 点击文件树中的该文件
4. 观察是否执行脚本
- **预期结果**:
- 事件处理器被转义显示为纯文本
- 不执行任何脚本
- 不加载任何外部资源
- **相关约束**:安全约束
### AC-S-003: 路径遍历防护
- **前置条件**:用户已登录
- **步骤**:
1. 尝试访问 `/api/v1/reviews/1/file?path=../../../etc/passwd`
2. 观察响应
- **预期结果**:
- 返回 400 Bad Request
- 不返回任何文件内容
- 记录安全日志
- **相关约束**:安全约束(现有防护)
---
## 覆盖率矩阵
| 类型 | 数量 | 覆盖的约束 |
|------|------|-----------|
| 正向路径 (AC-P) | 10 | BR-001, BR-006, BR-007, BR-008 |
| 错误路径 (AC-E) | 5 | BR-003, BR-004, BR-005 |
| 边界条件 (AC-B) | 7 | BR-001, BR-002 |
| 安全测试 (AC-S) | 3 | 安全约束 |
| **总计** | **25** | **所有约束** |
---
## 变更日志
| 日期 | 章节 | 变更 | 原因 | 触发者 |
|------|------|------|------|--------|
| 2026-03-22 | 初始版本 | 创建验收用例文档 | 需求澄清完成 | requirements-clarity |