
motoでDynamoDBをモックするときはmock_dynamodbを使用することになったので歴史を振り返ってみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは。サービス開発室の武田です。
PythonのAWSライブラリといえばboto3ですね。boto3を使用することで、簡単にプログラムからAWSリソースを操作できます。外部APIを使用する際に課題となるのはユニットテストです。Pythonではmotoという、boto3のモッキングライブラリが開発されており、これを使用することでboto3を使用しているプログラムのテストが比較的容易に実行できます。
motoではデコレータを使用してモックを使用します。たとえばDynamoDBのモックを差し込みたい場合、次のように書きます。
@mock_dynamodb2 def test_dynamodb(): pass
さて、長らくmotoユーザーの間では、DynamoDBをモックするならmock_dynamodb2を使用するのが常識でした。実はv4.0.0でこのAPIは削除され、代わりにmock_dynamodbを使用することになりました。結論としてはこれだけなのですが、このエントリでは、少しこのAPIの変遷について追ってみましょう。
そもそもdynamodbとdynamodb2とは
最新のmotoでは(正確にはv4.0.0以降では)mock_dynamodbというAPIを使用することになったわけですが、そもそもなぜ2種類もあったのでしょうか?
motoの初期実装ではmock_dynamodbだけが存在し、mock_dynamodb2が実装されたのは2014年のことです。
Dynamo v2 no indexes by creyer · Pull Request #69 · getmoto/moto
当時のAWS事情を知っている方はどれくらいいるでしょうか。実は2014年というのは boto3が登場する以前の話 です。
このころはまだbotoという(boto3とは違う)ライブラリが使われていました。そしてbotoでDynamoDBv2というAPIが実装されたようです。motoではこの新しいAPIに対応するため、従来のmock_dynamodbとは別にmock_dynamodb2を実装したという経緯のようです。
mock_dynamodbが対応していたのは古いAPIのため、boto3でモックする場合はmock_dynamodb2を使用するということになったのでしょう。
mock_dynamodb2は同一実装となり非推奨へ
前述のような経緯で、長らくmock_dynamodb2を使用していましたが、次のPRでこれが非推奨となりました。
Deprecate mock_dynamodb2 by bblommers · Pull Request #4919 · getmoto/moto
v3.1.0で取り込まれており、ポイントは次の3点です。
moto/dynamodbディレクトリがmoto/dynamodb_v20111205にリネームされたmoto/dynamodb2ディレクトリがmoto/dynamodbにリネームされたmock_dynamodbとmock_dynamodb2は同一実装となった
つまり古いAPIはバージョン番号を付与した名前に変えてしまい、実質標準となっていたdynamodb2をdynamodbにしたというわけです。これによってmock_dynamodb2は非推奨となりましたが、将来のバージョンで削除されるまでは、どちらを使っても同じ挙動をします。
mock_dynamodb2削除
その後、非推奨となっていたmock_dynamodb2はv4.0.0で削除されます。
Remove DynamoDB2/RDS2 decorators by bblommers · Pull Request #5383 · getmoto/moto
これによって、完全にmock_dynamodb2は使用できなくなり、mock_dynamodbを使用することになりました。
moto時系列まとめ
- 2013-02-16 first commit
- 2013-02-27 v0.0.3リリース(dynamodb実装)
- 2014-01-12 v0.2.16リリース(dynamodb2実装)
- 2015-06-23 boto3 GA
- 2017-05-13 moto GA
- 2022-03-13 v3.1.0リリース(dynamodb2非推奨)
- 2022-08-20 v4.0.0リリース(dynamodb2削除)
まとめ
motoでDynamoDBをモックする場合、バージョンによって使用するデコレーターが変わります。最新版を使用する際は、mock_dynamodbを使用してください。






