はじめに
今回はpythonでwebAPIの実装後、テストコードを書く際に、motoのバージョン5.x以降で記載方法が変わっているので、そちらについてまとめました。
motoとは
motoは、AWSサービスに向けた処理をモックするためのPythonライブラリ(サードパーティ)です。
DynamoDBやS3などに向けた処理を実際のAWS環境を用意せずともローカル環境で完結して、テストコードの実行が可能になります。
実装方法について
以下のリリースノートに記載の通り、以前のデコレーターの記載方法である「@mock_dynamodb」などのサービス毎に指定した記載方法ではなく、「@mock_aws」 に統一されたそうです。
■リリースノート
https://docs.getmoto.org/en/5.0.0/docs/releases.html
以下はS3に向けたバケット作成の処理をモック化する場合のソースです。
例1 直接使用する場合
import boto3
from moto import mock_aws
from mymodule import MyModel
@mock_aws
def test_my_model_save():
conn = boto3.resource("s3", region_name="us-east-1")
conn.create_bucket(Bucket="mybucket")
model_instance = MyModel("steve", "is awesome")
model_instance.save()
body = conn.Object("mybucket", "steve").get()["Body"].read().decode("utf-8")
assert body == "is awesome"
例2 withステートメントを使用した場合
import os
import yaml
import boto3
import pytest
from moto import mock_aws
from you_dir import lambda_handler
# credentials ダミーデータ設定
@pytest.fixture()
def aws_credentials():
os.environ["AWS_ACCESS_KEY_ID"] = "testing"
os.environ["AWS_SECRET_ACCESS_KEY"] = "testing"
os.environ["AWS_SECURITY_TOKEN"] = "testing"
os.environ["AWS_SESSION_TOKEN"] = "testing"
os.environ["AWS_DEFAULT_REGION"] = "ap-northeast-1"
# モック化
@pytest.fixture()
def aws(aws_credentials):
with mock_aws():
yield boto3.client("dynamodb", region_name="ap-northeast-1")
# テストデータ
def load_yaml(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
return yaml.safe_load(file)
# テーブル作成
@pytest.fixture()
def init_dynamoDB(aws):
test_data = load_yaml('test_data.yaml')
# インスタンス生成
dynamodb_client = boto3.client('dynamodb')
for table_info in test_data['dynamodb']['tables']:
table_name = table_info['name']
table_schema = table_info['schema']
table_data = table_info['data']
table_result = dynamodb_client.create_table(
TableName=table_name,
KeySchema=table_schema['KeySchema'],
AttributeDefinitions=table_schema['AttributeDefinitions'],
GlobalSecondaryIndexes=table_schema['GlobalSecondaryIndexes'],
ProvisionedThroughput=table_schema['ProvisionedThroughput']
)
motoのバージョンが5.x以降で以前のデコレーターの記載方法で書いてしまうと、importエラーになってしまうので、motoライブラリを使用する際はバージョンも含めて注意が必要です。
さいごに
ざっくりとmotoのバージョン5.x以降で使用する際の注意点について簡潔にまとめまてみました。motoを使用してSDKをモック化したテストコードを書く際は気を付けましょう。