跳到内容

如何正确测试文件上传限制

分类:测试技术

在开发 Web 应用程序的文件上传功能时,仅因为设置了 10MB 的限制就放心了吗?实际上,上传限制测试存在许多陷阱,如果没有正确验证,就会在生产环境中发生意外错误。本文使用边界值测试的概念,说明了如何精确测试上传限制的方法。

边界值测试三种用例 10MB 上限边界测试 10 MB 边界 10MB - 1 byte 预期成功 10MB exact 依实现 10MB + 1 byte 预期 413 拒绝 0 在服务端验证含 multipart 开销
图1: 边界值测试三种用例布局

什么是边界值测试

边界值测试是软件测试中的基本技术之一。它基于一条经验法则:错误很容易在输入值的边界附近发生,即在"恰好达到上限""上限前一个字节""超过上限一个字节"等点处。

对于文件上传限制测试,您应该至少准备以下 3 个测试用例。

  • 恰好等于上限的文件——验证上传成功
  • 低于上限 1 个字节的文件——验证肯定成功
  • 超过上限 1 个字节的文件——验证是否正确拒绝

注意不要混淆 MB 和 MiB

上传限制测试中最常见的错误是混淆 MB(兆字节)和 MiB(美字节)。

  • 1 MB = 1,000,000 字节(十进制基数,SI 单位)
  • 1 MiB = 1,048,576 字节(二进制基数,IEC 单位)

这个差异大约为4.86%,10MB与10MiB之间相差48,576字节。准确了解服务器端框架或云服务使用哪个单位至关重要。例如,在PHP中指定upload_max_filesize为「10M」时,它被解释为10MiB(10,485,760字节)。另一方面,一些CDN或API网关可能将其视为10MB(10,000,000字节)。

multipart/form-data 的开销

文件上传中使用的 multipart/form-data 格式除了文件本体外,还包含 boundary 字符串、Content-Disposition 标头、换行符等开销。

当服务器的大小限制检查对整个请求体进行时,即使文件本身低于限制,加上开销可能会超过。由于 Nginx 的 client_max_body_size 限制整个请求体的大小,需要注意这一点。

# Nginx の設定例
client_max_body_size 10m;  # リクエストボディ全体の上限(MiB単位)

前端和后端的双重检查

测试时,请验证前端(JavaScript)和后端(服务器)都执行了大小检查。如果仅在前端进行检查,可以通过开发者工具或 curl 命令轻松绕过。

// フロントエンドでのサイズチェック例
const MAX_SIZE = 10 * 1024 * 1024; // 10 MiB
fileInput.addEventListener('change', (e) => {
    const file = e.target.files[0];
    if (file.size > MAX_SIZE) {
        alert('ファイルサイズが上限を超えています');
        e.target.value = '';
    }
});

错误消息和用户体验确认

在边界值测试中,不仅要检查请求是否成功/失败,还要检查以下几点。

  • 超过限制时是否显示清晰的错误消息?
  • HTTP 状态码是否合适(例如 413 Payload Too Large)
  • 大文件上传过程中进度条是否正确工作?
  • 是否正确处理超时

获取测试文件的方法

准确的边界值测试需要字节级大小精确的测试文件。DevLab 提供针对主要上传限制的边界值测试文件。

所有文件都包含MD5、SHA-1和SHA-256哈希值,您可以用它来验证下载后的完整性。

总结

文件上传限制的测试不仅仅是「发送一个大文件」。您应该理解 MB 和 MiB 之间的差异,考虑 multipart 开销,并使用字节级精确的测试文件来验证边界值。通过利用 DevLab 的边界值测试文件,可以高效地实施这些测试。

❓ 常见问题

上传上限的边界值测试需要哪些用例?
至少三个:恰好等于上限的文件(能否成功)、比上限小 1 字节的文件(是否稳定成功)、比上限大 1 字节的文件(是否被正确拒绝)。
在上传上限测试中混淆 MB 与 MiB 会怎样?
1MB 为 1,000,000 字节,1MiB 为 1,048,576 字节,相差约 4.86%。PHP 的 upload_max_filesize 写 10M 会被解释为 10MiB(10,485,760 字节),而部分 CDN 和 API 则按 10MB(10,000,000 字节)处理。测试前须确认服务器采用哪种口径。
multipart/form-data 的开销会影响上传上限测试吗?
会。像 Nginx 的 client_max_body_size 这类限制整个请求体的配置,会把 boundary 字符串、Content-Disposition 头等数百字节的开销一并计入,因此文件本身未超限,整个请求仍可能超限。