Módulo 5: Pruebas unitarias y depuración
MÓDULO DE APRENDIZAJE
Tenga en cuenta que puede seguir los ejemplos que se presentan aquí, pero no es necesario.
Hay varias formas de probar una función de Lambda. Lo más sencillo es utilizar y desarrollar las pruebas unitarias que se proporcionan en las plantillas del proyecto de AWS Lambda. Todo lo que necesita para ejecutar las pruebas es un ejecutor de pruebas conocido en un IDE o la prueba simple de dotnet.
Otra opción es utilizar la herramienta de prueba AWS .NET Mock Lambda. Se encuentra en versión preliminar en este momento. Esto le permite probar y depurar las funciones de Lambda. La herramienta se incluye como parte del Kit de herramientas de AWS para Visual Studio. Pero puede descargarla para usarla con la línea de comandos, con VS Code y Rider.
Si desarrolla funciones de Lambda que se implementan en contenedores, el emulador de interfaz de tiempo de ejecución le permitirá probar las funciones que se ejecutan dentro del contenedor.
Existen herramientas de terceros, como localstack, que puede utilizar para probar sus funciones localmente, pero la mejor manera de realizar pruebas funcionales es implementar las funciones de Lambda en AWS y realizar pruebas allí. AWS ofrece a todas las cuentas 1 millón de solicitudes gratuitas al mes; hasta 3,2 millones de segundos de tiempo de computación al mes. Por lo tanto, hay muy pocos motivos para no probar sus funciones en la nube de AWS.
Consulte estas dos páginas para obtener más información sobre los precios: Comience con el nivel gratuito de AWS, precios de AWS Lambda.
Con estas herramientas de prueba locales, también es fácil realizar algunas depuraciones. Más adelante se mostrará un breve ejemplo.
Tiempo de realización
30 minutos
Proyecto de prueba de xUnit
dotnet new lambda.EmptyFunction -n FunctionWithTestProject
cd FunctionWithTestProject/test/FunctionWithTestProject.Tests
Abra el archivo FunctionWithTestProject.Tests.csproj y verá una referencia de proyecto al proyecto de la función de Lambda.
<ProjectReference Include="..\..\src\FunctionWithTestProject\FunctionWithTestProject.csproj" />
Desde la línea de comandos, ejecute las pruebas con:
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)
En Visual Studio, vaya al menú Prueba y seleccione Ejecutar todas las pruebas. Esto también abrirá el Explorador de pruebas, donde verá los resultados de las pruebas.
Cuando cambia el código de la función, actualiza la prueba tal como lo haría con un proyecto de prueba normal. Como este es un proyecto de prueba como cualquier otro que escriba, puede usar las mismas bibliotecas como ayuda, como moq.
La herramienta de prueba AWS .NET Mock Lambda
Como se mencionó anteriormente, si utiliza el Kit de herramientas de AWS en Visual Studio, la herramienta ya está incluida.
Puede usar la herramienta desde Visual Studio, VS Code, Rider o desde la línea de comandos.
La línea de comandos permite ejecutar en dos modos:
1. Con una interfaz de usuario basada en un navegador web
2. Sin interfaz de usuario
En los pasos siguientes se muestra cómo usar la herramienta desde la línea de comandos, pero no dude en pasar a la sección de Visual Studio si así lo prefiere.
Instalación de la herramienta
Desde la línea de comandos, ejecute:
dotnet tool install -g Amazon.Lambda.TestTool-6.0
dotnet tool update -g Amazon.Lambda.TestTool-6.0
Pruebas de la línea de comandos
Para ejecutar la prueba desde la línea de comandos, debe especificar la opción --no-ui y pasar una carga útil. El escape de la carga útil variará según el shell que utilice. Lo siguiente funciona para PowerShell.
Desde la línea de comandos, ejecute:
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
Pruebas de interfaz de usuario web, iniciadas desde la línea de comandos
También puede utilizar la herramienta desde la línea de comandos para lanzar una interfaz de usuario web para realizar pruebas.
En la interfaz de usuario, puede introducir su propia carga útil, pero no tendrá que preocuparse por el escape. O bien, puede seleccionar entre un conjunto de ejemplos de cargas útiles de solicitudes. Esto le permite simular las solicitudes de otros servicios de AWS, como S3, Kinesis, SQS, etc.
Pero por ahora, introduzca “hello” (incluidas las comillas) como carga y pulse el botón Ejecutar función.
En la sección de respuestas, verá lo que devolvió la función.
Visual Studio
Abra el proyecto FunctionWithTestProject/src/FunctionWithTestProject en Visual Studio.
Visual Studio creará un directorio Properties y, dentro de ese directorio, un archivo launchsettings.json que conectará la herramienta de prueba AWS .NET Mock Lambda a su código.
El archivo tendrá un aspecto parecido a esto:
{
"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
Para utilizar la herramienta de prueba AWS .NET Mock Lambda en VS Code, siga estas instrucciones: https://github.com/aws/aws-lambda-dotnet/tree/master/Tools/LambdaTestTool#configure-for-visual-studio-code
Nota:
1. debe cambiar dotnet-lambda-test-tool-3.1 por dotnet-lambda-test-tool-6.0.
2. Si utiliza Linux/Mac, dotnet-lambda-test-tool-6.0 no tendrá una extensión .exe.
Rider
Emulador de interfaz de tiempo de ejecución y contenedores
Si implementa funciones de Lambda dentro de contenedores, puede realizar otra capa de pruebas locales con el emulador de interfaz de tiempo de ejecución (RIE) de AWS. No necesita instalar ninguna herramienta nueva; las herramientas se empaquetarán automáticamente dentro del contenedor que cree.
Para este ejemplo, va a escribir una aplicación sin servidor que tendrá dos controladores de funciones.
Cree un nuevo proyecto basado en contenedores mediante:
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\
Asegúrese de que Docker se esté ejecutando y, a continuación, cree el contenedor:
docker build -t testing_function_with_rie:latest .
docker run -it -p 9000:8080 testing_function_with_rie:latest TestingFunctionWithRIE::TestingFunctionWithRIE.Functions::Get
Si tiene más de un controlador de función en su código, probará cada uno por separado, iniciando el contenedor y pasando el controlador de función apropiado cada vez.
Por último, realice una solicitud HTTP al emulador de interfaz de tiempo de ejecución. Puede usar Fiddler, Postman, Insomnia, etc. A continuación se muestra la solicitud para usarla 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
Prueba de la función de Lambda en AWS
Las herramientas anteriores son excelentes para probar su función de Lambda localmente y, aunque existen herramientas que le ayudan con los entornos de AWS simulados, la mejor manera de probar su función es en el servicio AWS Lambda.
AWS tiene un nivel generoso, siempre gratuito, que le permite ejecutar un millón de solicitudes de Lambda al mes de forma gratuita y, si supera ese límite, el próximo millón de ejecuciones costará 0,20 USD o 0,0000002 USD por ejecución. Hay algunas advertencias en cuanto a los precios relacionadas con el uso de la memoria y el tiempo de ejecución. Consulte: Comenzar con el nivel gratuito de AWS y Precios de AWS Lambda para obtener más información.
Si bien las herramientas de emulación pueden ser excelentes si no tiene conectividad a Internet, es posible que descubra que no se comportan exactamente de la misma manera que los servicios reales de AWS. Probar las funciones de Lambda en AWS significa que no habrá sorpresas a la hora de implementar el código.
Solo tiene que crear un proyecto de prueba de .NET; la plantilla de xUnit es una buena opción. A partir de ahí, escriba pruebas funcionales dirigidas a las funciones de Lambda que implemente en AWS.
dotnet new xunit -n LambdaTestProject
Para ver un tutorial sobre cómo probar las funciones de Lambda para .NET implementadas en AWS, consulte la entrada del blog Developing .NET Core AWS Lambda functions.
Depuración
Es posible que desee depurar su función de Lambda localmente de vez en cuando. Hay dos formas sencillas de hacerlo:
1. Poner un punto de interrupción en el proyecto de prueba unitaria y, a continuación, pasar a la función.
2. Iniciar la herramienta de prueba AWS .NET Mock Lambda desde su IDE, colocar un punto de interrupción en la función y ejecutar la función desde la herramienta de prueba.
Uso del proyecto de prueba unitaria
Abra el proyecto de prueba y coloque un punto de interrupción en el código justo donde llama a la función de Lambda.
Depure la prueba. Cuando llegue al punto de interrupción, entre en la función de Lambda.
Uso de la herramienta de prueba AWS .NET Mock Lambda
En Visual Studio, abra el proyecto de función, no el proyecto de prueba.
Coloque un punto de interrupción en el controlador de la función. En la interfaz de usuario web, agregue la entrada de la función y pulse ejecutar.
Se alcanzará el punto de interrupción y podrá depurar la función de Lambda como con cualquier otro método.
Conclusión
A medida que se acostumbre a escribir funciones de Lambda, podrá cambiar de una forma a otra para probar sus funciones, pero le recomendamos ampliamente que utilice el servicio real de AWS Lambda lo antes posible para probar el código. Es el mejor lugar para hacerlo.
También aprendió a depurar una función de forma local, lo que le permite revisar el código y ver qué está sucediendo.
Pruebas de conocimientos
1. ¿Qué IDE le permiten ejecutar pruebas unitarias de funciones de Lambda? (seleccione uno)
b. VS Code
c. Rider
d. Todos los anteriores
2. ¿Qué le permite hacer la herramienta de prueba AWS .NET Mock Lambda? (seleccione uno)
b. Simular los servicios de AWS para llamar a su función de Lambda
c. Realizar pruebas de rendimiento en sus funciones de Lambda
d. Invocar el código de su función de forma local
3. ¿Para qué tipo de función de Lambda es adecuado el emulador de interfaz de tiempo de ejecución? (seleccione uno)
b. Funciones de Lambda basadas en contenedores
c. Funciones de Lambda en tiempo de ejecución personalizadas
d. Todos los tipos de funciones de Lambda
Respuestas: 1-d, 2-d, 3-b
Conclusión
A medida que se acostumbre a escribir funciones de Lambda, podrá cambiar de una forma a otra para probar sus funciones, pero le recomendamos ampliamente que utilice el servicio real de AWS Lambda lo antes posible para probar el código. Es el mejor lugar para hacerlo.
También aprendió a depurar una función de forma local, lo que le permite revisar el código y ver qué está sucediendo.