文件上传测试案例
文件上传涉及功能、兼容性、性能和安全风险。测试时不能只上传一张正常图片就结束。
需求背景
用户可以上传头像,支持 JPG、PNG,大小不超过 5 MB。上传成功后可以预览头像。
测试点拆解
| 维度 |
测试点 |
| 正常上传 |
JPG、PNG 文件上传成功 |
| 类型限制 |
GIF、PDF、EXE、脚本文件是否被拒绝 |
| 大小限制 |
小于 5 MB、等于 5 MB、超过 5 MB |
| 文件名 |
中文、空格、特殊字符、超长文件名 |
| 内容安全 |
后缀伪装、恶意脚本、空文件 |
| 预览下载 |
上传后可预览,地址有效 |
| 并发重复 |
连续上传、多次替换头像 |
| 权限 |
未登录上传、替换他人头像 |
用例示例
| 编号 |
测试点 |
步骤 |
预期结果 |
| FILE-001 |
上传 JPG |
选择小于 5 MB 的 JPG 上传 |
上传成功,头像预览正常 |
| FILE-002 |
上传 PNG |
选择小于 5 MB 的 PNG 上传 |
上传成功,头像预览正常 |
| FILE-003 |
超过大小限制 |
上传 6 MB 图片 |
上传失败,提示文件过大 |
| FILE-004 |
非法文件类型 |
上传 EXE 文件 |
上传失败,提示格式不支持 |
| FILE-005 |
后缀伪装 |
把脚本文件改名为 .jpg 上传 |
后端识别并拒绝,不允许保存为可执行内容 |
| FILE-006 |
未登录上传 |
清空登录态后调用上传接口 |
返回未登录或无权限 |
| FILE-007 |
多次替换头像 |
连续上传两张不同图片 |
最终显示最后一次上传的头像,旧文件处理符合需求 |
安全关注点
- 后端不能只按文件后缀判断类型。
- 上传目录不应该允许执行脚本。
- 文件访问地址不应暴露服务器真实路径。
- 用户不能覆盖或读取其他用户的文件。
- 上传失败时不要返回服务器敏感路径。
测试数据准备
| 数据 |
用途 |
| 小于 5 MB 的 JPG |
验证正常上传 |
| 小于 5 MB 的 PNG |
验证正常上传 |
| 5 MB 边界文件 |
验证大小边界 |
| 6 MB 图片 |
验证超限 |
| 改后缀脚本文件 |
验证后端内容识别 |
| 中文和特殊字符文件名 |
验证文件名处理 |
| 未登录状态 |
验证鉴权 |
测试文件要放在专门目录中,文件名写清用途,例如 valid_avatar.jpg、over_5mb.png、fake_jpg_script.jpg。
执行步骤示例
- 登录用户,上传正常 JPG,确认预览成功。
- 上传正常 PNG,确认可以替换头像。
- 上传 5 MB 边界文件,确认是否符合需求。
- 上传 6 MB 文件,确认被拒绝且提示明确。
- 绕过前端限制,直接用接口上传 EXE 或改后缀脚本。
- 清空登录态后调用上传接口,确认返回未登录。
- 刷新页面或重新登录,确认头像地址仍有效。
接口与存储校验示例
POST /api/files/avatar
GET /api/users/me
SELECT user_id, file_url, file_type, file_size, created_at
FROM user_files
WHERE user_id = 10001
ORDER BY created_at DESC;
缺陷示例
| 字段 |
内容 |
| 标题 |
后端仅校验文件后缀,脚本文件改名为 JPG 后可上传 |
| 前置条件 |
用户已登录,准备一个脚本文件并改名为 avatar.jpg |
| 复现步骤 |
通过接口上传该文件 |
| 实际结果 |
上传成功并返回可访问地址 |
| 期望结果 |
后端识别真实文件类型并拒绝上传 |
| 影响 |
可能造成恶意文件存储或脚本执行风险 |
容易漏测
- 只测正常图片,不测非法类型。
- 前端限制了类型,但接口绕过后仍可上传。
- 图片超过限制后没有友好提示。
- 文件名包含中文或特殊字符时保存失败。
- 头像上传成功但刷新后丢失。
复盘问题
- 为什么文件上传是安全测试重点?
- 前端限制文件类型是否足够?
- 上传文件应该如何命名,才能避免重名覆盖?