2026年08月23日 00:20 / - PV

Webサービスのファイルアップロード機能を作っていると、必ずやってくるのが境界値テストです。
「アップロード上限2MBです」と仕様に書いた以上、
を確認しなければテストしたことになりません。ところが、いざ確認しようとすると 「ちょうど2MBの画像」「500KBぴったりの画像」って、手元に都合よく転がっていないんですよね...。
手持ちの写真をリサイズして「1.8MB...惜しい...」を繰り返した経験のある方も多いのではないでしょうか。
本記事では、容量を指定してテスト画像を用意する方法を、手軽な順にまとめます。
手前味噌ですが、弊社のWebツール集 Spoon Tools! に、まさにこの用途のためのツールがあります。
使い方は、画像の容量(10KB〜2MB)と背景色を選んで「生成を開始」を押すだけです。

容量と背景色を選んで「生成を開始」を押すだけ
実際に「50KB・青」で生成した画像がこちらです。

生成された50KBのテスト画像(実物)。ファイルサイズは51,200バイト=50KiBぴったり
見た目はただの青い正方形ですが、ファイルサイズは51,200バイト(=50KiB)ぴったり。境界値テストでよく使う「512KB」「1000KB」「2000KB(2MB)」あたりがすぐ作れるので、まずはこれで済むかどうか試していただくのが早いと思います。
エンジニアの方なら、コマンドラインで作ってしまう方法もあります。
まず適当な大きさの画像をImageMagickで生成します。
magick -size 1920x1080 xc:white test.jpg
ただし、この時点ではファイルサイズは成り行きです。「ちょうど◯MB」にするのは実は結構難しいので、次の水増しテクニックと組み合わせます。
Linux/Macならtruncateコマンドで、ファイルを指定サイズまでゼロ埋めで拡張できます。
truncate -s 2M test.jpg
JPEGは画像データの終端マーカー以降のデータを無視するビューアがほとんどのため、末尾にデータを足しても画像としては普通に表示されつつ、ファイルサイズだけ狙った値になります。
-s 2M は 2MiB(2,097,152バイト)になる点に注意(後述の1MB問題)truncate -s 2000000 test.jpg画像の中身まで厳密に検証するバリデータには弾かれる可能性があるので、その場合は方法1のようにピクセルデータ自体で容量を調整しているツールを使ってください。
アップロード上限のテストで、拡張子チェックがない(またはどんなファイルでもよい)なら、ddでダミーファイルを作るのが一番速いです。
dd if=/dev/urandom of=test.bin bs=1000000 count=2 # 2,000,000バイト
dd if=/dev/urandom of=test2.bin bs=1048576 count=2 # 2MiB (2,097,152バイト)
境界値テストで一番ハマるのがこれです。「2MB」には2つの解釈があります。
| 解釈 | バイト数 | 主な採用例 |
|---|---|---|
| 2MB = 100万バイト×2(10進) | 2,000,000 | ストレージメーカー表記、フロント実装でありがちな素朴な計算 |
| 2MB = 2MiB(2進) | 2,097,152 | php.iniのupload_max_filesize=2Mなど |
たとえばPHPのupload_max_filesize = 2Mは**2MiB(2,097,152バイト)**です。一方、フロントエンドのバリデーションをsize <= 2 * 1000 * 1000で書いてしまうと、「フロントは通るのにサーバで弾かれる」(またはその逆の)帯域が約9万7000バイトぶん生まれます。
境界値テストをするなら、
の3種類を用意して、フロントとサーバの判定が一致していることまで確認するのがおすすめです。
前述のtruncateでの水増しなら任意のサイズにできます。また、○○KB画像メーカーのページには、2MB超・大量生成などの
ご要望を受け付けるリクエストフォームへのご案内もあります。
○○KB画像メーカーはスマホのブラウザからも利用できます。生成した画像はそのまま端末にダウンロードされます。
拡張子・MIMEタイプのバリデーションをテストする場合は、magick test.jpg test.pngのように
ImageMagickで変換したうえで、truncateでサイズを合わせるのが手軽です。
容量指定のテスト画像の作り方を3通りご紹介しました。
truncateddアップロード機能は「正常にアップロードできること」より 「上限を超えたときに正しく断れること」 の方がバグが出やすい場所です。境界値のテスト画像をさっと用意して、リリース前にしっかり潰しておきましょう。
この記事が何かのお役に立てれば幸いです。
最後までお読みいただきありがとうございました!
Share Me!