.NET-Workloads in AWS Lambda

MODUL 5

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

Viele Projektvorlagen für. NET-Lambda-Funktionen enthalten ein xUnit-Testprojekt. Ohne eine einzige Änderung können Sie den Test in diesem Projekt erfolgreich ausführen.
Erstellen Sie eine neue Lambda-Funktion mit:
dotnet new lambda.EmptyFunction -n FunctionWithTestProject
Wechseln Sie in das Verzeichnis FunctionWithTestProject/test/FunctionWithTestProject.Tests:
cd FunctionWithTestProject/test/FunctionWithTestProject.Tests
Öffnen Sie das Projekt in Ihrer IDE.

Ö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
Sie werden eine Ausgabe sehen, die wie folgt aussieht -
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)
Sie können das Testprojekt natürlich in Visual Studio, VS Code oder Rider öffnen und die Tests von dort aus ausführen.

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.
Gehen Sie in Rider zum Testmenü und wählen Sie „Run All Tests from Solution“ (Alle Tests aus der Lösung ausführen) aus. Dadurch werden Tests ausgeführt und das Modultest-Fenster geöffnet, in dem Sie die Ergebnisse sehen können.
Für VS Code können Sie problemlos einzelne Tests oder alle Tests in einer Datei ausführen
Wenn sich Ihre Tests jedoch in mehreren Dateien befinden, benötigen Sie eine Test-Runner-Erweiterung. Weitere Informationen zur Konfiguration und Ausführung von Tests finden Sie in der Dokumentation der Erweiterung.

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

Mit diesem Tool können Sie Ihre Lambda-Funktionen lokal mit einer von Ihnen definierten Nutzlast aufrufen und die Antwort untersuchen.

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ür die Befehlszeile, VS Code und Rider müssen Sie das Tool installieren.

Führen Sie in der Befehlszeile Folgendes aus:
dotnet tool install -g Amazon.Lambda.TestTool-6.0
Wenn Sie es bereits installiert haben, aktualisieren Sie es mit:
dotnet tool update -g Amazon.Lambda.TestTool-6.0

Befehlszeilentest

Navigieren Sie mithilfe des obigen Beispielprojekts von der Befehlszeile aus zum Verzeichnis FunctionWithTestProject/src/FunctionWithTestProject.

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\"'
Für Bash verwenden Sie:
dotnet lambda-test-tool-6.0 --no-ui --payload '"hello"'
Sie sollten eine Ausgabe sehen, die wie folgt aussieht -
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 
Im Antwortbereich sehen Sie die Ausgabe der Lambda-Funktion.

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.

Wenn Sie Ihrer Funktion Protokollanweisungen hinzugefügt hätten, würden Sie sie im Abschnitt „Log Output“ (Protokollausgabe) sehen.

Visual Studio

Wenn Sie das AWS Toolkit für Visual Studio installiert haben, haben Sie das AWS.NET Mock Lambda Test Tool bereits.

Ö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"
    }
  }
}
Starten Sie die Anwendung, indem Sie F5 drücken. Die gleiche Seite, die Sie oben gesehen haben, wird geöffnet. Geben Sie Ihre Nutzlast ein und klicken Sie auf die Schaltfläche „Execute Function“ (Funktion ausführen).

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

Um das AWS.NET Mock Lambda Test Tool für Rider zu konfigurieren, folgen Sie den Anweisungen
hier -

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
Das Projekt enthält eine Dockerfile. Öffnen Sie diese, um zu sehen, dass Docker die Dateien aus dem Verzeichnis bin/release/lambda-publish in den Docker-Container kopiert:
COPY "bin/Release/lambda-publish"  .
Öffnen Sie die Datei Function.cs und ersetzen Sie die Methode Get(..) durch Folgendes:
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;
}
Wechseln Sie in das Verzeichnis TestingFunctionWithRIE/src/TestingFunctionWithRIE:
cd TestingFunctionWithRIE/src/TestingFunctionWithRIE 
Führen Sie Folgendes aus:
dotnet build -c Release -o .\bin\Release\lambda-publish\ 
Dadurch wird die Anwendung erstellt und die Binärdateien werden in dem . Verzeichnis .\bin\Release\lambda-publish platziert.

Stellen Sie sicher, dass Docker läuft, und erstellen Sie dann den Container:
docker build -t testing_function_with_rie:latest .
Wenn dieser Vorgang abgeschlossen ist, ist es Zeit, den Container zu starten:
docker run -it -p 9000:8080 testing_function_with_rie:latest TestingFunctionWithRIE::TestingFunctionWithRIE.Functions::Get
Dieser Befehl startet den Docker-Container und macht den internen Port 8080 über Port 9000 auf Ihrem Computer verfügbar. Außerdem wird der Funktions-Handler als Parameter übergeben. Der Runtime Interface Emulator führt anhand dessen die entsprechende Methode in Ihrer Anwendung aus.

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"
    }
}
Sie erhalten eine Antwort wie die folgende:
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
}
Wenn Sie den Code ändern und erneut testen möchten, verwenden Sie Folgendes. Es kombiniert den .NET-Build und den Container-Build und startet den Container in einer Zeile:
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

Das gleiche Prinzip gilt für die Verwendung von Visual Studio, VS Code und Rider.

Ö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.
Sie befinden sich jetzt im Code Ihrer Lambda-Funktion!


Das AWS .NET Mock Lambda Test Tool verwenden

Dies funktioniert auch von allen drei IDES aus. Wenn Sie VS Code oder Rider verwenden, finden Sie Anweisungen weiter oben.

Ö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

In diesem Modul haben Sie eine Vielzahl von Möglichkeiten gesehen, Ihre Lambda-Funktionen sowohl von der Befehlszeile als auch von IDEs aus zu testen und zu debuggen.

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

Sie haben jetzt Modul 5, Modultests und Debugging, abgeschlossen. Mit dem folgenden Test können Sie überprüfen, was Sie bisher gelernt haben.

1. Mit welchen IDEs können Sie Modultests zu Lambda-Funktionen ausführen? (Wählen Sie eine Antwort aus)

a. Visual Studio

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)

a. .NET-Abhängigkeiten für Ihre Tests simulieren

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)

a. Verwaltete Lambda-Funktionen zur Laufzeit

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

In diesem Modul haben Sie eine Vielzahl von Möglichkeiten gesehen, Ihre Lambda-Funktionen sowohl von der Befehlszeile als auch von IDEs aus zu testen und zu debuggen.

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.

War diese Seite hilfreich?

PRAKTISCHE ÜBUNG: LAMBDA-FUNKTIONEN ERSTELLEN UND BEREITSTELLEN