画像ファイルを読み込む関数をテストするのに、外部ファイルからデータを読み込むんじゃなくて、テストコードのほうに持たせてみたかったんだ。
ただ、文字列の十六進数の表現でもたせるとやたらデータ量多くなるし、どうしようかなって考えてた。
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==
まあ、ありなのかな。