としたにあんの左脳

備忘録です.

pythonでbotoを使ったプログラムのテストをする

pythonでS3を使ったプログラムを書く際に使用するライブラリとしてbotoが有名だと思う.

使い方は以下のサイトとかを参考にしたらいいと思う.

[Python] botoを使ってS3にファイルを保存する

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はソケットを使うプログラムと併用できない仕様になっているみたいなので,注意が必要. それについては次の記事でかいてみようと思う

motoはソケットを使うライブラリと併用できない問題 - としたにあんの左脳