分片上传单元测试重点是验证切分、并发、重试、断点续传逻辑:用假数据和mock网络,拆解为纯函数(如getchunks、uploadchunk),覆盖边界与异常场景,聚焦输入输出契约而非实现细节。

分片上传的单元测试重点不是模拟网络,而是验证分片切分、并发控制、错误重试、断点续传等逻辑是否正确。核心思路是:用假数据代替真实文件,用 mock 替代网络请求(如 fetch 或 axios),隔离外部依赖,专注测试业务逻辑。
1. 拆解可测试的核心函数
把分片上传流程拆成小而纯的函数,例如:
- getChunks(file, chunkSize):按字节切分文件为 Blob 数组
- uploadChunk(chunk, index, uploadId):上传单个分片(返回 Promise)
- mergeChunks(uploadId):调用服务端合并接口
- resumeUpload(uploadId, uploadedIndices):跳过已传分片
这些函数不直接操作 DOM 或发真实请求,就容易用 Jest / Vitest 单元测试。
2. Mock 网络请求并控制响应行为
用 jest.mock('axios') 或 vi.mock('node-fetch') 模拟不同场景:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 成功上传:返回
{ code: 0, data: { chunkIndex: 2 } } - 某一分片失败:对第 3 次调用 mock 返回 500 错误,验证重试逻辑
- 断点续传:预先 mock 已上传的索引列表,检查
getChunks()是否跳过它们
例如在 Vitest 中:
vi.mock('@/api/upload', () => ({
uploadChunk: vi.fn().mockImplementation((chunk, idx) => {
if (idx === 3) return Promise.reject(new Error('Network timeout'));
return Promise.resolve({ chunkIndex: idx });
})
}));
3. 测试关键边界与异常流
别只测“全成功”,重点覆盖这些 case:
- 文件大小为 0 或小于分片大小 → 应只生成 1 个 chunk
- 并发数设为 1/3/10 → 检查 Promise.allSettled 的使用和队列调度是否正确
- 重试 3 次后仍失败 → 是否抛出聚合错误、是否标记该分片失败
- 上传中途调用
abort()→ 已发请求是否被取消(需 mock AbortController)
4. 避免测试“实现细节”,聚焦输入输出契约
比如不要断言 “内部调用了 5 次 fetch”,而应断言:
- 给定 1MB 文件 + 256KB 分片 →
getChunks()返回长度为 4 的数组 - 传入已成功上传 [0, 2] →
resumeUpload()只调用uploadChunk两次(对应索引 1 和 3) - 所有分片 resolve 后 →
mergeChunks()被调用且参数含正确 uploadId
这样即使你后续把并发改成 worker thread 或 WebRTC,只要输入输出不变,测试依然通过。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










