生成大小精确的真实测试文件
PDF、PNG、DOCX、ZIP,共 26 种格式,每一种都是能在对应软件中打开的真实文件,大小恰好等于你的要求。每次运行还会写下你的应用应该如何处理每个文件。命令行加桌面窗口,免费开源,完全在你的机器上运行。
免费开源,GPL-3.0。无需注册。Windows 和 macOS 的下载包已签名,启动时没有警告。
-
26
种真实格式,每一种都能在对应软件中打开
-
1 字节
你要求的每个大小都精确无误,绝不悄悄取整
-
0
个对外连接,无账号、无遥测、无更新检查
问题所在
做一个测试文件很容易,做出对的一千个才是麻烦所在
你在测试接收用户文件的软件。迟早你会需要:
- 一个恰好 10 MB 的 PDF,用来弄清上传限制是否真实
- 位于该限制两侧的三个文件,用来抓出差一错误
- 10,000 个日志文件,用来看夜间任务在文件夹很大时会怎样
- 一个真正包含 200 份文档的 ZIP,而不是只有正确扩展名的空壳
- 一个 4 GB 的文件,同时不必在仓库里保存 4 GB 的文件
- 笔记本和构建服务器上完全相同的 fixture,逐字节一致
这正是它要取代的。它为 QA 工程师、测试自动化,以及代码背后有上传表单、导入程序、解析器或存储配额的所有人而做。
它的与众不同之处
其他生成器止步于字节。这个工具回答你的测试真正要问的问题
一个满是文件的文件夹仍然要你自己判断每个文件应该证明什么。这里每次运行都会在文件旁写出一个
manifest.json,它是所生成内容的简单清单,并为每一项给出声明的预期。
假设你的上传接口允许 1 MB。请求恰好位于这条线上的三个文件:
tfg generate --preset size-boundaries --limit 1mb --spread 1B --format pdf --out ./edges
| 文件 | 字节 | 你的系统应该 | 原因 |
|---|---|---|---|
1mb_under_1b.pdf | 1048575 | 接受 | 在限制之内 |
1mb_at_limit.pdf | 1048576 | 接受 | 限制本身是允许的 |
1mb_over_1b.pdf | 1048577 | 拒绝 | size_limit |
三个文件,三种不同的答案,以机器可读的形式给出。你的测试读取清单,而不是由你手写断言:
import json, os
directory = "edges"
manifest = json.load(open(os.path.join(directory, "manifest.json")))
for entry in manifest["files"]:
response = upload(os.path.join(directory, entry["path"]))
outcome = entry["expected"]["outcome"]
if outcome == "accept":
assert response.ok, entry["path"]
elif outcome == "reject":
assert not response.ok, entry["path"]
当答案取决于你自己的策略时,清单会如实说明
它记录的是 unspecified,而不是凭空编造预期。会猜测的生成器会制造误报,而总是误报的测试套件最终会被关掉。
预设
选好问题,拿到整套文件
预设是围绕一个测试问题设计的测试文件集,你不必自己琢磨哪些文件能证明什么。每个预设都有一个页面,说明它通常能发现什么、集合里有什么,以及它接受的每项设置。
-
一个合法且达到格式允许的最小大小的文件能通过吗?
empty-and-minimal -
我的系统能否正确保存、显示并返回它没料到的文件名?
filename-handling -
大小限制是否恰好在声明的位置生效?
size-boundaries -
我的表格导入能应付真实工具导出的内容吗?
tabular-import -
我的读取器知道文件是什么编码,还是在猜?
text-encoding -
我的上传表单是否接受该接受的,并拒绝其余的?
upload-validation
快速开始
三条命令,看它如何工作
-
生成一个文件
一个 PNG,恰好两兆字节:
tfg generate --format png --size 2mb --out ./fixtures -
生成大量文件
一万个日志文件,每个在 1 到 8 KB 之间,大小由种子抽取,因此明天会得到同样的文件集。给每次运行一个独立的目录,清单是一次运行所写内容的唯一记录,所以工具拒绝在其上再写第二份:
tfg generate --format log --size-range 1kb-8kb --count 10000 --out ./logs -
先检查,再删除
verify告诉你没有任何变动。cleanup只删除写出的内容,不动其他任何东西:tfg verify ./logs/manifest.json tfg cleanup ./logs/manifest.json --yes
大小按 1024 进制计算,与你的文件管理器一致,所以 2mb 表示 2097152
字节。直接写字节数也可以。文档涵盖配方、清单和退出码。
你将得到什么
为无人值守的测试套件而生
-
精确大小,精确到字节
请求 10485761 字节,就得到恰好这么多。格式无法达到的大小会得到带原因的错误,绝不会得到大小错误的文件。
-
26 种真实格式
不是带扩展名的填充零。生成的 PNG 能在图片查看器中打开,DOCX 能在 Word 中打开,ZIP 能解压。每种格式在发布前都经过独立读取器验证。
-
本身就是测试依据的清单
路径、大小、SHA-256、格式、种子、工具版本,以及你的系统应该如何处理该文件。
-
可复现
配方和种子相同,字节就相同,在任何机器上都一样。提交一个小小的 YAML 配方,而不是庞大的二进制 fixture。
-
两种界面,一个引擎
一个为 CI 打造的命令行,和一个用于探索性测试的桌面窗口。两者都不是对方的缩水版,并且有测试逐项对比它们的功能。
-
完全离线
没有账号,没有云,没有遥测,没有更新检查。命令行二进制文件里根本没有编译进网络栈。
下载
选择适合你系统的版本
解压压缩包后运行即可。tfg 是命令行,tfg-gui 是桌面窗口。没有安装程序,也无需向你的机器添加任何东西。
| 系统 | 命令行 | 桌面窗口 |
|---|---|---|
| Windows | amd64, arm64 |
amd64 |
| Linux | amd64, arm64 |
amd64 |
| macOS | arm64 |
arm64 |
哪些已签名,哪些没有
Windows 和 macOS 的下载包已签名,因此启动时不会出现未知开发者的警告。Linux 的没有签名,因为桌面 Linux 没有可用的对应签名机制。每个压缩包都列在发布页面的
verify-SHA256SUMS.txt 中,你可以据此核对所下载的内容。
免费开源,GPL-3.0。无需注册。Windows 和 macOS 的下载包已签名,启动时没有警告。