2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS SDK使用部分をエミュレートするmotoライブラリの注意点、実装方法について

Last updated at Posted at 2024-09-04

はじめに

今回は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をモック化したテストコードを書く際は気を付けましょう。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?