.NET Workloads on AWS Lambda

MÓDULO 5

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

Muchas de las plantillas de proyectos de funciones de Lambda para .NET incluyen un proyecto de prueba de xUnit. Sin un solo cambio, puede ejecutar la prueba en este proyecto y se aprobará.
Cree una nueva función de Lambda mediante:
dotnet new lambda.EmptyFunction -n FunctionWithTestProject
Cambie al directorio FunctionWithTestProject/test/FunctionWithTestProject.Tests:
cd FunctionWithTestProject/test/FunctionWithTestProject.Tests
Abra ese proyecto en su IDE.

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
Verá una salida similar a la siguiente:
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)
Por supuesto, puede abrir el proyecto de prueba en Visual Studio, VS Code o Rider y ejecutar las pruebas desde allí.

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.
En Rider, vaya al menú Prueba y seleccione Ejecutar todas las pruebas desde la solución. Esto ejecutará las pruebas y abrirá la ventana Prueba unitaria donde verá los resultados.
Para VS Code, puede ejecutar fácilmente pruebas individuales o todas las pruebas de un archivo
Sin embargo, si sus pruebas están en varios archivos, necesitará una extensión de ejecutor de pruebas. Consulte la documentación de la extensión para obtener más información o para configurar y ejecutar 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

Esta herramienta le permite invocar sus funciones de Lambda localmente con una carga útil que usted define y examinar la respuesta.

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

Para la línea de comandos, VS Code y Rider, necesita instalar la herramienta.

Desde la línea de comandos, ejecute:
dotnet tool install -g Amazon.Lambda.TestTool-6.0
Si ya la tiene instalada, actualícela mediante:
dotnet tool update -g Amazon.Lambda.TestTool-6.0

Pruebas de la línea de comandos

Utilizando el proyecto de ejemplo anterior, desde la línea de comandos navegue hasta el directorio FunctionWithTestProject/src/FunctionWithTestProject.

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\"'
En bash, use lo siguiente:
dotnet lambda-test-tool-6.0 --no-ui --payload '"hello"'
Debería ver un resultado similar al siguiente:
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 
En la sección de respuestas puede ver el resultado de la función de Lambda.

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.

Si agregó instrucciones de registro a su función, las verá en la sección Salida del registro.

Visual Studio

Si tiene instalado el Kit de herramientas de AWS para Visual Studio, entonces ya tiene la herramienta de prueba AWS .NET Mock Lambda.

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"
    }
  }
}
Inicie la aplicación pulsando F5. Se abrirá la misma página que vio arriba; introduzca su carga y pulse el botón Ejecutar función.

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

Para configurar la herramienta de prueba AWS .NET Mock Lambda para Rider, siga las instrucciones
aquí:

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
El proyecto contiene un Dockerfile. Abra esto y verá que Docker copia los archivos del directorio bin/Release/lambda-publish al contenedor de Docker:
COPY "bin/Release/lambda-publish"  .
Abra el archivo Function.cs y sustituya el método Get(..) por el siguiente:
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;
}
Cambie al directorio TestingFunctionWithRIE/src/TestingFunctionWithRIE:
cd TestingFunctionWithRIE/src/TestingFunctionWithRIE 
Ejecute lo siguiente:
dotnet build -c Release -o .\bin\Release\lambda-publish\ 
Esto creará la aplicación y colocará los binarios en el directorio .\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 .
Cuando se complete, es hora de iniciar el contenedor:
docker run -it -p 9000:8080 testing_function_with_rie:latest TestingFunctionWithRIE::TestingFunctionWithRIE.Functions::Get
Este comando inicia el contenedor docker y expone el puerto interno 8080 a través del puerto 9000 de su computadora, y pasa el controlador de la función como parámetro. El emulador de interfaz de tiempo de ejecución usa esto para ejecutar el método apropiado en la aplicación.

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"
    }
}
Recibirá una respuesta parecida a la siguiente:
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 desea cambiar el código y volver a probarlo, utilice lo siguiente, que combina la compilación .NET, la compilación del contenedor e inicia el contenedor en una línea:
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

El mismo principio se aplica al usar Visual Studio, VS Code y Rider.

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.
Ahora estará en el código de su función de Lambda.


Uso de la herramienta de prueba AWS .NET Mock Lambda

Esto también funciona con los tres IDE. Consulte las instrucciones anteriores si utiliza VS Code o Rider.

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

En este módulo, vio diversas formas de probar y depurar las funciones de Lambda desde la línea de comandos y los IDE.

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

Ya completó el módulo 5, Pruebas unitarias y depuración. El siguiente test le permitirá comprobar lo que ha aprendido hasta ahora.

1. ¿Qué IDE le permiten ejecutar pruebas unitarias de funciones de Lambda? (seleccione uno)

a. Visual Studio

b. VS Code

c. Rider

d. Todos los anteriores

2. ¿Qué le permite hacer la herramienta de prueba AWS .NET Mock Lambda? (seleccione uno)

a. Simular dependencias de .NET para sus pruebas

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)

a. Funciones de Lambda en tiempo de ejecución administradas

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

En este módulo, vio diversas formas de probar y depurar las funciones de Lambda desde la línea de comandos y los IDE.

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.

¿Le resultó útil esta página?

LABORATORIO PRÁCTICO: CREACIÓN E IMPLEMENTACIÓN DE FUNCIONES DE LAMBDA