Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Como criar projetos de teste modulares para mic...

Como criar projetos de teste modulares para microservices

O mundo agora está repleto de microsserviços distribuídos, gerando diversos tipos de aplicações. Aprendemos que testar a camada API com diferentes abordagens traz vários benefícios, mas também uma complexidade que pode ser medida em duplicação de código, alta manutenção e testes sujeitos a erros.

Para resolver este problema, em termos de como testá-lo, podemos aplicar a mesma lógica aplicada no desenvolvimento de microsserviços: isolá-los.

Elias Nogueira

October 29, 2020
Tweet

More Decks by Elias Nogueira

Other Decks in Technology

Transcript

  1. Elias Nogueira I help professional software engineers (backend, frontend, qa)

    to develop their quality mindset and deliver bug-free software so they become top-level engineers and get hired for the best positions in the market. Backbase Principal Software Engineer Utrecht, the Netherlands eliasnogueira.com @eliasnogueira bit.ly/eliasnogueira
  2. Implicitamente queremos… • Aumentar da confiança na entrega • Cobrir

    principais cenários de negócio • Certeza que o teste encontrará uma possível falha depois de alguma modificação
  3. APIs Individuais API API API API API API API API

    Cada microserviço é uma pequena funcionalidade sendo executada de maneira independente.
  4. APIs Individuais Testes Unitários done! API API API API API

    API API API Cada API deve possuir seus testes unitários e integração.
  5. API API API API API API API API Possível solução

    Criar testes funcionais e e2e para cobrir possíveis gaps e diminuir o teste na interface gráfica. Testes Funcionais & E2E
  6. API API API API API API API API Possível solução

    Porque? Cada API pode ter uma dependência direta ou indireta. depende consom e
  7. Modelo 1 Ganhos • Centralização do código em um único

    projeto • Rapidez e agilidade na criação de testes e resolução de problemas Problemas • Mudanças constantes por diversas pessoas podem gerar efeitos colaterais nos resultados
  8. Modelo 2 Um projeto de teste para cada microserviço onde

    as interações com o(s) endpoint(s) estarão no projeto de teste. BACKEND TEST TEST TEST PROEJTO TESTE
  9. Modelo 2 Ganhos • Descentralização organizada dos projetos de teste

    para com uma API • Isolamento entre APIs Problemas • Possíveis duplicidades de código
  10. Modelo 3 Um projeto de teste para cada microserviço dividido

    em projetos de cliente e testes BACKEND PROEJTO TESTE TEST TEST TEST CLIENT CLIENT CLIENT
  11. Modelo 3 Projeto Cliente Colocaremos aqui toda a lógica necessária

    para efetuar as requisições como: ◦ Retorno de exceções ◦ Objetos de Transporte ◦ Chamada das requisições ◦ Customizações para validações ◦ Configurações de apontamento (URI, base path, porta)
  12. Modelo 3 Projeto Teste Colocaremos aqui todos os métodos de

    utilização da API que criamos no projeto cliente, criando a lógica de testes e validando os resultados. Em resumo, todos os testes serão criados aqui!
  13. Modelo 3 Ganhos • Maior gestão de versões (novas funcionalidades,

    breaking changes) • Fácil utilização por outros times ◦ eles só precisam consumir o cliente e criar seus testes Problemas • Aumento de tempo, comparado com os modelos anteriores
  14. Divisão dos projetos CLIENT TEST COMMONS PARENT Projeto contendo todas

    as chamadas para o microserviço, sendo as chamadas com sucesso ou simulando exceções. Projeto contendo os testes para o microserviço, testando sua funcionalidade e dependências com outros microserviços. Código e bibliotecas comuns aos clients como definições de URLs, autenticação e qualquer outro código compartilhado. Código e bibliotecas comuns aos tests como massa de dados, funções de suporte ou qualquer código comum aos testes.
  15. Exemplo dos Microserviços Colocaremos aqui toda a lógica necessária para

    efetuar as requisições como: RESTRICTIONS GET /api/v1/restricrions/{cpf} GET /api/v2/restricrions/{cpf} API de Consulta de Restrição SIMULATIONS GET /api/v1/simulations/ GET /api/v1/simulations/{cpf} POST /api/v1/simulations/ PUT /api/v1/simulations/{cpf} DELETE /api/v1/simulations/{cpf} API Simulação de Crédito
  16. Implementação do client Métodos serão criados para simular todas as

    possíveis chamadas de cada método HTTP CLIENT RESTRICTIONS GET /api/v1/restricrions/{cpf} Client da Consulta de Restrição Método - consulta CPF com sucesso Método - consulta CPF e retorna restrição
  17. CLIENT SIMULATIONS GET /api/v1/simulations/ GET /api/v1/simulations/{cpf} POST /api/v1/simulations/ Client da

    simulação de crédito Método – consulta simulações Método – consulta simulação Método – consulta simulação e retorna not found Método – submete simulação Método – submete simulação e retorna unprocessable entity Método – submete simulação e retorna conflict Métodos serão criados para simular todas as possíveis chamadas de cada método HTTP Implementação do client
  18. CLIENT SIMULATIONS POST /api/v1/simulations/ Client da simulação de crédito Método

    – submete simulação Um método de teste será criado para uma ou mais uso dos métodos no client Implementação do test TEST SIMULATIONS deve criar uma simulação com sucesso - Teste Projeto de teste da simulação
  19. CLIENT SIMULATIONS POST /api/v1/simulations/ Client da simulação de crédito Método

    – submete simulação Método – submete simulação e retorna unprocessable entity Um método de teste será criado para uma ou mais uso dos métodos no client Implementação do test TEST SIMULATIONS deve criar uma simulação com sucesso deve apresentar erro quando atributo não for submetido - Teste - Teste Projeto de teste da simulação
  20. CLIENT SIMULATIONS POST /api/v1/simulations/ Client da simulação de crédito Método

    – submete simulação Método – submete simulação e retorna unprocessable entity Método – submete simulação e retorna conflict Um método de teste será criado para uma ou mais uso dos métodos no client Implementação do test TEST SIMULATIONS deve criar uma simulação com sucesso deve apresentar erro quando atributo não for submetido deve apresentar conflito quando CPF já existir - Teste - Teste - Teste Projeto de teste da simulação
  21. Como associar o client <-> test? Através da versão do

    client • Devemos adicionar a dependência do client no test <dependency> <groupId>com.eliasnogueira</groupId> <artifactId>simulations-client</artifactId> <version>1.2.5</version> </dependency> "devDependencies": { "@eliasnogueira/simulations-client": ”1.2.5", } Exemplo Java + Maven Exemplo Typescript + Node
  22. Como associar o client <-> test? Ganho: associação do client

    com a versão do microserviço Assim como o microserviço evolui o client e o test também evoluem. Adicionar um changelog com a associação da versão do client com a versão do microserviço pode ajudar na correção de bugs.
  23. Recapitulando • Criamos um modelo robusto para ◦ testar um

    microserviço isoladamente (teste funcional) ◦ testar um microserviço e suas dependências (e2e) • Modularizamos a criação dos projetos ◦ client: toda a chamada de API para um microserviço ◦ test: projeto de teste utilizando o client do microserviço ◦ commons: codigos e bibliotecas do client ◦ parent: código e bibliotecas do test
  24. Obrigado! SCAN ME Você pode me seguir no Twitter @eliasnogueira

    e também encontrar os exemplos práticos desta apresentação. Não deixe de simular os exemplos no código!