

# Python での AWS Lambda 関数テスト
<a name="python-testing"></a>

**注記**  
サーバーレスソリューションをテストするためのテクニックとベストプラクティスの詳細については、「[関数のテスト](testing-guide.md)」の章を参照してください。

 サーバーレス関数のテストでは、従来のテストタイプと手法を使用しますが、サーバーレスアプリケーション全体のテストも検討する必要があります。クラウドベースのテストでは、関数とサーバーレスアプリケーションの両方の品質を**最も正確に**測定できます。

 サーバーレスアプリケーションアーキテクチャには、API 呼び出しを通じて重要なアプリケーション機能を提供するマネージドサービスが含まれます。このため、開発サイクルには、関数とサービスが相互に作用する際に機能を検証する自動テストを含める必要があります。

 クラウドベースのテストを作成しない場合、ローカル環境とデプロイされた環境の違いにより問題が発生する可能性があります。継続的な統合プロセスでは、コードをQA、ステージング、本番稼働などの次のデプロイ環境に昇格する前に、クラウドにプロビジョニングされた一連のリソースに対してテストを実行する必要があります。

 サーバーレスアプリケーションのテスト戦略に関する詳細については、このショートガイドを引き続きご覧ください。また、[サーバーレステストサンプルリポジトリ](https://github.com/aws-samples/serverless-test-samples)にアクセスして、選択した言語とランタイムに固有の実用的な例を調べることもできます。

 ![\[illustration showing the relationship between types of tests\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/test-type-illustration2.png) 

 サーバーレステストの場合も、*ユニット*テスト、*統合*テスト、*エンドツーエンド*テストを書くことになります。
+ **ユニットテスト** - 分離されたコードブロックに対して実行されるテスト。例えば、特定の商品と配送先を指定して配送料を計算するビジネスロジックを検証する場合です。
+ **統合テスト** - 通常はクラウド環境で相互作用する 2 つ以上のコンポーネントまたはサービスを対象としたテスト。例えば、キューからのイベントを処理する関数を検証する場合です。
+ **エンドツーエンドテスト** - アプリケーション全体の動作を検証するテスト。例えば、インフラストラクチャが正しくセットアップされ、顧客の注文を記録するためにイベントがサービス間で想定どおりに流れることを確認する場合です。

## サーバーレスアプリケーションのテスト
<a name="python-testing-techniques-for-serverless-applications"></a>

 通常、サーバーレスアプリケーションコードのテストには、クラウドでのテスト、モックを使ったテスト、場合によってはエミュレーターでのテストなど、さまざまな方法を組み合わせます。

### クラウドでのテスト
<a name="python-testing-in-the-cloud"></a>

 クラウドでのテストは、ユニットテスト、統合テスト、エンドツーエンドテストなど、テストのあらゆる段階で役立ちます。クラウドにデプロイされたコードやクラウドベースのサービスとやり取りするコードに対してテストを実行します。この方法では、コードの品質を**最も正確に**測定できます。

 クラウドで Lambda 関数をデバッグする便利な方法は、コンソールからテストイベントを行うことです。*テストイベント*とは、関数への JSON 入力のことです。関数が入力を必要としない場合、イベントは空の JSON ドキュメント `({})` にすることができます。コンソールには、さまざまなサービス統合のサンプルイベントが用意されています。コンソールでイベントを作成したら、それをチームと共有して、テストを簡単かつ一貫性のあるものにすることができます。

**注記**  
[コンソールで関数をテストする](testing-functions.md)のが簡単な方法ですが、テストサイクルを自動化することでアプリケーションの品質と開発スピードが保証されます。

### テストツール
<a name="python-testing-tools"></a>

 開発フィードバックのループを高速化するためのツールやテクニック。例えば、[AWS SAM Accelerate](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/accelerate.html) と [AWSCDK 監視モード](https://docs.aws.amazon.com/cdk/v2/guide/cli.html#cli-deploy-watch)は、いずれもクラウド環境の更新に要する時間を短縮します。

[Moto](https://pypi.org/project/moto/) は AWS サービスやリソースを模倣するための Python ライブラリです。応答をインターセプトしてシミュレートするデコレータを使用して、ほとんどまたはまったく変更を加えずに関数をテストできます。

 [Powertools for AWS Lambda (Python)](https://docs.powertools.aws.dev/lambda-python/latest/utilities/validation/) の検証機能にはデコレータが用意されているため、Python 関数からの入力イベントと出力応答を検証できます。

 詳細については、ブログ記事「[Python と AWS モックサービスによる Lambda の単体テスト](https://aws.amazon.com/blogs/devops/unit-testing-aws-lambda-with-python-and-mock-aws-services/)」を参照してください。

 クラウドデプロイの反復に伴うレイテンシーを減らすには、「[AWS サーバーレスアプリケーションモデル (AWS SAM) アクセラレート](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/using-sam-cli-sync.html)」、「[AWS Cloud Development Kit (AWS CDK) ウォッチモード](https://docs.aws.amazon.com/cdk/v2/guide/cli.html#cli-deploy-watch)」を参照してください。これらのツールは、インフラストラクチャとコードの変更を監視します。これらの変更に対応して、増分更新を自動的に作成してクラウド環境にデプロイします。

 これらのツールを使用する例は、[Python テストサンプル](https://github.com/aws-samples/serverless-test-samples/tree/main/python-test-samples)のコードリポジトリにあります。