Testing Files Generator
简体中文

如何创建大小精确的文件

每个系统都有对应的命令,下面列出了全部三个。它们能给你一个字节数恰好正确的文件,对许多测试来说这就够了。本页的每条命令在发布前都在对应系统上运行过。

简短回答

Windows:fsutil file createnew name 10485760。Linux:dd if=/dev/zero of=name bs=1M count=10。macOS:mkfile 10m name。大小以字节计,按文件管理器的算法,10 MB 就是 10485760 字节。

Windows

fsutil,以及无需额外工具的 PowerShell 写法

fsutil 随 Windows 提供。它接受以字节为单位的大小,所以先算出数字:10 MB 是 10485760,100 MB 是 104857600,1 GB 是 1073741824。

fsutil file createnew test10mb.bin 10485760

在 Windows 11 上实测:它可以在普通命令提示符下运行,不需要管理员权限,生成的文件恰好是 10485760 字节。

PowerShell 不需要调用其他程序也能做到同样的事,并且认识单位:

$file = New-Object System.IO.FileStream "test10mb.bin", Create, ReadWrite
$file.SetLength(10MB)
$file.Close()

PowerShell 中的 10MB 表示 10485760 字节,与资源管理器使用的 1024 进制算法相同,所以上面两条命令得到的大小一样。

Linux

dd、truncate 和 fallocate,以及容易坑人的差别

dd 是人人皆知的那个。它真的会写入这些字节:

dd if=/dev/zero of=test10mb.bin bs=1M count=10

truncate 是瞬间完成的,而这正是陷阱所在。在 Alpine Linux 上实测,该文件报告 10485760 字节,却占用零个块,它是一个稀疏文件。任何读取它的程序会得到十兆字节的零,但磁盘从未真正让出空间:

truncate -s 10M test10mb.bin

用它测试上传限制没问题,但用来测试磁盘配额就会误导人。当空间必须真实占用时,应该使用 fallocate:

fallocate -l 10M test10mb.bin

而当内容必须不可压缩,让归档程序无法再把它压小时:

head -c 10485760 /dev/urandom > test10mb.bin

macOS

mkfile(不是稀疏文件),以及你已经熟悉的另外两个

macOS 自带 mkfile。在 macOS 26.6.2 上实测:10485760 字节和 20480 个块,所以空间是真正分配的,而不只是承诺:

mkfile 10m test10mb.bin

dd 和 truncate 也都有,行为与 Linux 上相同:

dd if=/dev/zero of=test10mb.bin bs=1m count=10
truncate -s 10M test10mb.bin

这种办法在哪里失效

大小正确的文件不等于类型正确的文件

以上所有方法给你的都是一块零。如果被测对象只看大小,比如上传限制、配额或传输,这就够了。一旦有任何东西打开这个文件,就不够了。

实测过,而且值得你自己试一试:用 fsutil 做一个 2 MB 的文件,把它命名为 photo.png,再交给图像库处理。Pillow 会回答 cannot identify image file。它不是 PNG,从来就不是,只是名字这么说。

这比听起来更重要,因为测试随后会以哪种方式失败。你的上传接口拒绝了这个文件,测试变绿,于是你断定大小限制有效。其实它并不是因为大小而拒绝的,而是因为这些字节不是图片,你本想测试的规则根本没有被触及。

另一种办法

该格式的真实文件,大小恰好是你要求的

这就是 Testing Files Generator 所做的事。文件是该格式的真实文件,能在对应软件中打开,字节数恰好等于你的要求,精确到字节:

tfg generate --format png --size 10mb --out ./fixtures

请求格式无法达到的大小,你会得到一个说明下限及其原因的错误,绝不会得到大小错误的文件。格式页面列出了每种格式及其能生成的最小文件。

而一个限制对应的是三个测试用例,而不是一个,所以工具会把三个都构建出来:

tfg generate --format pdf --boundary 10mb --out ./edges

这会给你 10485759、10485760 和 10485761 字节的文件,以及一份清单,说明你的系统应该接受哪些、拒绝哪些。使用场景页面会讲解这一点,以及它为之而生的另外四项任务。

免费开源,GPL-3.0。无需注册。Windows 和 macOS 的下载包已签名,启动时没有警告。

那么该用哪个?

两种办法都在本页,因为它们各自在一部分情况下是对的。要避免的错误,是在需要后者的地方用了前者,还把变绿的测试当成证明。