Charges de travail .NET sur AWS Lambda

MODULE 5

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

De nombreux modèles de projets de fonctions .NET Lambda incluent un projet de test xUnit. Sans aucune modification, vous pouvez exécuter le test dans ce projet, et il fonctionnera.
Créez une nouvelle fonction Lambda à l'aide de :
dotnet new lambda.EmptyFunction -n FunctionWithTestProject
Accédez au répertoire FunctionWithTestProject/test/FunctionWithTestProject.tests :
cd FunctionWithTestProject/test/FunctionWithTestProject.Tests
Ouvrez ce projet dans votre IDE.

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
Vous verrez une sortie qui ressemble à –
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)
Vous pouvez bien entendu ouvrir le projet de test dans Visual Studio, VS Code ou Rider et exécuter les tests à partir de là.

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.
Dans Rider, accédez au menu Test et sélectionnez Exécuter tous les tests à partir de la solution. Cela exécutera des tests et ouvrira la fenêtre de test unitaire dans laquelle vous verrez les résultats.
Pour VS Code, vous pouvez facilement exécuter des tests individuels ou tous les tests d'un fichier
Mais si vos tests se trouvent dans plusieurs fichiers, vous aurez besoin d'une extension de lanceur de test. Consultez la documentation de l'extension pour plus d'informations sur la configuration et le lancement de 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

Cet outil vous permet d'invoquer vos fonctions Lambda localement avec une charge utile que vous définissez et examinez la réponse.

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

Pour la ligne de commande, VS Code et Rider, vous devez installer l'outil.

À partir de la ligne de commande, exécutez :
dotnet tool install -g Amazon.Lambda.TestTool-6.0
Si vous l'avez déjà installé, mettez-le à jour à l'aide de :
dotnet tool update -g Amazon.Lambda.TestTool-6.0

Tests en ligne de commande

À l'aide de l'exemple de projet ci-dessus, à partir de la ligne de commande, accédez au répertoire FunctionWithTestProject/src/FunctionWithTestProject.

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\"'
Pour une utilisation en bash :
dotnet lambda-test-tool-6.0 --no-ui --payload '"hello"'
Vous devriez voir une sortie qui ressemble à -
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 
Dans la section des réponses, vous pouvez voir le résultat de la fonction Lambda.

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é.

Si vous ajoutiez des instructions de journal à votre fonction, vous les verrez dans la section Sortie du journal.

Visual Studio

Si vous avez installé le kit d'outils AWS pour Visual Studio, vous disposez déjà de l'outil de test AWS .NET Mock Lambda.

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"
    }
  }
}
Démarrez l'application en appuyant sur F5. La même page que celle que vous avez vue ci-dessus s'ouvre, entrez votre charge utile et appuyez sur le bouton Exécuter la fonction.

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

Pour configurer l'outil de test AWS .NET Mock Lambda pour Rider, suivez les instructions
ici –

É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
Le projet contient un Dockerfile. Ouvrez ceci et vous verrez que Docker copie les fichiers du répertoire bin/release/Lambda-publish vers le conteneur Docker :
COPY "bin/Release/lambda-publish"  .
Ouvrez le fichier Function.cs et remplacez la méthode Get(..) par la suivante :
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;
}
Accédez au répertoire TestingFunctionWithRIE/src/TestingFunctionWithRIE :
cd TestingFunctionWithRIE/src/TestingFunctionWithRIE 
Exécutez la requête suivante :
dotnet build -c Release -o .\bin\Release\lambda-publish\ 
Cela permettra de créer l'application et de placer les fichiers binaires dans le répertoire .\bin\Release\lambda-publish directory.

Assurez-vous que Docker est en cours d'exécution, puis créez le conteneur :
docker build -t testing_function_with_rie:latest .
Une fois terminé, il est temps de démarrer le conteneur :
docker run -it -p 9000:8080 testing_function_with_rie:latest TestingFunctionWithRIE::TestingFunctionWithRIE.Functions::Get
Cette commande démarre le conteneur Docker et expose le port interne 8080 via le port 9000 de votre ordinateur, et elle transmet le gestionnaire de fonctions en tant que paramètre. L'émulateur d'interface d'exécution l'utilise pour exécuter la méthode appropriée dans votre application.

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"
    }
}
Vous verrez une réponse comme celle-ci :
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
}
Si vous souhaitez modifier le code et le tester à nouveau, utilisez ce qui suit. Il combine la version .NET et la construction du conteneur et démarre le conteneur sur une seule ligne :
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

Le même principe s'applique lors de l'utilisation de Visual Studio, VS Code et Rider.

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.
Vous allez maintenant accéder au code de votre fonction Lambda !


Utilisation de l'outil de test AWS .NET Mock Lambda

Cela fonctionne également à partir des trois IDE, voir ci-dessus pour les instructions si vous utilisez VS Code ou Rider.

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

Dans ce module, vous avez découvert différentes manières de tester et de déboguer vos fonctions Lambda à partir de la ligne de commande et des IDE.

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

Vous avez maintenant terminé le module 5, Tests unitaires et débogage. Le test suivant vous permettra de vérifier ce que vous avez appris jusqu'à présent.

1. Quels IDE vous permettent d'exécuter des tests unitaires de fonctions Lambda ? (sélectionnez une option)

a. Visual Studio

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)

a. Simuler les dépendances .NET pour vos tests

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)

a. Fonctions Lambda d'exécution gérées

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

Dans ce module, vous avez découvert différentes manières de tester et de déboguer vos fonctions Lambda à partir de la ligne de commande et des IDE.

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.

Cette page vous a-t-elle été utile ?

ATELIER PRATIQUE : CRÉATION ET DÉPLOIEMENT DE FONCTIONS LAMBDA