AWS Lambda 上的 .NET 工作負載

模組 5

模組 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 測試專案

許多 .NET Lambda 函數專案範本都包含 xUnit 測試專案。不做任何變更,您就可以在這個專案中執行測試,且會通過測試。
使用以下方法建立一個新 Lambda 函數:
dotnet new lambda.EmptyFunction -n FunctionWithTestProject
變更為 FunctionWithTestProject/test/FunctionWithTestProject.Tests 目錄:
cd FunctionWithTestProject/test/FunctionWithTestProject.Tests
在 IDE 中打開該專案。

開啟 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、VS Code 或 Rider 中打開測試項目,然後從那裡執行測試。

在 Visual Studio 中,前往「測試」功能表,然後選取「執行所有測試」。這也將開啟測試資源總管,您將在其中看到測試結果。
在 Rider 中,移至「測試」功能表,然後選取「執行解決方案中的所有測試」。這將執行測試並開啟「單元測試」視窗,您將在其中看到結果。
對於 VS Code,您可以輕鬆執行單個測試或檔案中的所有測試
但是,如果您的測試在多個檔案中,您將需要一個測試執行器副檔名。請查看擴展程式的檔案,了解更多資訊或設定並執行測試。

變更函數中的程式碼時,您就像變更普通測試項目一樣更新測試。因為這是一個測試專案,就像您編寫的任何其他專案一樣,您可以使用相同的程式庫來幫助自己,比如 moq。

AWS .NET Mock Lambda 測試工具

此工具允許您使用自己定義的有效負載在本機調用 Lambda 函數並檢驗回應。

如上所述,如果您在 Visual Studio 中使用 AWS Toolkit,則該工具已包含在內。

您可以在 Visual Studio、VS Code、Rider 或命令列中使用該工具。

命令列允許您在兩種模式下執行:

1.使用基於 Web 瀏覽器的使用者介面

2.沒有使用者介面

接下來的幾步操作演示了如何透過命令行使用該工具,但如果您願意,可以隨時跳到有關 Visual Studio 的部分。

安裝工具

對於命令列、VS Code 和 Rider,您需要安裝該工具。

從命令列執行:
dotnet tool install -g Amazon.Lambda.TestTool-6.0
如果您已安裝該工具,請使用以下方法對其進行更新:
dotnet tool update -g Amazon.Lambda.TestTool-6.0

命令列測試

使用上面的範例專案,從命令行導覽到 FunctionWithTestProject/src/FunctionWithTestProject 目錄。

要從命令行執行測試,您必須指定--no-ui 選項,然後輸入有效負載。根據您使用的殼程式,有效負載的跳脫方式將有所不同。以下內容適用於 PowerShell。

從命令列執行:
dotnet lambda-test-tool-6.0 --no-ui --payload '\"hello\"'
用於 bash 用途:
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 
在回應部分,您可以看到 Lambda 函數的輸出。

Web UI 測試,從命令列啟動

您也可以使用命令列中的工具來啟動 Web UI 進行測試。

在使用者介面中,您可以輸入自己的有效負載,但在這種情況下您不必擔心跳脫。或者,您可以從一組示例請求有效負載中進行選擇。這些有效負載允許您類比來自其他 AWS 服務的請求,例如 S3、Kinesis、SQS 等。

但目前,輸入 "hello" (包括引號) 作為有效負載,然後按下「執行函數」按鈕。

在回應部分,您將看到函數返回值。

如果您在函數中添加了日誌語句,則會在「日誌輸出」部分看到這些語句。

Visual Studio

如果您安裝了 AWS Toolkit for Visual Studio,那麼您已經安裝了 AWS .NET Mock Lambda 測試工具。

在 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"
    }
  }
}
按 F5 來啟動應用程式。您在上面看到的同一頁面將打開,輸入您的有效負載並按下「執行函數」按鈕。

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

要為 Rider 配置 AWS .NET Mock Lambda 測試工具,請
按照此處的指示進行操作:

容器和 Runtime Interface Emulator

如果您要在容器內部署 Lambda 函數,則可以使用 AWS Runtime Interface Emulator (RIE) 執行另一層本機測試。您無需安裝任何新工具,這些工具將自動打包入您建置的容器中。

