Workloads do .NET no AWS Lambda

MÓDULO 5

Módulo 5: Teste de unidade e depuração

 MÓDULO DE APRENDIZAGEM

Observe que você pode seguir os exemplos apresentados aqui, mas isso não é necessário.

Há várias maneiras de testar uma função do Lambda. A mais simples é usar e desenvolver os testes unitários fornecidos nos modelos do AWS Lambda Project. Um executor de testes familiar em um IDE ou o simples teste dotnet é tudo o que você precisa para executar os testes.

Outra opção é usar a ferramenta de teste AWS .NET Mock Lambda. Ela está em pré-visualização no momento. Isso permite testar e depurar as funções do Lambda. A ferramenta está incluída como parte do Kit de ferramentas da AWS para Visual Studio. Mas você pode baixá-lo para uso com a linha de comando, com o VS Code e o Rider.

Se você estiver desenvolvendo funções do Lambda que estão implantadas em contêineres, o Runtime Interface Emulator permitirá que você teste as funções em execução no contêiner.

Existem ferramentas de terceiros, como o localstack, que você pode usar para testar as funções localmente, mas a melhor maneira de realizar testes funcionais é implantar as funções do Lambda na AWS e testá-las lá. A AWS oferece a todas as contas 1 milhão de solicitações gratuitas por mês; até 3,2 milhões de segundos de tempo de computação por mês. Portanto, há muito poucos motivos para você não testar as funções na Nuvem AWS.

Consulte estas duas páginas para obter mais informações sobre preços: Comece com o nível gratuito da AWS e Preço do AWS Lambda.

Com essas ferramentas de teste locais, também é fácil realizar algumas depurações. Um breve exemplo será mostrado posteriormente.

 Tempo para a conclusão

30 minutos 

Projeto de teste xUnit

Muitos dos modelos de projeto da função do Lambda no .NET incluem um projeto de teste xUnit. Sem uma única alteração, você pode executar o teste neste projeto e ele será aprovado.
Crie uma nova função do Lambda usando:
dotnet new lambda.EmptyFunction -n FunctionWithTestProject
Vá para o diretório FunctionWithTestProject/test/FunctionWithTestProject.Tests:
cd FunctionWithTestProject/test/FunctionWithTestProject.Tests
Abra o projeto em seu IDE.

Abra o arquivo FunctionWithTestProject.Tests.csproj e você verá uma referência ao projeto da função do Lambda.
<ProjectReference Include="..\..\src\FunctionWithTestProject\FunctionWithTestProject.csproj" />

Na linha de comando, execute os testes usando:

dotnet test
Você verá um resultado semelhante a -
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)
Você pode, é claro, abrir o projeto de teste no Visual Studio, VS Code ou Rider e executar os testes aí.

No Visual Studio, acesse o menu Teste e selecione Executar todos os testes. Isso também abrirá o Test Explorer, onde você verá os resultados dos testes.
No Rider, acesse o menu Teste e selecione Executar todos os testes da solução. Isso executará testes e abrirá a janela Teste de Unidade, onde você verá os resultados.
Para o VS Code, você pode executar facilmente testes individuais ou todos os testes em um arquivo
Porém, se os testes estiverem em vários arquivos, você precisará de uma extensão de executor de testes. Consulte a documentação da extensão para obter mais informações sobre como configurar e executar testes.

Ao alterar o código na função, você atualiza o teste da mesma forma que faria com um projeto de teste normal. Como esse é um projeto de teste como qualquer outro que você escreve, você poderá usar as mesmas bibliotecas para ajudá-lo, como o moq.

A ferramenta de teste AWS .NET Mock Lambda

Essa ferramenta permite que você invoque as funções do Lambda localmente com uma carga útil que você define e examina a resposta.

Conforme mencionado acima, se você estiver usando o Kit de ferramentas da AWS no Visual Studio, a ferramenta já estará incluída.

Você pode usar a ferramenta com o Visual Studio, o VS Code, o Rider ou na linha de comando.

A linha de comando permite que você execute em dois modos:

1. Com uma interface de usuário baseada em navegador da Web

2. Sem interface de usuário

As próximas etapas mostram como usar a ferramenta na linha de comando, mas, se preferir, passe para a seção sobre o Visual Studio.

Instalar o Kit de ferramentas

Para a linha de comando, o VS Code e o Rider, você precisará instalar a ferramenta.

Na linha de comando, execute:
dotnet tool install -g Amazon.Lambda.TestTool-6.0
Se você já o tiver instalado, atualize-o usando:
dotnet tool update -g Amazon.Lambda.TestTool-6.0

Teste de linha de comando

Usando o projeto de exemplo acima, na linha de comando, navegue até o diretório FunctionWithTestProject/src/FunctionWithTestProject.

