Teste da função do AWS Lambda em C# - AWS Lambda

Teste da função do AWS Lambda em C#

nota

Consulte o capítulo Testar funções para obter uma introdução completa às técnicas e melhores práticas para testar soluções com tecnologia sem servidor.

Os testes de funções com tecnologia sem servidor usam tipos e técnicas de teste tradicionais, mas você também deve considerar testar aplicações com tecnologia sem servidor como um todo. Os testes baseados em nuvem fornecerão a medida mais precisa da qualidade das suas funções e aplicações com tecnologia sem servidor.

Uma arquitetura de aplicações com tecnologia sem servidor inclui serviços gerenciados que fornecem funcionalidade de aplicações  críticas por meio de chamadas de API. Por esse motivo, seu ciclo de desenvolvimento deve incluir testes automatizados que verifiquem a funcionalidade quando sua função e seus serviços interagem.

Se você não criar testes baseados em nuvem, poderá encontrar problemas devido às diferenças entre o ambiente local e o ambiente implantado. Seu processo de integração contínua deve executar testes em comparação com um conjunto de recursos provisionados na nuvem antes de promover seu código para o próximo ambiente de implantação, como GQ, Preparação ou Produção.

Continue lendo este breve guia para aprender sobre estratégias de testes para aplicações com tecnologia sem servidor ou acesse o repositório de exemplos de testes com tecnologia sem servidor para conhecer exemplos práticos, específicos da linguagem e do runtime escolhidos.

illustration showing the relationship between types of tests

Para testes sem servidor, você ainda escreverá testes unitários, de integração e end-to-endde testes.

  • Testes unitários: testes executados em comparação com um bloco de código isolado. Por exemplo, verificar a lógica de negócios para calcular a taxa de entrega de acordo com um item e um destino determinado.

  • Testes de integração: testes envolvendo dois ou mais componentes ou serviços que interagem, normalmente em um ambiente de nuvem. Por exemplo, a verificação de eventos de processos de uma função em uma fila.

  • nd-to-end Testes E - Testes que verificam o comportamento em todo o aplicativo. Por exemplo, garantir que a infraestrutura seja configurada corretamente e que os eventos fluam entre os serviços conforme o esperado para registrar o pedido de um cliente.

Testar suas aplicações com tecnologia sem servidor

Geralmente, você usará uma combinação de abordagens para testar o código da aplicação com tecnologia sem servidor, incluindo testes na nuvem, testes com simulações e, ocasionalmente, testes com emuladores.

Testes na nuvem

O teste na nuvem é valioso para todas as fases do teste, incluindo testes unitários, testes de integração e end-to-end testes. Você executa testes com o código implantado na nuvem e interagindo com serviços baseados na nuvem. Essa abordagem fornece a medida mais precisa da qualidade do código.

Uma maneira conveniente de depurar a função do Lambda na nuvem é com o uso de um evento de teste no console. Um evento de teste é uma entrada JSON para sua função. Se a função não necessitar de entrada, o evento poderá ser um documento JSON vazio ({}). O console fornece eventos de exemplo para uma variedade de integrações de serviços. Depois de criar um evento no console, você pode compartilhá-lo com sua equipe para tornar os testes mais fáceis e consistentes.

nota

Testar uma função no console é uma maneira rápida de começar a usar, mas automatizar os ciclos de teste garante a qualidade da aplicação e a velocidade de desenvolvimento.

Ferramentas de teste

Para acelerar seu ciclo de desenvolvimento, há várias ferramentas e técnicas que você pode usar ao testar as funções. Por exemplo, o AWS SAM Accelerate e o modo de observação do AWS CDK diminuem o tempo necessário para atualizar os ambientes de nuvem.

A maneira como você define o código da função do Lambda simplifica a adição de testes de unidade. O Lambda exige um construtor público sem parâmetros para inicializar a classe. A introdução de um segundo construtor interno dá a você controle das dependências que a aplicação usa.

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace GetProductHandler; public class Function { private readonly IDatabaseRepository _repo; public Function(): this(null) { } internal Function(IDatabaseRepository repo) { this._repo = repo ?? new DatabaseRepository(); } public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request) { var id = request.PathParameters["id"]; var databaseRecord = await this._repo.GetById(id); return new APIGatewayProxyResponse { StatusCode = (int)HttpStatusCode.OK, Body = JsonSerializer.Serialize(databaseRecord) }; } }

Para escrever um teste para essa função, você pode inicializar uma nova instância da classe da Function e passar por uma implementação simulada do IDatabaseRepository. Os exemplos abaixo usam XUnit, Moq e FluentAssertions para escrever um teste simples, garantindo que o FunctionHandler retorne de um código de status 200.

using Xunit; using Moq; using FluentAssertions; public class FunctionTests { [Fact] public async Task TestLambdaHandler_WhenInputIsValid_ShouldReturn200StatusCode() { // Arrange var mockDatabaseRepository = new Mock<IDatabaseRepository>(); var functionUnderTest = new Function(mockDatabaseRepository.Object); // Act var response = await functionUnderTest.FunctionHandler(new APIGatewayProxyRequest()); // Assert response.StatusCode.Should().Be(200); } }

Para obter exemplos mais detalhados, incluindo exemplos de testes assíncronos, consulte o repositório de amostras de testes.NET em. GitHub