在此範例中,您將編寫一個擁有兩個函數處理常式的無伺服器應用程式。

使用以下方法建立基於容器的新專案:

dotnet new serverless.image.EmptyServerless --name TestingFunctionWithRIE
該專案包含一個 Dockerfile。打開這個檔案,您會看到 Docker 將檔案從 bin/release/Lambda-publish 目錄複寫到 Docker 容器:
COPY "bin/Release/lambda-publish"  .
開啟 Function.cs 檔案並將 Get (...) 方法替換為以下方法:
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;
}
變更為 TestingFunctionWithRIE/src/TestingFunctionWithRIE 目錄:
cd TestingFunctionWithRIE/src/TestingFunctionWithRIE 
執行以下命令:
dotnet build -c Release -o .\bin\Release\lambda-publish\ 
這將建置應用程式,並將二進位檔案放在 .\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
此命令會啟動 docker 容器並透過電腦上的連接埠 9000 顯示內部連接埠 8080,並將函數處理常式作為參數傳遞。Runtime Interface Emulator 使用它在您的應用程式中執行相應的方法。

如果您的程式碼中有多個函數處理常式,則應依次測試每個函數處理常式,啟動容器並每次傳遞相應的函數處理常式。

最後,向 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
}
如果您想變更程式碼並再次測試,請使用以下程式碼,它將 .NET 建置、容器建置和啟動容器合併為一行:
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 測試工具,在函數中放置一個中斷點,然後透過測試工具執行該函數。

使用單元測試專案

在使用 Visual Studio、VS Code 和 Rider 時,同樣的原則也適用。

打開測試專案並在代碼中調用 Lambda 函數的地方放置一個中斷點。

對測試進行偵錯。當您遇到中斷點時,進入 Lambda 函數。
現在,您將進入您的 Lambda 函數程式碼!


使用 AWS .NET Mock Lambda 測試工具

這也適用於所有三個 IDE,如果您使用的是 VS Code 或 Rider,請參閱上面的指示。

在 Visual Studio 中,開啟函數專案,而不是測試專案。

在函數處理常式中放置一個中斷點。在 Web 使用者介面中,添加您的函數輸入,然後按「執行」。

如遇到中斷點,您可以像調試任何其他方法一樣調試 Lambda 函數。

結語

在本模組中,您看到了透過命令列和 IDE 測試和偵錯 Lambda 函數的多種方法。

當您習慣編寫 Lambda 函數時,您可能會在不同的函數測試方法之間切換,但強烈建議您儘快使用真正的 AWS Lambda 服務來測試您的代碼。這是測試程式碼的最佳做法。

您還了解了如何在本機調試函數,從而可以逐步執行程式碼並查看結果。


知識檢查

現在,您已經完成了模組 5「單元測試與偵錯」。以下測試可讓您檢查到目前為止學習到的內容。

1.哪些 IDE 允許您執行 Lambda 函數單元測試?(選擇一個)

a.Visual Studio

b.VS Code

c.Rider

d.以上都是

2.AWS .NET Mock Lambda 測試工具可以讓您做什麼?(選擇一個)

a.模擬測試的 .NET 依賴關係

b.類比調用 Lambda 函數所需的 AWS 服務

c.對您的 Lambda 函數執行效能測試

d.在本地調用函數程式碼

3.Runtime Interface Emulator 適合哪種類型的 Lambda 函數?(選擇一個)

a.受管執行期 Lambda 函數

b.基於容器的 Lambda 函數

c.自訂執行期 Lambda 函數

d.所有類型的 Lambda 函數

答案:1-d、2-d、3-b

結語

在本模組中,您看到了透過命令列和 IDE 測試和偵錯 Lambda 函數的多種方法。

當您習慣編寫 Lambda 函數時,您可能會在不同的函數測試方法之間切換,但強烈建議您儘快使用真正的 AWS Lambda 服務來測試您的代碼。這是測試程式碼的最佳做法。

您還了解了如何在本機調試函數,從而可以逐步執行程式碼並查看結果。

本頁對您是否有幫助?

實作實驗室:建立和部署 Lambda 函數