Para executar o teste na linha de comando, você precisará especificar a opção --no-ui e passar em uma carga. O escape da carga variará dependendo da shell que você estiver usando. O texto abaixo funciona para o PowerShell.

Na linha de comando, execute:
dotnet lambda-test-tool-6.0 --no-ui --payload '\"hello\"'
Para uso em bash:
dotnet lambda-test-tool-6.0 --no-ui --payload '"hello"'
Você verá um resultado semelhante a -
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 
Na seção de resposta, você poderá ver o resultado da função do Lambda.

Teste de interface de usuário da Web, lançado na linha de comando

Você também pode usar a ferramenta na linha de comando para iniciar uma interface de usuário da Web para testes.

Na interface do usuário, insira sua própria carga, mas não será necessário se preocupar em escapar nesse caso. Selecione também em um conjunto de exemplos de cargas de solicitação. Isso permite que você simule as solicitações de outros serviços da AWS, como S3, Kinesis, SQS etc.

Mas, por enquanto, digite "hello" (incluindo as aspas) como carga e pressione o botão Executar função.

Na seção de resposta, você verá o que a função retornou.

Se você adicionou instruções do log à função, você as verá na seção Resultados do log.

Visual Studio

Se você tiver o Kit de ferramentas da AWS para Visual Studio instalado, então você já tem a ferramenta de teste AWS .NET Mock Lambda.

Abra o projeto FunctionWithTestProject/src/FunctionWithTestProject no Visual Studio.

O Visual Studio criará um diretório de propriedades e, dentro desse diretório, um arquivo launchsettings.json que conecta a ferramenta de teste AWS .NET Mock Lambda ao seu código.

O arquivo ficará mais ou menos assim -
{
  "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 a aplicação pressionando F5. A mesma página que você viu acima se abrirá, insira sua carga e pressione o botão Executar função.

VS Code

Para usar a ferramenta de teste AWS .NET Mock Lambda no VS Code, siga estas instruções: https://github.com/aws/aws-lambda-dotnet/tree/master/Tools/LambdaTestTool#configure-for-visual-studio-code

Observação:

1. altere o dotnet-lambda-test-tool-3.1 para dotnet-lambda-test-tool-6.0.

2. se você estiver usando o dotnet-lambda-test-tool-6.0 em Linux ou Mac, não terá uma extensão.exe.

Rider

Para configurar a ferramenta de teste AWS .NET Mock Lambda para Rider, siga as instruções
aqui -

Emulador de contêineres e interface de runtime

Se você estiver implantando funções do Lambda dentro de contêineres, poderá realizar outra camada de testes locais usando o AWS Runtime Interface Emulator (RIE). Você não precisa instalar nenhuma ferramenta nova, as ferramentas serão automaticamente empacotadas dentro do contêiner que você criou.

Neste exemplo, você escreverá uma aplicação sem servidor que terá dois manipuladores de funções.

Crie um novo projeto baseado em contêiner usando:

dotnet new serverless.image.EmptyServerless --name TestingFunctionWithRIE
O projeto contém um Dockerfile. Abra-o e você verá que o Docker copia os arquivos do diretório bin/Release/lambda-publish no contêiner Docker:
COPY "bin/Release/lambda-publish"  .
Abra o arquivo Function.cs e substitua o método Get(..) pelo seguinte:
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;
}
Vá para o diretório TestingFunctionWithRIE/src/TestingFunctionWithRIE:
cd TestingFunctionWithRIE/src/TestingFunctionWithRIE 
Execute o seguinte:
dotnet build -c Release -o .\bin\Release\lambda-publish\ 
Isso criará a aplicação e colocará os binários no diretório .\bin\Release\lambda-publish.

Verifique se o Docker está em execução e, em seguida, crie o contêiner:
docker build -t testing_function_with_rie:latest .
Quando isso for concluído, é hora de iniciar o contêiner:
docker run -it -p 9000:8080 testing_function_with_rie:latest TestingFunctionWithRIE::TestingFunctionWithRIE.Functions::Get
Esse comando inicia o contêiner docker e expõe a porta interna 8080 por meio da porta 9000 em seu computador, além de passar o manipulador de funções como um parâmetro. O Runtime Interface Emulator usa isso para executar o método apropriado em sua aplicação.

Se você tiver mais de um manipulador de função no código, teste um de cada vez, iniciando o contêiner e passando o manipulador de função apropriado a cada vez.

Por fim, faça uma solicitação HTTP para o Runtime Interface Emulator. Você pode usar o Fiddler, Postman, Insomnia, etc. Abaixo está a solicitação para usar com o VS Code Rest Client ou o Rider Http Client:
POST http://localhost:9000/2015-03-31/functions/function/invocations HTTP/1.1
content-type: application/json

{
    "PathParameters": {
        "Id": "999"
    }
}
Você verá uma resposta como a seguinte:
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
}
Se você quiser alterar o código e testar novamente, use o seguinte: ele combina a compilação do .NET com a compilação do contêiner e inicia o contêiner em uma linha:
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

