模組 5:單元測試與偵錯
學習模組
請注意,您可以按照此處提供的範例執行操作,但這並非強制要求。
有多種方法可以測試 Lambda 函數。最簡單的方法是使用和建置 AWS Lambda 專案範本中提供的單元測試。若要執行測試,只需要在 IDE 中使用您熟悉的測試運行程式或執行簡單的 dotnet 測試。
另一個選項是使用 AWS .NET Mock Lambda 測試工具。目前處於預覽狀態。在這種狀態下,您可以對 Lambda 函數進行測試與偵錯。該工具作為 AWS Toolkit for Visual Studio 的一部分包含在其中。但是您可以下載它,以便在命令列、VS Code 和 Rider 中使用。
如果您正在開發部署到容器的 Lambda 函數,則 Runtime Interface Emulator 將讓您測試在容器內執行的函數。
您可以使用諸如 localstack 之類的協力廠商工具在本地測試您的函數,但是執行函數測試的最佳方法是將您的 Lambda 函數部署到 AWS 並在那裡進行測試。AWS 每月為所有帳戶提供 100 萬次免費請求;每月最多提供 320 萬秒的運算時間。因此,幾乎沒有理由不在 AWS 雲端上測試您的函數。
有關定價的更多信息,請參閱以下兩個頁面 – 開始使用 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 Mock Lambda 測試工具
如上所述,如果您在 Visual Studio 中使用 AWS Toolkit,則該工具已包含在內。
您可以在 Visual Studio、VS Code、Rider 或命令列中使用該工具。
命令列允許您在兩種模式下執行:
1.使用基於 Web 瀏覽器的使用者介面
2.沒有使用者介面
接下來的幾步操作演示了如何透過命令行使用該工具,但如果您願意,可以隨時跳到有關 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 進行測試。
在使用者介面中,您可以輸入自己的有效負載,但在這種情況下您不必擔心跳脫。或者,您可以從一組示例請求有效負載中進行選擇。這些有效負載允許您類比來自其他 AWS 服務的請求,例如 S3、Kinesis、SQS 等。
但目前,輸入 "hello" (包括引號) 作為有效負載,然後按下「執行函數」按鈕。
在回應部分,您將看到函數返回值。
Visual Studio
在 Visual Studio 中開啟 FunctionWithTestProject/src/FunctionWithTestProject 專案。
Visual Studio 將建立一個 Properties 目錄,並在該目錄中創建一個 launchsettings.json 文件,該檔案將 AWS .NET Mock Lambda 測試工具連接到您的程式碼。
該檔案將如下所示:
{
"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 Code
要使用 VS Code 中的 AWS .NET Mock Lambda 測試工具,請按照此處的指示進行操作: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-testtool-6.0。
2. 如果您使用的是 Linux/Mac dotnet-lambda-test-tool-6.0,將沒有 .exe 副檔名。
Rider
容器和 Runtime Interface Emulator
如果您要在容器內部署 Lambda 函數,則可以使用 AWS Runtime Interface Emulator (RIE) 執行另一層本機測試。您無需安裝任何新工具,這些工具將自動打包入您建置的容器中。
在此範例中,您將編寫一個擁有兩個函數處理常式的無伺服器應用程式。
使用以下方法建立基於容器的新專案:
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
如果您的程式碼中有多個函數處理常式,則應依次測試每個函數處理常式,啟動容器並每次傳遞相應的函數處理常式。
最後,向 Runtime Interface Emulator 發出 HTTP 請求。您可以使用 Fiddler、Postman、Insomnia 等。以下是使用 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 提供豐富且始終免費的方案,允許您每月免費執行一百萬個 Lambda 請求,如果您超過該限制,接下來的 100 萬次執行將花費 0.20 美元,即每次執行 0.0000002 美元。在定價方面有一些注意事項,與記憶體使用量和執行時間有關,請參閱:開始使用 AWS 免費方案和 AWS Lambda 定價,了解更多資訊。
儘管模擬器工具可能很好,如果您沒有網際網路連接,您可能會發現其效果與真正的 AWS 服務並不完全相同。在 AWS 中測試您的 Lambda 函數意味著部署程式碼時不會出現意外。
您所需要做的就是建立一個 .NET 測試專案,xUnit 範本是一個不錯的選擇。然後,針對您部署到 AWS 的 Lambda 函數編寫函數測試。
dotnet new xunit -n LambdaTestProject
如需測試部署到 AWS 的 .NET Lambda 函數的簡介,請參閱部落格文章開發 .NET Core AWS Lambda 函數。
偵錯
您可能需要不時在本地對 Lambda 函數進行偵錯。有兩種簡單的方法可以做到這一點:
1.在單元測試專案中放置一個中斷點,然後進入該函數。
2.從您的 IDE 中啟動 AWS .NET Mock Lambda 測試工具,在函數中放置一個中斷點,然後透過測試工具執行該函數。
使用單元測試專案
打開測試專案並在代碼中調用 Lambda 函數的地方放置一個中斷點。
對測試進行偵錯。當您遇到中斷點時,進入 Lambda 函數。
使用 AWS .NET Mock Lambda 測試工具
在 Visual Studio 中,開啟函數專案,而不是測試專案。
在函數處理常式中放置一個中斷點。在 Web 使用者介面中,添加您的函數輸入,然後按「執行」。
如遇到中斷點,您可以像調試任何其他方法一樣調試 Lambda 函數。
結語
當您習慣編寫 Lambda 函數時,您可能會在不同的函數測試方法之間切換,但強烈建議您儘快使用真正的 AWS Lambda 服務來測試您的代碼。這是測試程式碼的最佳做法。
您還了解了如何在本機調試函數,從而可以逐步執行程式碼並查看結果。
知識檢查
1.哪些 IDE 允許您執行 Lambda 函數單元測試?(選擇一個)
b.VS Code
c.Rider
d.以上都是
2.AWS .NET Mock Lambda 測試工具可以讓您做什麼?(選擇一個)
b.類比調用 Lambda 函數所需的 AWS 服務
c.對您的 Lambda 函數執行效能測試
d.在本地調用函數程式碼
3.Runtime Interface Emulator 適合哪種類型的 Lambda 函數?(選擇一個)
b.基於容器的 Lambda 函數
c.自訂執行期 Lambda 函數
d.所有類型的 Lambda 函數
答案:1-d、2-d、3-b
結語
當您習慣編寫 Lambda 函數時,您可能會在不同的函數測試方法之間切換,但強烈建議您儘快使用真正的 AWS Lambda 服務來測試您的代碼。這是測試程式碼的最佳做法。
您還了解了如何在本機調試函數,從而可以逐步執行程式碼並查看結果。