Module 5 : Tests unitaires et débogage
MODULE D'APPRENTISSAGE
Veuillez noter que vous pouvez suivre les exemples présentés ici, mais ce n'est pas obligatoire.
Il existe différentes manières de tester une fonction Lambda. Le plus simple est d'utiliser et de développer les tests unitaires fournis dans les modèles du projet AWS Lambda. Un lanceur de test familier dans un IDE, ou un simple test dotnet, est tout ce dont vous avez besoin pour exécuter les tests.
Une autre option consiste à utiliser l'outil de test AWS .NET Mock Lambda. Il est actuellement disponible en aperçu. Cela vous permet à la fois de tester et de déboguer vos fonctions Lambda. L'outil est inclus dans le AWS Toolkit pour Visual Studio. Mais vous pouvez le télécharger pour l'utiliser en ligne de commande, avec VS Code et Rider.
Si vous développez des fonctions Lambda qui sont déployées dans des conteneurs, l'émulateur d'interface d'exécution vous permettra de tester vos fonctions exécutées dans le conteneur.
Il existe des outils tiers tels que localstack que vous pouvez utiliser pour tester vos fonctions localement, mais le meilleur moyen d'effectuer des tests fonctionnels est de déployer vos fonctions Lambda sur AWS et de les tester là-bas. AWS fournit à tous les comptes 1 million de requêtes gratuites par mois, soit jusqu'à 3,2 millions de secondes de temps de calcul par mois. Il n'y a donc aucune raison de ne pas tester vos fonctions sur le cloud AWS.
Consultez ces deux pages pour plus d'informations sur la tarification. Démarrez avec l'offre gratuite d'AWS, la tarification AWS Lambda.
Avec ces outils de test locaux, il est également facile d'effectuer un certain débogage. Un bref exemple sera présenté ultérieurement.
Durée
30 minutes
Projet de test xUnit
dotnet new lambda.EmptyFunction -n FunctionWithTestProject
cd FunctionWithTestProject/test/FunctionWithTestProject.Tests
Ouvrez le fichier FunctionWithTestProject.tests.csproj, vous verrez une référence au projet de fonction Lambda.
<ProjectReference Include="..\..\src\FunctionWithTestProject\FunctionWithTestProject.csproj" />
À partir de la ligne de commande, exécutez les tests à l'aide de :
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)
Dans Visual Studio, accédez au menu Test et sélectionnez Exécuter tous les tests. Cela ouvrira également l'Explorateur de tests, où vous pourrez voir les résultats des tests.
Lorsque vous modifiez le code de la fonction, vous mettez à jour le test comme vous le feriez avec un projet de test normal. Comme il s'agit d'un projet de test comme tous les autres que vous écrivez, vous pouvez utiliser les mêmes bibliothèques pour vous aider, telles que moq.
L'outil de test AWS .NET Mock Lambda
Comme indiqué ci-dessus, si vous utilisez le kit d'outils AWS dans Visual Studio, l'outil est déjà inclus.
Vous pouvez utiliser l'outil depuis Visual Studio, VS Code, Rider ou depuis la ligne de commande.
La ligne de commande vous permet de l'exécuter selon deux modes :
1. Avec une interface utilisateur basée sur un navigateur Web
2. Sans interface utilisateur
Les étapes suivantes montrent comment utiliser l'outil à partir de la ligne de commande, mais n'hésitez pas à passer directement à la section sur Visual Studio si vous préférez.
Installation de l'outil
À partir de la ligne de commande, exécutez :
dotnet tool install -g Amazon.Lambda.TestTool-6.0
dotnet tool update -g Amazon.Lambda.TestTool-6.0
Tests en ligne de commande
Pour exécuter le test depuis la ligne de commande, vous devez spécifier l'option --no-ui et transmettre une charge utile. La sortie de la charge utile varie en fonction du shell que vous utilisez. Ce qui suit fonctionne pour PowerShell.
À partir de la ligne de commande, exécutez :
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 de l'interface utilisateur Web, lancé à partir de la ligne de commande
Vous pouvez également utiliser l'outil à partir de la ligne de commande pour lancer une interface utilisateur Web à des fins de test.
Dans l'interface utilisateur, vous pouvez saisir votre propre charge utile, mais vous n'aurez pas à vous soucier de la sortie dans ce cas. Vous pouvez également choisir parmi un ensemble d'exemples de charges utiles de requêtes. Ils vous permettent de simuler les demandes provenant d'autres services AWS, tels que S3, Kinesis, SQS, etc.
Mais pour l'instant, entrez «hello» (avec les guillemets) comme charge utile et appuyez sur le bouton Execute Function.
Dans la section des réponses, vous verrez ce que la fonction a renvoyé.
Visual Studio
Ouvrez le projet FunctionWithTestProject/src/FunctionWithTestProject dans Visual Studio.
Visual Studio créera un répertoire Propriétés et, à l'intérieur de ce répertoire, un fichier launchsettings.json qui connecte l'outil de test AWS .NET Mock Lambda à votre code.
Le fichier doit ressembler à ceci :
{
"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"
}
}
}
Code VS
Pour utiliser l'outil de test AWS .NET Mock Lambda dans VS Code, suivez les instructions ici : https://github.com/aws/aws-lambda-dotnet/tree/master/Tools/LambdaTestTool#configure-for-visual-studio-code
Remarque :
1. Vous devez remplacer dotnet-lambda-test-tool-3.1 par dotnet-lambda-test-tool-6.0.
2. Si vous utilisez Linux/Mac, dotnet-lambda-test-tool-6.0 n'aura pas d'extension .exe.
Rider
Émulateur de conteneurs et d'interface d'exécution
Si vous déployez des fonctions Lambda dans des conteneurs, vous pouvez effectuer une autre couche de tests locaux à l'aide de l'émulateur d'interface d'exécution AWS (RIE). Vous n'avez pas besoin d'installer de nouvel outillage, l'outillage sera automatiquement emballé dans le conteneur que vous construisez.
Dans cet exemple, vous allez écrire une application sans serveur qui aura deux gestionnaires de fonctions.
Créez un nouveau projet basé sur des conteneurs à l'aide de :
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\
Assurez-vous que Docker est en cours d'exécution, puis créez le conteneur :
docker build -t testing_function_with_rie:latest .
docker run -it -p 9000:8080 testing_function_with_rie:latest TestingFunctionWithRIE::TestingFunctionWithRIE.Functions::Get
Si vous avez plusieurs gestionnaires de fonctions dans votre code, vous devez les tester à tour de rôle, en démarrant le conteneur et en transmettant à chaque fois le gestionnaire de fonctions approprié.
Enfin, envoyez une requête HTTP à l'émulateur d'interface d'exécution. Vous pouvez utiliser Fiddler, Postman, Insomnia, etc. Vous trouverez ci-dessous la demande à utiliser avec VS Code Rest Client ou 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
Tester votre fonction Lambda sur AWS
Les outils ci-dessus sont parfaits pour tester votre fonction Lambda localement, et même s'il existe des outils pour vous aider à simuler des environnements AWS, le meilleur moyen de tester votre fonction est d'utiliser le service AWS Lambda.
AWS propose une offre généreuse, toujours gratuite, qui vous permet d'exécuter gratuitement un million de requêtes Lambda par mois. Si vous dépassez cette limite, le million d'exécutions suivantes coûtera 0,20 dollar, soit 0,0000002 dollar par exécution. Il existe quelques réserves concernant la tarification en fonction de l'utilisation de la mémoire et de la durée de fonctionnement. Consultez – Commencez avec l'offre gratuite d'AWS et la tarification d'AWS Lambda pour plus d'informations.
Bien que les outils d'émulation puissent être intéressants si vous ne disposez pas d'une connexion Internet, vous constaterez peut-être qu'ils ne se comportent pas exactement de la même manière que les vrais services AWS. En testant vos fonctions Lambda dans AWS, vous n'aurez aucune surprise au moment de déployer votre code.
Tout ce que vous avez à faire est de créer un projet de test .NET, le modèle xUnit est un bon choix. À partir de là, rédigez des tests fonctionnels ciblant les fonctions Lambda que vous déployez sur AWS.
dotnet new xunit -n LambdaTestProject
Pour une présentation détaillée des tests des fonctions .NET Lambda déployées sur AWS, consultez l'article de blog Développement .NET Core des fonctions AWS Lambda.
Débogage
Il se peut que vous souhaitiez déboguer votre fonction Lambda localement de temps à autre. Il existe deux manières simples de le faire :
1. Mettre un point d'arrêt dans le projet de test unitaire, puis entrer dans la fonction.
2. Démarrez l'outil de test AWS .NET Mock Lambda depuis votre IDE, placez un point d'arrêt dans votre fonction et exécutez la fonction à partir de l'outil de test.
Utilisation du projet de test unitaire
Ouvrez le projet de test et insérez un point d'arrêt dans le code juste à l'endroit où il appelle la fonction Lambda.
Déboguez le test. Lorsque vous atteignez le point d'arrêt, entrez dans la fonction Lambda.
Utilisation de l'outil de test AWS .NET Mock Lambda
Dans Visual Studio, ouvrez le projet de fonction, pas le projet de test.
Placez un point d'arrêt dans le gestionnaire de fonctions. Dans l'interface utilisateur Web, ajoutez votre entrée de fonction et appuyez sur Exécuter.
Votre point d'arrêt sera atteint et vous pourrez déboguer votre fonction Lambda comme n'importe quelle autre méthode.
Conclusion
Au fur et à mesure que vous vous habituerez à écrire des fonctions Lambda, vous pourrez passer d'une méthode à l'autre pour tester vos fonctions, mais nous vous encourageons vivement à utiliser le véritable service AWS Lambda dès que possible pour tester votre code. C'est le meilleur endroit pour le faire.
Vous avez également vu comment déboguer une fonction localement, ce qui vous permet de parcourir le code et de voir ce qui se passe.
Évaluation des connaissances préalables
1. Quels IDE vous permettent d'exécuter des tests unitaires de fonctions Lambda ? (sélectionnez une option)
b. Code VS
c. Rider
d. Tout ce qui précède
2. Que vous permet de faire l'outil de test AWS .NET Mock Lambda ? (sélectionnez une option)
b. Services AWS simulés à appeler par votre fonction Lambda
c. Exécuter des tests de performance sur vos fonctions Lambda
d. Invoquer le code de votre fonction localement
3. À quel type de fonction Lambda l'émulateur d'interface d'exécution est-il adapté ? (sélectionnez une option)
b. Fonctions Lambda basées sur des conteneurs
c. Fonctions Lambda d'exécution personnalisées
d. Tous les types de fonctions Lambda
Réponses : 1-d, 2-d, 3-b
Conclusion
Au fur et à mesure que vous vous habituerez à écrire des fonctions Lambda, vous pourrez passer d'une méthode à l'autre pour tester vos fonctions, mais nous vous encourageons vivement à utiliser le véritable service AWS Lambda dès que possible pour tester votre code. C'est le meilleur endroit pour le faire.
Vous avez également vu comment déboguer une fonction localement, ce qui vous permet de parcourir le code et de voir ce qui se passe.