きっかけ
ここ数ヶ月、AWSのサービスを使ったバックエンドの開発が増えていた。S3にファイル上げたり、DynamoDBをクエリしたり、SQSでメッセージ処理したり。問題は、この手のロジックをテストする度に本番環境へのアクセスが必要になってて、CI/CDが重くなってた。もっと軽くテストを回す方法がないかなと探してたら、motoというツールを知った。
使ってみた
セットアップは本当に簡単だった。pip install moto で入れて、pytest と一緒に使うだけ。装飾子として @mock_s3, @mock_dynamodb みたいな感じで、テストケースの前に付けるだけで、そのテスト内ではAWS APIの呼び出しがmotoの仮実装にリダイレクトされる。初めてコードを書いた時は「え、これだけ?」って感じだった。
実際、こんな感じで書ける。
@mock_s3
def test_file_upload():
s3 = boto3.client('s3')
s3.create_bucket(Bucket='test')
s3.put_object(...)
これでローカルのメモリ上でS3が動く。本当に。
ここが良い
なんといっても、テストの実行速度。本番環境へのアクセスがないから、開発マシンで回すテストは秒単位で完了する。今までは1分かかってたテストスイートが10秒になった。ループテストやデバッグの試行回数が劇的に増えた。それに、AWS アカウントの権限設定に悩まなくなった。テストが失敗する原因が「IAMのポリシーが間違ってる」ではなく、純粋に「ロジックのバグ」に限定されるから、問題の原因特定も早い。
気になった点
ドキュメントが日本語だと情報が少ない。困った時はGitHub のIssueを漁ることが多い。また、AWSの全サービスをカバーしてるわけじゃないので、使ってるサービスが対応してるかは事前に確認が必要。ただ、メジャーなものはほぼ揃ってる。
まとめ
AWSを使った開発をしてる人なら、本当に一回試してみてほしい。特に、テストが遅くてストレスを感じてる、あるいはテストをもっと気軽に回したいという人には、即導入の価値がある。自分たちのチームはもう手放せなくなった。