C# での AWS Lambda 関数テスト - AWS Lambda

C# での AWS Lambda 関数テスト

注記

サーバーレスソリューションをテストするための手法とベストプラクティスの詳細については、「関数のテスト」の章を参照してください。

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

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

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

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

illustration showing the relationship between types of tests

サーバーレステストでも、ユニット統合end-to-endテストを記述します。

  • ユニットテスト - 分離されたコードブロックに対して実行されるテスト。例えば、特定の商品と配送先を指定して配送料を計算するビジネスロジックを検証する場合です。

  • 統合テスト - 通常はクラウド環境で相互作用する 2 つ以上のコンポーネントまたはサービスを対象としたテスト。例えば、キューからのイベントを処理する関数を検証する場合です。

  • E nd-to-end テスト - アプリケーション全体の動作を検証するテスト。例えば、インフラストラクチャが正しくセットアップされ、顧客の注文を記録するためにイベントがサービス間で想定どおりに流れることを確認する場合です。

サーバーレスアプリケーションのテスト

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

クラウドでのテスト

クラウドでのテストは、ユニットテスト、統合テスト、テストなど、 end-to-end テストのすべてのフェーズで重要です。クラウドにデプロイされたコードやクラウドベースのサービスとやり取りするコードに対してテストを実行します。この方法では、コードの品質を最も正確に測定できます。

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

注記

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

テストツール

開発サイクルを能率化するために、関数のテスト時に使用できるツールやテクニックは数多くあります。例えば、AWS SAM AccelerateAWS CDK 監視モードは、いずれもクラウド環境の更新に要する時間を短縮します。

Lambda 関数コードを定義する方法により、ユニットテストを簡単に追加できます。Lambda では、クラスを初期化するためのパラメータなしのパブリックコンストラクタが必要です。2 つ目の内部コンストラクタを導入すると、アプリケーションが使用する依存関係を制御できるようになります。

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace GetProductHandler; public class Function { private readonly IDatabaseRepository _repo; public Function(): this(null) { } internal Function(IDatabaseRepository repo) { this._repo = repo ?? new DatabaseRepository(); } public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request) { var id = request.PathParameters["id"]; var databaseRecord = await this._repo.GetById(id); return new APIGatewayProxyResponse { StatusCode = (int)HttpStatusCode.OK, Body = JsonSerializer.Serialize(databaseRecord) }; } }

この関数のテストを作成するには、Function クラスの新しいインスタンスを初期化し、IDatabaseRepository のモック実装を渡します。以下の例では、XUnitMoqFluentAssertions を使用して、FunctionHandler がステータスコード 200 を返すことを確認する簡単なテストを記述しています。

using Xunit; using Moq; using FluentAssertions; public class FunctionTests { [Fact] public async Task TestLambdaHandler_WhenInputIsValid_ShouldReturn200StatusCode() { // Arrange var mockDatabaseRepository = new Mock<IDatabaseRepository>(); var functionUnderTest = new Function(mockDatabaseRepository.Object); // Act var response = await functionUnderTest.FunctionHandler(new APIGatewayProxyRequest()); // Assert response.StatusCode.Should().Be(200); } }

非同期テストの例など、より詳細な例については、「」の「.NET テストサンプルリポジトリ」を参照してください GitHub。