正確なサイズのファイルを作る方法
どのOSにもそのためのコマンドがあり、3つとも以下に載せています。正確なバイト数のファイルが作れ、多くのテストではそれで十分です。このページのコマンドはすべて、公開前に対応するOS上で実行しました。
短い答え
Windows:fsutil file createnew name 10485760。Linux:dd if=/dev/zero of=name bs=1M
count=10。macOS:mkfile 10m name。サイズはバイトで指定し、ファイルマネージャーの数え方での10MBは10485760です。
Windows
fsutilと、追加不要のPowerShell版
fsutilはWindowsに付属しています。サイズはバイト単位で指定するため、先に数値を計算してください。10MBは10485760、100MBは104857600、1GBは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は、エクスプローラーと同じ1024基準の数え方で10485760バイトを意味するため、上の2つのコマンドは同じサイズになります。
Linux
dd、truncate、fallocate、そして人がつまずく違い
ddは誰もが知っているコマンドです。実際にバイトを書き込みます。
dd if=/dev/zero of=test10mb.bin bs=1M count=10
truncateは一瞬で終わりますが、そこが落とし穴です。Alpine
Linuxで実測すると、ファイルは10485760バイトと報告されるのに、占有するのは0ブロックで、スパースファイルになっています。読み込むものには10メガバイトのゼロが返りますが、ディスクは領域を実際には確保していません。
truncate -s 10M test10mb.bin
アップロード制限のテストには問題ありませんが、ディスク容量の制限のテストでは誤解を招きます。領域が実際に必要なときはfallocateを使います。
fallocate -l 10M test10mb.bin
圧縮できない内容が必要で、アーカイバーが再び小さくできないようにしたいときは:
head -c 10485760 /dev/urandom > test10mb.bin
macOS
スパースではないmkfileと、すでにご存じの2つ
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で2MBのファイルを作り、photo.pngという名前を付けて、画像ライブラリに渡します。Pillowはcannot
identify image fileと答えます。それはPNGではありません。最初からそうではなく、名前がそう言っていただけです。
これは見た目以上に重要です。テストがどちらの向きで失敗するかが関わるからです。アップロードのエンドポイントがファイルを拒否し、テストが緑になり、サイズ制限は機能していると結論します。しかし、サイズが理由で拒否したのではありません。バイトが画像ではなかったから拒否したのであり、テストしたかったルールには届いていません。
- サイズのルールを見る前に、パーサーが拒否する
- サムネイル作成が失敗し、読むエラーがサムネイルに関するものになる
- ウイルス対策ソフトやコンテンツ検査が、3つ目の理由で拒否する
- ビューアーが何も表示せず、それがバグなのか誰にも分からない
もう1つの方法
その形式の本物のファイルを、要求したとおりのサイズで
これがTesting Files Generatorの役割です。ファイルはその形式の本物で、対応するソフトウェアで開け、要求したバイト数とぴったり一致します。
tfg generate --format png --size 10mb --out ./fixtures
形式が到達できないサイズを要求すると、下限とその理由を示すエラーが返り、サイズの違うファイルが作られることはありません。形式ページに、各形式と、生成できる最小のファイルを載せています。
そして制限は1つではなく3つのテストケースなので、ツールは3つとも作ります。
tfg generate --format pdf --boundary 10mb --out ./edges
10485759、10485760、10485761バイトのファイルと、システムがどれを受け入れどれを拒否するべきかを示すマニフェストが得られます。利用例のページでは、これと、このツールが想定する他の4つの用途を紹介しています。
無料のオープンソース、GPL-3.0。登録は不要です。WindowsとmacOS向けのダウンロードは署名済みで、警告なしで起動します。
では、どちらを使うべきでしょうか。
-
OSのコマンドを使う場合
何もそのファイルを開かないとき。先にサイズを確認するエンドポイントでのサイズ制限のテスト、転送、割り当て、ディスク満杯の状況。1行で済み、すでにインストールされています。
-
本物の生成ツールを使う場合
何かがファイルを解析、描画、取り込み、展開するとき。そして、明日別のマシンで同じフィクスチャをバイト単位で再び必要とするとき。
どちらも状況によって正しいため、このページに両方載せています。避けるべき間違いは、後者が必要な場面で前者を使い、緑になったテストを証明と受け取ることです。