#secretsmanager motoを使用してのpytest
pytestをする必要があったので検索しましたがあまり日本語がなさそうな雰囲気。。。
別にmoto使用しなくても全てmockにしてしまってもいいけどね。
なんとなく知的好奇心が沸いたので試してみました。
なので記事にしてみました。
##必要モジュール
boto3
moto
pytest
##実装箇所
secrets_manager.py
import json
import boto3
import logging
# log_level
logging.getLogger().setLevel(logging.INFO)
class SecretsManagerClass:
def __init__(self, secret_name):
logging.info(secret_name)
self.secret_name = secret_name
def _open_boto_session(self):
return boto3.session.Session()
def _create_boto_client(self):
return self._open_boto_session().client(
service_name="secretsmanager", region_name="ap-northeast-1"
)
def get_secrets_info(self):
get_secret_value_response = \
self._create_boto_client().get_secret_value(
SecretId=self.secret_name)
rds_secret = json.loads(get_secret_value_response['SecretString'])
return rds_secret
こんな感じで
##pytest箇所
test_secrets_manager.py
import pytest
import boto3
from moto import mock_secretsmanager
from src.secrets_manager import SecretsManagerClass
class TestGetParameterClass(object):
@pytest.fixture
def create_mocked_secret_manager_connection(self):
with mock_secretsmanager():
yield boto3.session.Session().client(
service_name="secretsmanager", region_name="ap-northeast-1"
)
@pytest.fixture
def create_test_secret(self, create_mocked_secret_manager_connection):
create_mocked_secret_manager_connection.create_secret(
Name="mock_secret",
SecretString="""{"mock_secret_key": "mock_secret_value"}"""
)
def test_get_secret_string(
self, monkeypatch, create_mocked_secret_manager_connection, create_test_secret
):
def get_mocked_secret_manager(*args, **kwargs):
return create_mocked_secret_manager_connection
monkeypatch.setattr(
SecretsManagerClass, "_create_boto_client", get_mocked_secret_manager
)
credential_client = SecretsManagerClass("mock_secret")
assert credential_client.get_secrets_info() == {
"mock_secret_key": "mock_secret_value"
}
使ってない変数とかあるけど、基本を残してるので多用的に使えるかと( ^ω^ )
まあざっとこんな感じ、元の参照した記事は何かもう忘れちまった。。。
けど大体日本語の記事より英語の記事の方が充実してるから英語がいいですよね。
stack overflow(英語版)とか
pytest最近すごく触れる機会が多いので段々と理解が深まってきました。
今日は以上です。