$30 off During Our Annual Pro Sale. View Details »

Como criar projetos de teste modulares para microservices

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. Como criar projetos de
    teste modulares para
    microserviços
    Elias Nogueira

    View Slide

  2. 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

    View Slide

  3. Qual problema
    queremos resolver?

    View Slide

  4. 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

    View Slide

  5. Conceituação

    View Slide

  6. APIs Individuais
    API
    API
    API
    API
    API
    API
    API
    API
    Cada microserviço é uma pequena funcionalidade sendo
    executada de maneira independente.

    View Slide

  7. 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.

    View Slide

  8. 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

    View Slide

  9. 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

    View Slide

  10. Como os projetos de teste
    podem ser criados?

    View Slide

  11. Modelo 1
    Um projeto de teste para todos os microserviço
    BACKEND
    TEST
    PROEJTO
    TESTE

    View Slide

  12. 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

    View Slide

  13. 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

    View Slide

  14. Modelo 2
    Ganhos
    ● Descentralização organizada dos projetos de teste para
    com uma API
    ● Isolamento entre APIs
    Problemas
    ● Possíveis duplicidades de código

    View Slide

  15. 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

    View Slide

  16. 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)

    View Slide

  17. 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!

    View Slide

  18. 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

    View Slide

  19. Exemplo de Implementação

    View Slide

  20. Exemplo de Implementação
    Divisão de projeto
    BACKEND
    PROEJTO
    TESTE
    TEST TEST TEST
    CLIENT CLIENT CLIENT
    COMMONS
    PARENT

    View Slide

  21. 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.

    View Slide

  22. Exemplo dos Microserviços
    Possível interface gráfica: Verificação de Restrição pelo CPF

    View Slide

  23. Exemplo dos Microserviços
    Possível interface gráfica: Simulação de Empréstimo

    View Slide

  24. 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

    View Slide

  25. 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

    View Slide

  26. 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

    View Slide

  27. 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

    View Slide

  28. 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

    View Slide

  29. 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

    View Slide

  30. Como associar o client <-> test?

    View Slide

  31. Como associar o client <-> test?
    Através da versão do client
    ● Devemos adicionar a dependência do client no test

    com.eliasnogueira
    simulations-client
    1.2.5

    "devDependencies": {
    "@eliasnogueira/simulations-client": ”1.2.5",
    }
    Exemplo Java + Maven
    Exemplo Typescript + Node

    View Slide

  32. 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.

    View Slide

  33. Recapitulando

    View Slide

  34. 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

    View Slide

  35. Gratuito!
    SCAN ME
    https://leanpub.com/testando-microservices-com-restassured

    View Slide

  36. 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!

    View Slide

  37. Projetos
    • https://github.com/eliasnogueira/test-parent
    • https://github.com/eliasnogueira/test-commons
    • https://github.com/eliasnogueira/restrictions-client
    • https://github.com/eliasnogueira/restrictions-test
    • https://github.com/eliasnogueira/simulations-client
    • https://github.com/eliasnogueira/simulations-test

    View Slide