こんにちは、SCSKの齋藤です。
今回はAWSサービスのモックを作成し、プログラムをテストする方法の簡単な例をブログにしました。
モックとは?
ソフトウェアテストを行う際に、代用する下位モジュールスタブの一種です。
プログラムを作成した際に、作成したプログラムから別のモジュールを呼び出したりする際に、別のモジュールの代用品として理想的な値を返すようなオブジェクトです。
例えば、AWSリソースを操作するようなLambdaのソースコードをテストする場合、AWSリソースの部分を代用品としてモックを使うことで、ソースコードが正しく動作するかをテストできます。
AWSのモックツール
代表的なものとして、motoがあります。
これを用いると、開発環境のPC上などで擬似的にAWSリソースを作成することができます。
全てのAWSリソースは網羅されていないらしいのですが、Lambdaと連携されるような代表的なサービス(S3、SQS、DynamoDB、STSなど)は、含まれております。
motoを使ってPythonのテストをしてみた!
今回は実際にmotoを使ったモックによるテストを行ってみます。
今回私が検証した環境は下記になります。
マシン:Mac Book Pro
IDE:Visual Studio Code
仮想環境構築
今回は、プログラムを実行するための仮想環境から構築していきたいと思います。
仮想環境構築の前に、プロジェクトフォルダの作成を行います。
PC上のどこでも良いので、空のプロジェクトフォルダをまず作成します。中身は何も作成しません。
その次に、ターミナルを開いて、下記コマンドを入力し、仮想環境をPython3代で作成します。
仮想環境名は各自で命名してください。(今回は、myvenvで作成しました。)
$ cd プロジェクトフォルダ名
$ python3 -m venv 仮想環境名
仮想環境を構築後、下記コマンドで仮想環境をアクティベートします。
・Linux・Mac
$ source 仮想環境名/bin/activate
もしくは、
$ . 仮想環境名/bin/activate
・Windows
$ .\仮想環境名\Scripts\activate
仮想環境に切り替わったため、Pythonのバージョン確認をします。
(仮想環境名)$ python -V
先頭に仮想環境名が付与され、Python3代がインストールされているのを確認できます。
そのまま、仮想環境にパッケージのインストールを行います。
今回インストールするのは、AWS SDK for Pythonであるboto3、モックツールのmoto、Pythonのテストツールのpytestの3点です。
pip install boto3
pip install moto
pip install pytest
あくまで仮想環境上でのインストールなので、仮想環境を閉じれば、これらのツールは使えません。
VSCodeでのフォルダ・ファイル作成
VSCode上で、先ほどのプロジェクトフォルダを開きます。
まだ空のフォルダしか作成されていないので、その中にさらにフォルダとファイルを作成していきます。
今回は、下記画像のようなフォルダ構成とすることを目標とします。
このフォルダを実現するために、新たに作成するフォルダは「src」フォルダと「tests」フォルダです。
それ以外のフォルダについては自動で作成されます。
srcフォルダとtestsフォルダ内で作成するファイルをそれぞれ解説いたします。
srcフォルダ
app.py
import boto3 def list_bucket(): s3=boto3.client('s3') response=s3.list_buckets() bucket_info=response['Buckets'][0] return bucket_info
testsフォルダ
本フォルダはテストに必要なファイル類を定義します。
__init__.py
その処理を、下記のコードで実現します。
import os import sys sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'src')))
conftest.py
この仮想的な環境に、「test_bucket」という名前のS3バケットを作成します。
import pytest from moto import mock_aws import boto3 @mock_aws @pytest.fixture def setup_s3(): with mock_aws(): s3=boto3.client('s3') s3.create_bucket( Bucket='test_bucket', CreateBucketConfiguration={ 'LocationConstraint': 'ap-northeast-1', },) yield s3
test_app.py
import app def test_list_bucket(setup_s3): response=app.list_bucket() assert response['Name']=='test_bucket'
テストの実行
python -m pytest
モックしないとどうなるか?
まとめ
今回はPython上で、AWSリソースのモックのやり方を簡単に紹介しました。
motoは、大変便利なツールですので、単体テストを行う際はぜひ使うようにしましょう!