モジュール 5: ユニットテストとデバッグ
学習モジュール
ここで紹介した例を参考にしてもかまいませんが、その必要はありません。
Lambda 関数をテストするにはさまざまな方法があります。最も簡単なのは、AWS Lambda プロジェクトテンプレートで提供されるユニットテストを使用して構築することです。テストを実行するために必要なのは、IDE の使い慣れたテストランナー、または単純な dotnet テストだけです。
もう 1 つのオプションは、AWS .NET モックラムダテストツールを使用することです。現在プレビュー中です。これにより、Lambda 関数のテストとデバッグの両方が可能になります。このツールは Visual Studio 用 AWS ツールキットの一部として含まれています。ただし、ダウンロードして、コマンドライン、VS Code、Rider で使用できます。
コンテナにデプロイされる Lambda 関数を開発する場合、ランタイムインターフェイスエミュレータを使用すると、コンテナ内で実行される関数をテストできます。
localstack のようなサードパーティのツールを使ってローカルで関数をテストできますが、機能テストを行う最善の方法は、Lambda 関数を AWS にデプロイし、そこでテストすることです。AWS では、すべてのアカウントに 1 か月あたり 100 万件の無料リクエスト、つまり 1 か月あたり最大 320 万秒の計算時間を提供しています。そのため、AWS クラウドで機能をテストしない理由はほとんどありません。
料金の詳細については、次の 2 ページを参照してください。AWS 無料利用枠の AWS Lambda 料金表から始めましょう。
これらのローカルテストツールを使えば、デバッグも簡単に行えます。簡単な例は後で説明します。
所要時間
30 分
xUnit テストプロジェクト
dotnet new lambda.EmptyFunction -n FunctionWithTestProject
cd FunctionWithTestProject/test/FunctionWithTestProject.Tests
FunctionWithTestProject.Tests.csproj ファイルを開くと、Lambda 関数プロジェクトへのプロジェクト参照が表示されます。
<ProjectReference Include="..\..\src\FunctionWithTestProject\FunctionWithTestProject.csproj" />
コマンドラインから、以下を使用してテストを実行します。
dotnet test
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: < 1 ms - FunctionWithTestProject.Tests.dll (net6.0)
Visual Studio では、[テスト] メニューに移動し、[すべてのテストを実行] を選択します。また、テストエクスプローラーが開き、テストの結果が表示されます。
関数内のコードを変更すると、通常のテストプロジェクトと同じようにテストを更新します。これはあなたが書く他のプロジェクトと同じようにテストプロジェクトなので、moq のような同じライブラリを使って手助けすることができます。
AWS .NET モックラムダテストツール
前述のように、Visual Studio で AWS ツールキットを使用している場合は、ツールが既に含まれています。
このツールは、Visual Studio、VS Code、Rider、またはコマンドラインから使用できます。
コマンドラインでは、次の 2 つのモードで実行できます。
1.Web ブラウザベースの UI を使用
2.UI なしで
次のいくつかのステップでは、コマンドラインからツールを使用する方法を示しますが、必要に応じて Visual Studio のセクションに進んでください。
ツールキットをインストールする
コマンドラインから以下を実行します。
dotnet tool install -g Amazon.Lambda.TestTool-6.0
dotnet tool update -g Amazon.Lambda.TestTool-6.0
コマンドラインテスト
コマンドラインからテストを実行するには、--no-ui オプションを指定し、ペイロードを渡す必要があります。ペイロードのエスケープは、使用しているシェルによって異なります。以下は PowerShell で動作します。
コマンドラインから、以下を実行します。
dotnet lambda-test-tool-6.0 --no-ui --payload '\"hello\"'
dotnet lambda-test-tool-6.0 --no-ui --payload '"hello"'
AWS .NET Core 6.0 Mock Lambda Test Tool (0.12.3)
Loaded local Lambda runtime from project output C:\dev\FunctionWithTestProject\src\FunctionWithTestProject\bin/Debug/net6.0
Executing Lambda function without web interface
Found Lambda config file C:\dev\FunctionWithTestProject\src\FunctionWithTestProject\aws-lambda-tools-defaults.json
... Using config file C:\dev\FunctionWithTestProject\src\FunctionWithTestProject\aws-lambda-tools-defaults.json
... Using function handler FunctionWithTestProject::FunctionWithTestProject.Function::FunctionHandler
... Using payload with the value "hello"
... Setting AWS_PROFILE environment variable to default.
... No default AWS region configured. The --region switch can be used to configure an AWS Region.
Captured Log information:
Request executed successfully
Response:
"HELLO"
Press any key to exit
Web UI テスト、コマンドラインから起動
コマンドラインからツールを使用して、テスト用の Web UI を起動することもできます。
UI では独自のペイロードを入力できますが、この場合はエスケープについて心配する必要はありません。または、サンプルリクエストペイロードのセットから選択することもできます。これにより、S3、Kinesis、SQS などの他の AWS サービスからのリクエストをシミュレートできます。
ただし、今のところ、ペイロードとして「hello」(引用符を含む)と入力し、[関数の実行] ボタンを押します。
応答セクションには、関数が返した内容が表示されます。
Visual Studio
Visual Studio で FunctionWithTestProject/src/FunctionWithTestProject プロジェクトを開きます。
Visual Studio は Properties ディレクトリを作成し、そのディレクトリ内に launchsettings.json ファイルを作成します。このファイルにより、AWS .NET モックラムダテストツールがコードに接続されます。
次のように表示されます。
{
"profiles": {
"Mock Lambda Test Tool": {
"commandName": "Executable",
"commandLineArgs": "--port 5050",
"workingDirectory": ".\\bin\\$(Configuration)\\net6.0",
"executablePath": "%USERPROFILE%\\.dotnet\\tools\\dotnet-lambda-test-tool-6.0.exe"
}
}
}
VS コード
AWS .NET Mock Lambda テストツールを VS Code で使用するには、こちらの手順に従ってください-https://github.com/aws/aws-lambda-dotnet/tree/master/Tools/LambdaTestTool#configure-for-visual-studio-code
注:
1. dotnet-lambda-test-tool-3.1 を dotnet-lambda-test-tool-6.0 に変更する必要があります。
2. Linux/Mac を使っている場合、dotnet-lambda-test-tool-6.0 には.exe 拡張子が付いていません。
Rider
コンテナとランタイムインターフェイスエミュレータ
Lambda 関数をコンテナ内にデプロイする場合は、 AWS ランタイムインターフェイスエミュレータ (RIE) を使用してローカルテストをもう1つ実行できます。新しいツールをインストールする必要はありません。ツールはビルドしたコンテナ内に自動的にパッケージ化されます。
この例では、2 つの関数ハンドラーを持つサーバーレスアプリケーションを作成します。
以下を使用して新しいコンテナベースのプロジェクトを作成します。
dotnet new serverless.image.EmptyServerless --name TestingFunctionWithRIE
COPY "bin/Release/lambda-publish" .
public APIGatewayProxyResponse Get(APIGatewayProxyRequest request, ILambdaContext context)
{
context.Logger.LogInformation($"Get method invoked. You requested {request.PathParameters["Id"]}");
var response = new APIGatewayProxyResponse
{
StatusCode = (int)HttpStatusCode.OK,
Body = $"You were looking for something with an Id of : {request.PathParameters["Id"]}",
Headers = new Dictionary<string, string> {
{
"Content-Type",
"application/json"
}
}
};
return response;
}
cd TestingFunctionWithRIE/src/TestingFunctionWithRIE
dotnet build -c Release -o .\bin\Release\lambda-publish\
Docker が実行中であることを確認し、コンテナーをビルドします。
docker build -t testing_function_with_rie:latest .
docker run -it -p 9000:8080 testing_function_with_rie:latest TestingFunctionWithRIE::TestingFunctionWithRIE.Functions::Get
コードに複数の関数ハンドラーがある場合は、それぞれを順番にテストし、コンテナーを起動し、その都度適切な関数ハンドラーを渡します。
最後に、ランタイムインターフェイスエミュレータに HTTP リクエストを行います。フィドラー、ポストマン、インソムニアなどを使用できます。以下は、VS Code Rest クライアントまたは Rider Http クライアントで使用するためのリクエストです。
POST http://localhost:9000/2015-03-31/functions/function/invocations HTTP/1.1
content-type: application/json
{
"PathParameters": {
"Id": "999"
}
}
HTTP/1.1 200 OK
Date: Fri, 29 Jul 2022 18:03:56 GMT
Content-Length: 148
Content-Type: text/plain; charset=utf-8
Connection: close
{
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": "You were looking for something with an Id of : 999",
"isBase64Encoded": false
}
dotnet build -c Release -o .\bin\Release\lambda-publish\ ; docker build -t testing_function_with_rie:latest . ; docker run -it -p 9000:8080 testing_function_with_rie:latest TestingFunctionWithRIE::TestingFunctionWithRIE.Functions::Get
AWS で Lambda 関数をテストする
上記のツールは、Lambda 関数をローカルでテストするのに最適です。シミュレートされた AWS 環境に役立つツールもありますが、関数をテストする最善の方法は AWS Lambda サービスを使用することです。
AWS には、毎月 100 万件の Lambda リクエストを無料で実行できる充実した無料利用枠があり、その制限を超えると、今後 100 万回の実行には 0.20 USD、つまり 1 回の実行につき 0.0000002 USD の費用がかかります。メモリ使用量と実行時間に関する価格設定には、いくつかの注意点があります。詳細については、「AWS 無料利用枠と AWS Lambda 料金表から始める 」を参照してください。
エミュレータツールはインターネット接続がない場合は便利かもしれませんが、実際の AWS サービスとまったく同じように動作しない場合があります。AWS で Lambda 関数をテストすれば、コードをデプロイするときになっても驚くことはありません。
必要なのは.NET テストプロジェクトを作成することだけです。xUnit テンプレートは良い選択です。そこから、AWS にデプロイする Lambda 関数を対象とする機能テストを作成します。
dotnet new xunit -n LambdaTestProject
AWS にデプロイされた.NET Lambda 関数のテスト手順については、ブログ記事「.NET Core AWS Lambda 関数の開発」を参照してください。
デバッグ
Lambda 関数をローカルでデバッグしたい場合があります。これを行うには簡単な方法が 2 つあります。
1.ユニットテストプロジェクトにブレークポイントを設定してから、関数にステップインします。
2.IDE 内から AWS .NET Mock Lambda テストツールを起動し、関数にブレークポイントを設定して、テストツールから関数を実行します。
ユニットテストプロジェクトを使用する
テストプロジェクトを開き、コード内の Lambda 関数を呼び出す場所にブレークポイントを設定します。
テストをデバッグします。ブレークポイントに達したら、Lambda 関数にステップインします。
AWS .NET モックラムダテストツールを使用する
Visual Studio では、テストプロジェクトではなく関数プロジェクトを開きます。
関数ハンドラーにブレークポイントを設定します。Web UI で、関数入力を追加し、[実行] を押します。
ブレークポイントがヒットし、他のメソッドと同様に Lambda 関数をデバッグできます。
まとめ
Lambda 関数の作成に慣れてくると、関数をテストするさまざまな方法を切り替えることができますが、できるだけ早く実際の AWS Lambda サービスを使用してコードをテストすることを強くお勧めします。それを行うには最高の場所です。
また、関数をローカルでデバッグする方法についても説明しました。これにより、コードをステップごとに実行して何が起きているかを確認できます。
知識のチェック
1.Lambda 関数のユニットテストを実行できる IDE はどれですか?(1 つ選択してください)
b.VS コード
c.Rider
d.上記のすべて
2.AWS .NET モックラムダテストツールではなにができますか?(1 つ選択する)
b.Lambda 関数が呼び出すためのモック AWS サービス
c.Lambda 関数でパフォーマンステストを実行する
d.関数コードをローカルで呼び出す
3.ランタイムインターフェイスエミュレータはどのタイプの Lambda 関数に適していますか?(1 つ選択してください)
b.コンテナベースの Lambda 関数
c.カスタムランタイム Lambda 関数
d.すべてのタイプの Lambda 関数
回答:1-d, 2-d, 3-b
まとめ
Lambda 関数の作成に慣れてくると、関数をテストするさまざまな方法を切り替えることができますが、できるだけ早く実際の AWS Lambda サービスを使用してコードをテストすることを強くお勧めします。それを行うには最高の場所です。
また、関数をローカルでデバッグする方法についても説明しました。これにより、コードをステップごとに実行して何が起きているかを確認できます。