Modul 5: Modultests und Debugging
LERNMODUL
Bitte beachten Sie, dass Sie den hier vorgestellten Beispielen folgen können, dies aber nicht müssen.
Es gibt verschiedene Möglichkeiten, eine Lambda-Funktion zu testen. Am einfachsten ist es, die in den AWS-Lambda-Projektvorlagen bereitgestellten Modultests zu verwenden und darauf aufzubauen. Ein vertrauter Testrunner in einer IDE oder der einfache Dotnet-Test ist alles, was Sie zum Ausführen der Tests benötigen.
Eine weitere Option ist die Verwendung von AWS.NET Mock Lambda Test Tool. Dieses Tool ist derzeit in der Vorschauversion. Auf diese Weise können Sie Ihre Lambda-Funktionen sowohl testen als auch debuggen. Das Tool ist als Teil von AWS Toolkit für Visual Studio enthalten. Sie können es jedoch herunterladen, um es mit der Befehlszeile, mit VS Code und Rider zu verwenden.
Wenn Sie Lambda-Funktionen entwickeln, die in Containern bereitgestellt werden, können Sie mit dem Runtime Interface Emulator Ihre Funktionen testen, die innerhalb des Containers ausgeführt werden.
Es gibt Tools von Drittanbietern wie localstack, mit denen Sie Ihre Funktionen lokal testen können. Der beste Weg, Funktionstests durchzuführen, besteht jedoch darin, Ihre Lambda-Funktionen in AWS bereitzustellen und dort zu testen. AWS stellt allen Konten 1 Million kostenlose Anfragen pro Monat sowie bis zu 3,2 Millionen Sekunden Rechenzeit pro Monat zur Verfügung. Es gibt also kaum einen Grund, Ihre Funktionen nicht in der AWS Cloud zu testen.
Weitere Informationen zur Preisgestaltung finden Sie auf diesen beiden Seiten: Erste Schritte mit dem kostenlosen AWS-Kontingent, AWS-Lambda-Preise.
Mit diesen lokalen Testtools kann auch ganz einfach Debugging durchgeführt werden. Ein kurzes Beispiel wird später gezeigt.
Veranschlagte Zeit
30 Minuten
xUnit-Testprojekt
dotnet new lambda.EmptyFunction -n FunctionWithTestProject
cd FunctionWithTestProject/test/FunctionWithTestProject.Tests
Öffnen Sie die Datei FunctionWithTestProject.Tests.csproj. Sie sehen eine Projektreferenz auf das Projekt der Lambda-Funktion.
<ProjectReference Include="..\..\src\FunctionWithTestProject\FunctionWithTestProject.csproj" />
Führen Sie die Tests von der Befehlszeile aus mit:
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)
Gehen Sie in Visual Studio zum Testmenü und wählen Sie „Run All Tests“ (Alle Tests ausführen) aus. Dadurch wird auch der Test Explorer geöffnet, in dem Sie die Ergebnisse der Tests sehen können.
Wenn Sie den Code in der Funktion ändern, aktualisieren Sie den Test wie bei einem normalen Testprojekt. Da dies ein Testprojekt ist wie jedes andere, das Sie schreiben, können Sie dieselben Bibliotheken als Hilfe verwenden, z. B. moq.
Das AWS .NET Mock Lambda Test Tool
Wie oben erwähnt, ist das Tool bereits enthalten, wenn Sie das AWS Toolkit in Visual Studio verwenden.
Sie können das Tool mit Visual Studio, VS Code, Rider oder von der Befehlszeile aus verwenden.
Die Befehlszeile ermöglicht die Ausführung in zwei Modi:
1. Mit einer webbrowserbasierten Benutzeroberfläche
2. Ohne Benutzeroberfläche
In den nächsten Schritten wird gezeigt, wie Sie das Tool von der Befehlszeile aus verwenden. Sie können jedoch gerne zum Abschnitt über Visual Studio überspringen, wenn Sie dies bevorzugen.
Das Tool installieren
Führen Sie in der Befehlszeile Folgendes aus:
dotnet tool install -g Amazon.Lambda.TestTool-6.0
dotnet tool update -g Amazon.Lambda.TestTool-6.0
Befehlszeilentest
Um den Test von der Befehlszeile aus auszuführen, müssen Sie die Option --no-ui angeben und eine Nutzlast übergeben. Das Escaping der Nutzlast hängt von der verwendeten Shell ab. Die folgenden Anweisungen funktionieren für PowerShell.
Führen Sie in der Befehlszeile Folgendes aus:
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
Testen der Web-Benutzeroberfläche, über die Befehlszeile gestartet
Sie können das Tool auch von der Befehlszeile aus verwenden, um eine Web-UI zum Testen zu starten.
In der Benutzeroberfläche können Sie Ihre eigene Nutzlast eingeben, aber in diesem Fall müssen Sie sich aber keine Gedanken um Escaping machen. Oder Sie können aus einer Reihe von Beispielnutzlasten für Anfragen auswählen. Mit diesen können Sie die Anfragen von anderen AWS-Services wie S3, Kinesis, SQS usw. simulieren.
Geben Sie jedoch vorerst „hello“ (einschließlich der Anführungszeichen) als Nutzlast ein und drücken Sie die Schaltfläche „Execute Function“ (Funktion ausführen).
Im Antwortbereich sehen Sie, was die Funktion zurückgegeben hat.
Visual Studio
Öffnen Sie das Projekt FunctionWithTestProject/src/FunctionWithTestProject in Visual Studio.
Visual Studio erstellt ein Eigenschaftenverzeichnis und innerhalb dieses Verzeichnisses eine launchsettings.json-Datei, die das AWS.NET Mock Lambda Test Tool mit Ihrem Code verbindet.
Die Datei wird ungefähr so aussehen -
{
"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
Folgen Sie den Anweisungen hier, um das AWS.NET Mock Lambda Test Tool in VS Code zu verwenden: https://github.com/aws/aws-lambda-dotnet/tree/master/Tools/LambdaTestTool#configure-for-visual-studio-code
Hinweis:
1. Sie sollten dotnet-lambda-test-tool-3.1 in dotnet-lambda-test-tool-6.0 ändern.
2. Wenn Sie Linux/Mac verwenden, hat dotnet-lambda-test-tool-6.0 keine EXE-Erweiterung.
Rider
Container und Runtime Interface Emulator
Wenn Sie Lambda-Funktionen in Containern bereitstellen, können Sie mit dem AWS Runtime Interface Emulator (RIE) eine weitere Ebene lokaler Tests durchführen. Sie müssen keine neuen Tools installieren, die Tools werden automatisch in den Container gepackt, den Sie bauen.
In diesem Beispiel schreiben Sie eine serverlose Anwendung mit zwei Funktions-Handlern.
Erstellen Sie ein neues containerbasiertes Projekt mit:
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\
Stellen Sie sicher, dass Docker läuft, und erstellen Sie dann den Container:
docker build -t testing_function_with_rie:latest .
docker run -it -p 9000:8080 testing_function_with_rie:latest TestingFunctionWithRIE::TestingFunctionWithRIE.Functions::Get
Wenn Sie mehr als einen Funktions-Handler in Ihrem Code haben, testen Sie jeden der Reihe nach, indem Sie den Container starten und jedes Mal den entsprechenden Funktions-Handler übergeben.
Stellen Sie abschließend eine HTTP-Anfrage an den Runtime Interface Emulator. Sie können Fiddler, Postman, Insomnia usw. verwenden. Unten finden Sie die Anfrage zur Verwendung mit dem VS Code Rest Client oder Rider Http Client:
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
Ihre Lambda-Funktion in AWS testen
Die oben genannten Tools eignen sich hervorragend, um Ihre Lambda-Funktion lokal zu testen, und obwohl es Tools gibt, die Sie bei simulierten AWS-Umgebungen unterstützen, testen Sie Ihre Funktion am besten im AWS-Lambda-Service.
AWS verfügt über ein großzügiges, stets kostenloses Kontingent, mit dem Sie eine Million Lambda-Anfragen pro Monat kostenlos ausführen können. Wenn Sie dieses Limit überschreiten, kosten die nächsten 1 Million Ausführungen 0,20 USD oder 0,0000002 USD pro Ausführung. Bei der Preisgestaltung gibt es einige Vorbehalte, die mit der Speichernutzung und der Laufzeit zu tun haben. Weitere Informationen finden Sie unter: Erste Schritte mit dem kostenlosen AWS-Kontingent und AWS-Lambda-Preise.
Die Emulator-Tools sind zwar großartig, wenn Sie keine Internetverbindung haben, aber Sie stellen möglicherweise fest, dass sie sich nicht genau so verhalten wie die echten AWS-Services. Wenn Sie Ihre Lambda-Funktionen in AWS testen, wird es bei der Bereitstellung Ihres Codes keine Überraschungen geben.
Alles was Sie tun müssen, ist ein .NET-Testprojekt zu erstellen; die xUnit-Vorlage ist eine gute Wahl. Schreiben Sie von dort aus Funktionstests, die auf die Lambda-Funktionen abzielen, die Sie in AWS bereitstellen.
dotnet new xunit -n LambdaTestProject
Eine Anleitung zum Testen von in AWS bereitgestellten .NET-Lambda-Funktionen finden Sie im Blogbeitrag Entwickeln von AWS-Lambda-Funktionen in .NET Core.
Debugging
Möglicherweise möchten Sie Ihre Lambda-Funktion von Zeit zu Zeit lokal debuggen. Es gibt zwei einfache Möglichkeiten, dies zu tun:
1. Einen Breakpoint in das Modultest-Projekt setzen und dann in die Funktion einsteigen.
2. Starten Sie das AWS.NET Mock Lambda Test Tool in Ihrer IDE, fügen Sie einen Breakpoint in Ihre Funktion ein und führen Sie die Funktion über das Testtool aus.
Das Modultest-Projekt verwenden
Öffnen Sie das Testprojekt und fügen Sie direkt an der Stelle, an der die Lambda-Funktion aufgerufen wird, einen Breakpoint in den Code ein.
Debuggen Sie den Test. Wenn Sie den Breakpoint erreicht haben, wechseln Sie zur Lambda-Funktion.
Das AWS .NET Mock Lambda Test Tool verwenden
Öffnen Sie in Visual Studio das Funktionsprojekt, nicht das Testprojekt.
Setzen Sie einen Breakpoint in den Funktions-Handler. Fügen Sie in der Weboberfläche Ihre Funktionseingabe hinzu und klicken Sie auf „Execute“ (Ausführen).
Ihr Breakpoint wird erreicht und Sie können Ihre Lambda-Funktion wie jede andere Methode debuggen.
Zusammenfassung
Wenn Sie sich an das Schreiben von Lambda-Funktionen gewöhnen, wechseln Sie möglicherweise zwischen den verschiedenen Testmethoden Ihrer Funktionen. Es wird jedoch dringend empfohlen, den echten AWS-Lambda-Service so schnell wie möglich zu verwenden, um Ihren Code zu testen. Er ist der beste Ort dafür.
Sie haben auch gesehen, wie Sie eine Funktion lokal debuggen und den Code schrittweise durchgehen und sehen können, was passiert.
Wissensabfrage
1. Mit welchen IDEs können Sie Modultests zu Lambda-Funktionen ausführen? (Wählen Sie eine Antwort aus)
b. VS-Code
c. Rider
d. Alle der oben Genannten
2. Was können Sie mit dem AWS.NET Mock Lambda Test Tool tun? (Wählen Sie eine Antwort aus)
b. AWS-Services simulieren, die Ihre Lambda-Funktion aufrufen soll
c. Leistungstests für Ihre Lambda-Funktionen durchführen
d. Ihren Funktionscode lokal aufrufen
3. Für welche Art von Lambda-Funktion ist der Runtime Interface Emulator geeignet? (Wählen Sie eine Antwort aus)
b. Container-basierte Lambda-Funktionen
c. Benutzerdefinierte Lambda-Funktionen zur Laufzeit
d. Alle Arten von Lambda-Funktionen
Antworten: 1-d, 2-d, 3-b
Zusammenfassung
Wenn Sie sich an das Schreiben von Lambda-Funktionen gewöhnen, wechseln Sie möglicherweise zwischen den verschiedenen Testmethoden Ihrer Funktionen. Es wird jedoch dringend empfohlen, den echten AWS-Lambda-Service so schnell wie möglich zu verwenden, um Ihren Code zu testen. Er ist der beste Ort dafür.
Sie haben auch gesehen, wie Sie eine Funktion lokal debuggen und den Code schrittweise durchgehen und sehen können, was passiert.