Modulo 5: test di unità e debug
MODULO DI APPRENDIMENTO
Tieni presente che puoi seguire gli esempi presentati qui, ma non è obbligatorio.
Esistono diversi modi per testare una funzione Lambda. La soluzione più semplice consiste nell'utilizzare e sviluppare i test di unità forniti nei modelli di progetti AWS Lambda. Per eseguire i test è sufficiente un test runner familiare in un IDE o il semplice test dotnet.
Un'altra opzione consiste nell'utilizzare lo strumento di test AWS .NET Mock Lambda. Al momento è in anteprima. Ciò consente sia di testare che di eseguire il debug delle funzioni Lambda. Lo strumento è incluso nel kit di strumenti AWS per Visual Studio. Tuttavia, è possibile scaricarlo per utilizzarlo con la linea di comando, VS Code e Rider.
Se sviluppi funzioni Lambda distribuite in container, l'emulatore di interfaccia di runtime ti consentirà di testare le funzioni in esecuzione all'interno del container.
Esistono strumenti di terze parti come localstack che puoi usare per testare le funzioni in locale, ma il modo migliore per eseguire test funzionali è distribuire le funzioni Lambda su AWS e testarle lì. AWS offre a tutti gli account 1 milione di richieste gratuite al mese e fino a 3,2 milioni di secondi di tempo di elaborazione al mese. Quindi ci sono pochissime ragioni per non testare le funzioni sul cloud AWS.
Consulta queste due pagine per ulteriori informazioni sui prezzi: Informazioni di base sul Piano gratuito AWS e Prezzi di AWS Lambda.
Con questi strumenti di test locali è facile eseguire anche alcune operazioni di debug. Un breve esempio verrà mostrato più avanti.
Tempo richiesto per il completamento
30 minuti
Progetto di test xUnit
dotnet new lambda.EmptyFunction -n FunctionWithTestProject
cd FunctionWithTestProject/test/FunctionWithTestProject.Tests
Apri il file FunctionWithTestProject.Tests.csproj e vedrai un riferimento al progetto della funzione Lambda.
<ProjectReference Include="..\..\src\FunctionWithTestProject\FunctionWithTestProject.csproj" />
Dalla linea di comando, esegui i test utilizzando:
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)
In Visual Studio, vai al menu Test e seleziona Run All Tests (Esegui tutti i test). Si aprirà anche Test Explorer (Esplora test), dove vedrai i risultati dei test.
Quando si modifica il codice nella funzione, si aggiorna il test come si farebbe con un normale progetto di test. Poiché questo è un progetto di test come qualsiasi altro che scrivi, puoi usare le stesse librerie per aiutarti, come moq.
Lo strumento di test AWS .NET Mock Lambda
Come accennato in precedenza, se utilizzi il kit di strumenti AWS in Visual Studio, lo strumento è già incluso.
Puoi utilizzare lo strumento con Visual Studio, VS Code, Rider o dalla linea di comando.
La linea di comando consente di eseguirlo in due modalità:
1. Con un'interfaccia utente basata su browser Web
2. Senza interfaccia utente
I passaggi successivi mostrano come utilizzare lo strumento dalla linea di comando; tuttavia, se preferisci puoi passare direttamente alla sezione su Visual Studio.
Installazione dello strumento
Dalla linea di comando esegui:
dotnet tool install -g Amazon.Lambda.TestTool-6.0
dotnet tool update -g Amazon.Lambda.TestTool-6.0
Test dalla linea di comando
Per eseguire il test dalla linea di comando, è necessario specificare l'opzione --no-ui e passare un payload. L'escape del payload varia a seconda della shell (interprete di comandi) utilizzata. La procedura riportata di seguito funziona per PowerShell.
Dalla linea di comando, esegui:
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
Test dell'interfaccia utente Web, avviato dalla linea di comando
È possibile utilizzare lo strumento anche dalla linea di comando per avviare un'interfaccia utente Web da testare.
Puoi inserire il tuo payload nell'interfaccia utente, ma in questo caso non dovrai preoccuparti dell'escape. In alternativa, è possibile scegliere tra una serie di payload di richieste di esempio. Questi consentono di simulare le richieste provenienti da altri servizi AWS, come S3, Kinesis, SQS, ecc.
Per ora, inserisci "hello" (comprese le virgolette) come payload e premi il pulsante Execute Function (Esegui funzione).
Nella sezione delle risposte, vedrai cosa ha restituito la funzione.
Visual Studio
Apri il progetto FunctionWithTestProject/src/FunctionWithTestProject in Visual Studio.
Visual Studio creerà una cartella Properties (Proprietà) e al suo interno un file launchsettings.json che collega lo strumento di test AWS .NET Mock Lambda al codice.
Il file avrà un aspetto simile a questo:
{
"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
Per utilizzare lo strumento di test AWS .NET Mock Lambda in VS Code, segui le istruzioni riportate qui: https://github.com/aws/aws-lambda-dotnet/tree/master/Tools/LambdaTestTool#configure-for-visual-studio-code
Nota:
1. dovresti cambiare dotnet-lambda-test-tool-3.1 in dotnet-lambda-test-tool-6.0.
2. se utilizzi Linux/Mac dotnet-lambda-test-tool-6.0 non avrà l'estensione .exe.
Rider
Container ed emulatore di interfaccia di runtime
Se distribuisci funzioni Lambda all'interno di container, puoi eseguire un altro livello di test locali utilizzando l'emulatore di interfaccia di runtime AWS (Runtime Interface Emulator, RIE). Non è necessario installare nuovi strumenti, essi verranno automaticamente impacchettati all'interno del container che crei.
Per questo esempio, scriverai un'applicazione serverless con due gestori di funzioni.
Crea un nuovo progetto basato su container utilizzando:
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\
Assicurati che Docker sia in esecuzione e poi crea il container:
docker build -t testing_function_with_rie:latest .
docker run -it -p 9000:8080 testing_function_with_rie:latest TestingFunctionWithRIE::TestingFunctionWithRIE.Functions::Get
Se hai più di un gestore di funzioni nel tuo codice, dovresti testare ciascuno di essi a turno, avviando il container e passando ogni volta il gestore di funzioni appropriato.
Infine, invia una richiesta HTTP all'emulatore di interfaccia di runtime. Puoi usare Fiddler, Postman, Insomnia, ecc. Di seguito è riportata la richiesta da utilizzare con VS Code Rest Client o 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
Test della tua funzione Lambda su AWS
Gli strumenti di cui sopra sono ottimi per testare la funzione Lambda in locale e, anche se esistono strumenti che aiutano a simulare gli ambienti AWS, il modo migliore per testare la funzione è il servizio AWS Lambda.
AWS offre un piano generoso e sempre gratuito, che consente di eseguire gratuitamente un milione di richieste Lambda al mese e, se superi tale limite, il prossimo milione di esecuzioni costerà 0,20 USD o 0.0000002 USD per esecuzione. Ci sono alcune avvertenze sui prezzi relativi all'utilizzo della memoria e al tempo di esecuzione; consulta le pagine: Informazioni di base sul Piano gratuito AWS e Prezzi di AWS Lambda per ulteriori informazioni.
Sebbene gli strumenti di emulazione possano essere ottimi se non disponi di connettività Internet, potresti scoprire che non si comportano esattamente come i servizi AWS reali. Testare le funzioni Lambda in AWS significa non avere sorprese quando arriva il momento di distribuire il codice.
Tutto quello che devi fare è creare un progetto di test .NET; il modello xUnit è una buona scelta. Da lì, scrivi test funzionali per le funzioni Lambda che distribuisci su AWS.
dotnet new xunit -n LambdaTestProject
Per una panoramica dettagliata sui test delle funzioni Lambda .NET distribuite su AWS, consulta il post del blog Developing .NET Core AWS Lambda functions.
Debug
Di tanto in tanto potresti voler eseguire il debug della tua funzione Lambda in locale. Ci sono due semplici modi per farlo:
1. Inserendo un punto di interruzione nel progetto di test di unità e poi passando alla funzione.
2. Avviando lo strumento di test AWS .NET Mock Lambda dall'IDE, inserendo un punto di interruzione nella funzione ed eseguendo la funzione dallo strumento di test.
Utilizzo del progetto di test di unità
Apri il progetto di test e inserisci un punto di interruzione nel codice proprio nel punto in cui chiama la funzione Lambda.
Esegui il debug del test. Quando raggiungi il punto di interruzione, accedi alla funzione Lambda.
Utilizzo dello strumento di test AWS .NET Mock Lambda
In Visual Studio, apri il progetto della funzione, non il progetto di test.
Inserisci un punto di interruzione nel gestore delle funzioni. Nell'interfaccia utente Web, aggiungi l'input della funzione e premi Execute (Esegui).
Il punto di interruzione verrà raggiunto e potrai eseguire il debug della funzione Lambda come con qualsiasi altro metodo.
Conclusioni
Mano a mano che ti abitui a scrivere funzioni Lambda puoi passare da un modo all'altro per testare le funzioni, ma ti consigliamo vivamente di utilizzare il servizio AWS Lambda reale il prima possibile per testare il codice. È il posto migliore per farlo.
Hai visto inoltre come eseguire il debug di una funzione in locale, avendo modo di esaminare il codice e vedere cosa sta succedendo.
Verifica delle conoscenze
1. Quali IDE consentono di eseguire i test di unità delle funzioni Lambda? (seleziona una risposta)
b. VS Code
c. Rider
d. Tutte le opzioni sopra indicate
2. Cosa consente di fare lo strumento di test AWS .NET Mock Lambda? (seleziona una risposta)
b. Simulazione dei servizi AWS per la chiamata della funzione Lambda
c. Eseguire test delle prestazioni sulle funzioni Lambda
d. Richiamare il codice della funzione in locale
3. Per quale tipo di funzione Lambda è adatto l'emulatore di interfaccia di runtime? (seleziona una risposta)
b. Funzioni Lambda basate su container
c. Funzioni Lambda in runtime personalizzate
d. Tutti i tipi di funzioni Lambda
Risposte: 1-d, 2-d, 3-b
Conclusioni
Mano a mano che ti abitui a scrivere funzioni Lambda puoi passare da un modo all'altro per testare le funzioni, ma ti consigliamo vivamente di utilizzare il servizio AWS Lambda reale il prima possibile per testare il codice. È il posto migliore per farlo.
Hai visto inoltre come eseguire il debug di una funzione in locale, avendo modo di esaminare il codice e vedere cosa sta succedendo.