pythonでbotoを使ったプログラムのテストをする
pythonでS3を使ったプログラムを書く際に使用するライブラリとしてbotoが有名だと思う.
使い方は以下のサイトとかを参考にしたらいいと思う.
boto でさくらのBASE Storageを弄る « 不定期な記録
botoのサンプルプログラム
すごく簡単なサンプルはこんな感じ.
ホームディレクトリに.boto
を置いてあげなきゃいけない
[Credentials] aws_access_key_id = <your access key> aws_secret_access_key = <your secret key>
motoを使ってテストする
プログラムを書いたらテストをしなきゃないけない.
しかし,テストのたびにS3にファイルを作られても困る.
あと,CIサーバには認証情報を置きたくない.
そんな時にはmotoを使うと良い.
普通にユニットテストを書いてみた.
ここで,~/.boto
を削除して認証情報をなくした上で,テストを実行してみる
$ rm ~/.boto $ python test.py E ====================================================================== ERROR: testMain (__main__.BotoSampleTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "test.py", line 13, in testMain self.assertEqual(sample(), 'test') File "/Users/kawasakitoshiya/workspace/tmp/mock_s3/boto_sample.py", line 5, in sample conn = boto.connect_s3() File "/Users/kawasakitoshiya/.virtualenvs/default/lib/python2.7/site-packages/boto/__init__.py", line 140, in connect_s3 return S3Connection(aws_access_key_id, aws_secret_access_key, **kwargs) File "/Users/kawasakitoshiya/.virtualenvs/default/lib/python2.7/site-packages/boto/s3/connection.py", line 190, in __init__ validate_certs=validate_certs, profile_name=profile_name) File "/Users/kawasakitoshiya/.virtualenvs/default/lib/python2.7/site-packages/boto/connection.py", line 568, in __init__ host, config, self.provider, self._required_auth_capability()) File "/Users/kawasakitoshiya/.virtualenvs/default/lib/python2.7/site-packages/boto/auth.py", line 879, in get_auth_handler 'Check your credentials' % (len(names), str(names))) NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler'] Check your credentials ---------------------------------------------------------------------- Ran 1 test in 1.090s FAILED (errors=1)
認証情報が無いのでテストに失敗する.
motoを使ってテストする
motoはS3のモックを作ってくれる.
気を付けなきゃいけないのは, motoが作ってくれるモックに,プログラムで使用するのバケットをテストコードで毎回生成してあげること.
$ python test_with_moto.py . ---------------------------------------------------------------------- Ran 1 test in 0.057s OK
これで快適boto生活!
注意点
motoはソケットを使うプログラムと併用できない仕様になっているみたいなので,注意が必要. それについては次の記事でかいてみようと思う