# 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 最大误差 7,6-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 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*