シェアする

  • このエントリーをはてなブックマークに追加





【python】pytest + boto3 + motoでDynamoDBをモックしてテストする

シェアする

  • このエントリーをはてなブックマークに追加
  • 0

今回はawsのDynamoDBに特化したお話。

実際、pytest-mockなんかを駆使すればいくらでもモッキングはできるのですが、

motoというbotoの処理をモック化してくれるライブラリがあるとのことなので、

早速使ってみた感じです。

直近ではDynamoDBをテストすることになったので、

とりあえずそれに特化したサンプルをご紹介しようかなと思います。

motoって?

Moto – Mock AWS Servicesとのことで公式はこちら

ただ注意すべきなのは、全サービスをモック化してくれるわけではないという点。

対応表はこちら

ここに載っていないサービスをモックにするのであれば、

pytestのMockFixtureを使用したりしてやるしかなさそうですね。

MockFixtureを使用したモックの仕方はこちらで記事にしてますのでご参照ください。

サンプル紹介

メインの処理

テスト対象となるメインの処理は以下になります。

今回アクセスするDynamoのテーブルは以下のようなイメージ。

hoge_id(ハッシュキー) seq(レンジキー) ym data1
hoge 1 202006 hogehoge

データの取得はymでフィルターかけてレンジキー降順で1件だけ取得みたいな感じです。

要するに最新のデータを取得して、データを加工して登録するような流れ。

テスト

これをテストする処理は以下。

motoを使用する際はメソッドにデコレータをつけてあげます。

今回は「@mock_dynamodb2」のようにします。

こうすることでbotoのdyanamoリソースを操作するメソッドがモックになります。

このデコレータはclassの定義にもつけることができて、

その場合はclass内のメソッド全体に対してデコレコータが効果します。

注意すべきなのは、このデコレータをsetup_methodなどの

事前処理メソッドに付与したとしても、実際のテストメソッド側に

対してデコレータが効いていないとモックにならないということです。

※僕はこれを知らずawsにテーブルを作成してしまいました・・・・。

また、事前にテーブルの作成が必要で、今回はさらにそこにテストデータも必要です。

それをテストケースに書いていくとごちゃごちゃになるので、

今回は別ファイルにしました。

こうしておけばテーブル定義やデータが分離できて、

テストが見やすくなりますね。

まとめ

これでテスト実行するとちゃんとdynamoテーブルがモック化されて、

実際にawsへテーブルを作りにいくことなくテストを行うことができるようになります。

motoはまだまだ他のawsサービスもモック化できるようなので、

機会があればどんどん使っていきたいと思いました。

それでは!!

ブログランキング・にほんブログ村へ
にほんブログ村


人気ブログランキング

20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。

今風にいうとフルスタックエンジニアということになるのかしら??

→ 詳細プロフィールというか、生い立ちはこちら

→スキルシートをご覧になる場合はこちら

→お仕事のご依頼やお見積りなどお問い合わせはこちらから!

シェアする

  • このエントリーをはてなブックマークに追加

フォローはいかがですか?