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

11 KiB
Raw Permalink Blame History

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

测试工具函数

需要创建的辅助函数:

// 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 中自动运行测试:

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