Testar a função do Lambda na AWS

As ferramentas acima são ótimas para testar a função do Lambda localmente e, embora existam ferramentas para ajudar você com ambientes simulados da AWS, a melhor maneira de testar a função é no serviço AWS Lambda.

A AWS tem um nível gratuito generoso, que permite executar gratuitamente um milhão de solicitações do Lambda por mês. Se você ultrapassar esse limite, as próximas 1 milhão de execuções custarão USD 0,20 ou USD 0,0000002 por execução. Há algumas ressalvas sobre preços relacionados ao uso da memória e ao runtime. Consulte - Comece com o nível gratuito da AWS e os preços do AWS Lambda para obter mais informações.

Embora as ferramentas do emulador possam ser ótimas se você não tiver conectividade com a Internet, você poderá descobrir que elas não se comportam exatamente da mesma forma que os serviços reais da AWS. Testar as funções do Lambda na AWS significa que não haverá surpresas quando chegar a hora de implantar o código.

Tudo o que você precisa fazer é criar um projeto de teste no .NET. O modelo xUnit é uma boa escolha. A partir daí, escreva testes funcionais direcionados às funções do Lambda que você implanta na AWS.

dotnet new xunit -n LambdaTestProject

Para ver um passo a passo sobre como testar as funções do Lambda no .NET implantadas na AWS, consulte a postagem do blog Desenvolver as funções .NET Core do AWS Lambda.

Depuração

Talvez você queira depurar a função do Lambda localmente de tempos em tempos. Há duas maneiras fáceis de fazer isso:

1. Colocar um ponto de interrupção no projeto de teste unitário e, em seguida, entrar na função.

2. Iniciar a ferramenta de teste AWS .NET Mock Lambda no IDE, colocando um ponto de interrupção na função e executando a função na ferramenta de teste.

Usar o projeto de teste unitário

O mesmo princípio se aplica ao usar o Visual Studio, o VS Code e o Rider.

Abra o projeto de teste e coloque um ponto de interrupção no código exatamente onde ele chama a função do Lambda.

Depure o teste. Quando você atingir o ponto de interrupção, entre na função do Lambda.
Agora você já está no código de função do Lambda!


Usar a ferramenta de teste AWS .NET Mock Lambda

Isso também funciona em todos os três IDES, veja as instruções acima se você estiver usando o VS Code ou o Rider.

No Visual Studio, abra o projeto da função, não o projeto de teste.

Coloque um ponto de interrupção no manipulador de funções. Na interface de usuário da Web, adicione a entrada da função e pressione Executar.

Seu ponto de interrupção será atingido e você poderá depurar a função do Lambda, como em qualquer outro método.

Conclusão

Neste módulo, você viu várias maneiras de testar e depurar as funções do Lambda na linha de comando e nos IDEs.

Ao se acostumar a escrever funções do Lambda, você poderá alternar entre as diferentes formas de testar as funções, mas é altamente recomendável usar o serviço real do AWS Lambda o mais rápido possível para testar o código. É o melhor lugar para fazer isso.

Você também viu como depurar uma função localmente, permitindo que percorrer o código e ver o que está acontecendo.


Verificação de conhecimento

Agora você concluiu o Módulo 5, Teste de Unidade e Depuração. O teste a seguir verificará o que você aprendeu até agora.

1. Quais IDEs permitem que você execute os testes de unidade da função do Lambda? (selecione uma)

a. Visual Studio

b. VS Code

c. Rider

d. Todas as opções acima

2. O que a ferramenta de teste AWS .NET Mock Lambda permite que você faça? (selecione uma)

a. Simule dependências do .NET para seus testes

b. Simule os serviços da AWS para que a função do Lambda chame

c. Execute testes de desempenho nas funções do Lambda

d. Invoque o código da função localmente

3. Para qual tipo de função do Lambda o Runtime Interface Emulator é adequado? (selecione uma)

a. Funções do Lambda em runtime gerenciado

b. Funções do Lambda baseadas em contêiner

c. Funções do Lambda em runtime personalizados

d. Todos os tipos de função do Lambda

Respostas: 1-d, 2-d, 3-b

Conclusão

Neste módulo, você viu várias maneiras de testar e depurar as funções do Lambda na linha de comando e nos IDEs.

Ao se acostumar a escrever funções do Lambda, você poderá alternar entre as diferentes formas de testar as funções, mas é altamente recomendável usar o serviço real do AWS Lambda o mais rápido possível para testar o código. É o melhor lugar para fazer isso.

Você também viu como depurar uma função localmente, permitindo que percorrer o código e ver o que está acontecendo.

Essa página foi útil?

LABORATÓRIO PRÁTICO: CRIE E IMPLANTE FUNÇÕES DO LAMBDA