Files
SimpleRemoter/docs/TestPlan.md
2026-04-19 22:55:21 +02:00

322 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SimpleRemoter 测试计划
本文档定义了项目的测试策略、优先级和实施路线图。
## 测试目标
1. **发现潜在隐患** - 边界条件、异常情况、内存问题
2. **回归保护** - 确保修改不引入新 bug
3. **提升代码质量** - 通过测试驱动改进代码
## 模块概览
### 代码复杂度分析
| 模块 | 客户端文件 | 服务端文件 | LOC | 复杂度 |
|------|-----------|-----------|-----|--------|
| 网络核心 | IOCPClient.cpp | IOCPServer.cpp | 1500+ | 高 |
| 文件传输 | FileManager.cpp | FileManagerDlg.cpp | 4400+ | 高 |
| 远程桌面 | ScreenManager.cpp | ScreenSpyDlg.cpp | 4700+ | 高 |
| 缓冲区 | Buffer.cpp | Buffer.cpp | 500+ | 中 ✅ 已测试 |
| 系统管理 | SystemManager.cpp | SystemDlg.cpp | 800+ | 中 |
| 终端 | ShellManager/ConPTY | ShellDlg/TerminalDlg | 600+ | 中 |
| 注册表 | RegisterManager.cpp | RegisterDlg.cpp | 400+ | 低 |
| 服务管理 | ServicesManager.cpp | ServicesDlg.cpp | 400+ | 低 |
### 协议数据结构
| 结构体 | 文件 | 大小 | 用途 |
|--------|------|------|------|
| FileChunkPacket | file_upload.h | 41B | V1 文件传输 |
| FileChunkPacketV2 | file_upload.h | 77B | V2 文件传输 |
| FileResumePacketV2 | file_upload.h | 49B+ | 断点续传 |
| FileCompletePacketV2 | file_upload.h | 69B | 完成校验 |
| C2CPreparePacket | file_upload.h | 17B | C2C 准备 |
| HeaderFlag | header.h | - | 包头标识 |
| ZstaHeader | ZstdArchive.h | - | 压缩头 |
## 测试优先级
### P0 - 关键(必须测试)
这些是系统核心,问题会导致功能完全失效:
| 模块 | 测试类型 | 测试重点 | 用例数 | 状态 |
|------|---------|---------|--------|------|
| Buffer | 单元测试 | 读写、边界、下溢 | 73 | ✅ 完成 |
| 协议编解码 | 单元测试 | 数据包序列化/反序列化 | 58 | ✅ 完成 |
| 协议头验证 | 单元测试 | 包头加密/解密/版本 | 29 | ✅ 完成 |
| 路径处理 | 单元测试 | 路径拼接、相对路径、特殊字符 | 包含在协议测试 | ✅ 完成 |
### P1 - 高优先级
核心功能,问题会严重影响用户体验:
| 模块 | 测试类型 | 测试重点 | 用例数 | 状态 |
|------|---------|---------|--------|------|
| 文件传输逻辑 | 单元测试 | V2协议、分块、传输选项 | 37 | ✅ 完成 |
| 分块管理 | 单元测试 | 范围管理、合并、缺失检测 | 36 | ✅ 完成 |
| SHA-256 校验 | 单元测试 | 流式哈希、完整性验证 | 28 | ✅ 完成 |
| 断点续传 | 单元测试 | 状态序列化、恢复逻辑 | 26 | ✅ 完成 |
| 粘包/分包 | 单元测试 | 数据包边界处理 | 24 | ✅ 完成 |
| HTTP 伪装 | 单元测试 | 协议伪装/解除 | 27 | ✅ 完成 |
| 屏幕捕获 | 单元测试 | 图像压缩、差分算法 | 425 | ✅ 完成 |
### P2 - 中优先级
重要功能,但问题影响范围有限:
| 模块 | 测试类型 | 测试重点 | 预计用例 |
|------|---------|---------|---------|
| 系统管理 | 单元测试 | 进程列表解析 | 20+ |
| 终端 | 单元测试 | 命令解析、输出处理 | 15+ |
| 压缩模块 | 单元测试 | zstd 压缩/解压 | 15+ |
### P3 - 低优先级
辅助功能,可延后测试:
| 模块 | 测试类型 | 测试重点 | 预计用例 |
|------|---------|---------|---------|
| 注册表 | 单元测试 | 路径解析 | 10+ |
| 服务管理 | 单元测试 | 状态解析 | 10+ |
| 音视频 | 集成测试 | 数据流 | 10+ |
## 实施路线图
### Phase 1: 协议层测试 ✅ 已完成
**目标:** 测试所有数据包的序列化/反序列化
**状态:** 131 个测试全部通过
```
test/
└── unit/
├── client/
│ └── BufferTest.cpp # 客户端 Buffer (33 用例) ✅
├── server/
│ └── BufferTest.cpp # 服务端 Buffer (40 用例) ✅
└── protocol/
├── PacketTest.cpp # 文件传输包、命令解析 (39 用例) ✅
└── PathUtilsTest.cpp # 路径处理工具 (19 用例) ✅
```
**发现并修复的问题:**
- Buffer ULONG 下溢漏洞:当 `Skip(len)``len > m_nDataLength` 时导致下溢
**测试覆盖:**
- V2 文件传输包结构 (FileChunkPacketV2, FileResumePacketV2 等)
- 路径处理工具 (相对路径、特殊字符、边界条件)
- Buffer 读写操作、边界处理、线程安全
### Phase 2: 文件传输测试 ✅ 已完成
**目标:** 确保文件传输逻辑正确
**状态:** 127 个测试全部通过
```
test/
└── unit/
└── file/
├── FileTransferV2Test.cpp # V2 传输逻辑 (37 用例) ✅
├── ChunkManagerTest.cpp # 分块管理 (36 用例) ✅
├── SHA256VerifyTest.cpp # 文件校验 (28 用例) ✅
└── ResumeStateTest.cpp # 断点续传状态 (26 用例) ✅
```
**测试覆盖:**
| 类别 | 测试内容 | 用例数 |
|------|---------|--------|
| V2 传输选项 | FFV2_* 标志组合、TransferID 生成 | 12 |
| 数据包构建 | FileChunkPacketV2、FileQueryResumeV2 等 | 25 |
| 范围管理 | 添加、合并、缺失检测、边界条件 | 36 |
| SHA-256 | 流式计算、空数据、大数据、已知向量 | 28 |
| 断点续传 | 状态序列化/反序列化、恢复请求/响应 | 26 |
**关键发现:**
- 测试使用独立实现验证协议设计正确性
- RangeManager 相邻范围自动合并 (0-100 + 100-200 → 0-200)
### Phase 3: 网络通信测试 ✅ 已完成
**目标:** 验证网络层协议处理的正确性
**状态:** 80 个测试全部通过
```
test/
└── unit/
└── network/
├── HeaderTest.cpp # 协议头验证 (29 用例) ✅
├── PacketFragmentTest.cpp # 粘包/分包处理 (24 用例) ✅
└── HttpMaskTest.cpp # HTTP 伪装 (27 用例) ✅
```
**测试覆盖:**
| 类别 | 测试内容 | 用例数 |
|------|---------|--------|
| 协议头 | FLAG 生成、加密/解密、多版本验证 | 29 |
| 粘包/分包 | 完整包、分片、多包粘连、边界条件 | 24 |
| HTTP 伪装 | GET/POST 伪装、解除、边界检测 | 27 |
**协议细节验证:**
- 包头结构: FLAG(8B) + PackedLen(4B) + OrigLen(4B) = 16 bytes
- 位置相关 XOR 加密 (key ^ (i * 31))
- 支持 HeaderEncV0-V6 多版本兼容
### Phase 4: 图像处理测试 ✅ 已完成
**目标:** 验证屏幕捕获和压缩算法
**状态:** 425 个测试全部通过
```
test/
└── unit/
└── screen/
├── DiffAlgorithmTest.cpp # 差分算法 (32 用例) ✅
├── RGB565Test.cpp # RGB565 压缩 (286 用例) ✅
├── ScrollDetectorTest.cpp # 滚动检测 (43 用例) ✅
└── QualityAdaptiveTest.cpp # 质量自适应 (64 用例) ✅
```
**测试覆盖:**
| 类别 | 测试内容 | 用例数 |
|------|---------|--------|
| 差分算法 | 帧比较、差分编码/解码、SSE2 优化验证 | 32 |
| RGB565 | BGRA↔RGB565 转换、量化误差、批量处理 | 286 |
| 滚动检测 | CRC32 行哈希、垂直滚动检测、边缘区域 | 43 |
| 质量自适应 | RTT→等级映射、防抖逻辑、冷却时间 | 64 |
**关键实现细节:**
- RGB565 量化误差: 5-bit 最大误差 76-bit 最大误差 3
- 滚动检测: MIN_SCROLL_LINES=16, MATCH_THRESHOLD=85%
- 质量自适应: 降级 2 次稳定,升级 5 次稳定,分辨率变化冷却 30 秒
### Phase 5: 其他模块 (按需)
根据实际情况逐步扩展测试覆盖。
## 测试基础设施
### 目录结构
```
test/
├── CMakeLists.txt # 构建配置
├── test.bat # Windows 测试脚本
├── unit/ # 单元测试
│ ├── client/ # 客户端测试
│ │ └── BufferTest.cpp # ✅ 已完成
│ ├── server/ # 服务端测试
│ │ └── BufferTest.cpp # ✅ 已完成
│ ├── protocol/ # 协议测试 (Phase 1)
│ ├── file/ # 文件传输测试 (Phase 2)
│ └── screen/ # 屏幕测试 (Phase 4)
├── integration/ # 集成测试
│ └── network/ # 网络测试 (Phase 3)
├── fixtures/ # 测试数据
│ ├── images/ # 测试图像
│ └── files/ # 测试文件
└── mocks/ # Mock 对象
└── MockSocket.h
```
### 测试工具函数
需要创建的辅助函数:
```cpp
// test/TestUtils.h
// 创建临时测试目录
std::wstring CreateTempTestDir();
// 创建测试文件
void CreateTestFile(const std::wstring& path, size_t size);
// 比较文件内容
bool CompareFiles(const std::wstring& file1, const std::wstring& file2);
// 加载测试图像
std::vector<BYTE> LoadTestImage(const std::string& name);
// 模拟网络延迟
void SimulateNetworkDelay(int ms);
```
## 代码覆盖率目标
| 阶段 | 覆盖率目标 | 说明 |
|------|-----------|------|
| Phase 1 | 90%+ | 协议层应接近完全覆盖 |
| Phase 2 | 80%+ | 文件传输核心逻辑 |
| Phase 3 | 70%+ | 网络层关键路径 |
| Phase 4 | 60%+ | 图像处理算法 |
## 持续集成
建议在 GitHub Actions 中自动运行测试:
```yaml
name: Unit Tests
on: [push, pull_request]
jobs:
test:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Build and Test
run: |
cd test
test.bat rebuild
test.bat run
```
## 当前进度
**总计: 763 个测试用例,全部通过**
| 阶段 | 模块 | 用例数 | 状态 |
|------|------|--------|------|
| Phase 1 | Buffer (客户端+服务端) | 73 | ✅ |
| Phase 1 | 协议层 (Packet + PathUtils) | 58 | ✅ |
| Phase 2 | 文件传输 | 127 | ✅ |
| Phase 3 | 网络通信 | 80 | ✅ |
| Phase 4 | 图像处理 | 425 | ✅ |
| **合计** | | **763** | ✅ |
## 下一步行动
1. **Phase 5: 其他模块 (按需)**
- 系统管理模块测试
- 终端模块测试
- 压缩模块测试
2. **可选扩展**
- 集成测试
- 持续集成配置
## 附录:已发现并修复的问题
| 日期 | 阶段 | 模块 | 问题 | 修复 |
|------|------|------|------|------|
| 2026-03-08 | Phase 1 | Buffer | ULONG 下溢:`Skip(len)` 当 len > m_nDataLength 导致下溢 | 添加防护检查 |
**测试设计说明:**
- Phase 2-3 测试使用独立实现(测试副本)验证协议设计
- 这种方式验证的是协议规范正确性,而非生产代码 bug
- 发现的测试问题:`RangeManagerTest.MergeOutOfOrder` 预期修正(相邻范围自动合并)
---
*文档版本: 2.0*
*最后更新: 2026-03-08*