読者です 読者をやめる 読者になる 読者になる

テスト用のバイナリデータにbase64でエンコードしたテキストを使う

Python

画像ファイルを読み込む関数をテストするのに、外部ファイルからデータを読み込むんじゃなくて、テストコードのほうに持たせてみたかったんだ。
ただ、文字列の十六進数の表現でもたせるとやたらデータ量多くなるし、どうしようかなって考えてた。
Pythonだとbase64エンコード/デコードが簡単だし、いいんじゃないかと思って試してみた。
Pythonのバージョンは2.7.2で試した。PILを使って画像をリサイズしてJPEGバイナリ列を返す関数をテストしてみる。

resize_image.py

# coding: utf-8
from PIL import Image
from StringIO import StringIO

# テスト用の1*1pxのJPEGデータ
JPEG_IMAGE = \
"""/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAP//////////////////////////////////////////
////////////////////////////////////////////2wBDAf//////////////////////////
////////////////////////////////////////////////////////////wAARCAABAAEDASIA
AhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAL/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFQEB
AQAAAAAAAAAAAAAAAAAAAQP/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCQAo//
2Q=="""


def test_resize_image():
    """resize_imageのテスト
    """
    result = resize_image(JPEG_IMAGE.decode('base64'), (200, 100))
    image = Image.open(StringIO(result))
    assert(image.size[0] == 200)  # 幅が200pxになってる
    assert(image.size[1] == 100)  # 高さが100pxになってる


def resize_image(image_data, size, quority=75):
    """画像を指定したサイズにリサイズしてJPEGで返す
    """
    image = Image.open(StringIO(image_data))
    resized = image.resize(size, Image.ANTIALIAS)
    output = StringIO()
    resized.save(output, 'JPEG', quority=quority)
    return output.getvalue()

実行はnoseを使った。

$ nosetests resize_image.py
.
----------------------------------------------------------------------
Ran 1 test in 0.016s

OK

base64エンコードするのはbase64モジュールを使えば簡単。

$ python -m base64 < test.jpg
/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAP//////////////////////////////////////////
////////////////////////////////////////////2wBDAf//////////////////////////
////////////////////////////////////////////////////////////wAARCAABAAEDASIA
AhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAL/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFQEB
AQAAAAAAAAAAAAAAAAAAAQP/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCQAo//
2Q==

まあ、ありなのかな。