Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

TDC2016POA | Trilha Ruby - Testes de contrato em um contexto de services e microservices

364 views

Published on

Testes de contrato em um contexto de services e microservices

Published in: Education
  • If you just broke up with your Ex, you have to follow these steps to get him back or risk ruining your chances. ▲▲▲ http://goo.gl/nkXEkK
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

TDC2016POA | Trilha Ruby - Testes de contrato em um contexto de services e microservices

  1. 1. Globalcode – Open4education Trilha – Ruby Testes de contrato em um contexto de services e microservices
  2. 2. Globalcode – Open4education Quem sou eu? Bruno Tanoue QA Engineer @ResultadosDigitais
  3. 3. Globalcode – Open4education Agenda • O que são testes de contrato? • Arquitetura de testes de contrato em (micro)serviços • Teste de contrato em (micro)serviços internos • Teste de contrato em serviços de terceiros (públicos) • Pacto & Pact • Case: Testes de Contrato na API do Facebook
  4. 4. Globalcode – Open4education Motivação • Março 2016 • 2 incidentes por causa de atualização de versão de API’s (facebook e twitter). • Com a atualização, foram modificadas algumas chamadas e dados de retorno. • Essa modificação fez com que algumas features nossas ficassem inconsistentes e parassem de funcionar.
  5. 5. Globalcode – Open4education Motivação
  6. 6. Globalcode – Open4education O que são testes de contrato? • Em um contexto de testes unitários • Descrever a interface de programação disponível em um objeto. • Métodos e parâmetros. • Garantir que o objeto possua os métodos que estão sendo simulados com mocks/stubs em algum teste. http://shipit.resultadosdigitais.com.br/blog/usando-testes-de-contrato-e-colaboracao/
  7. 7. Globalcode – Open4education O que são testes de contrato? • Services e microservices • Stubs - comunicações. • Como garantir que este stub represente realmente a comunicação real? Testes de contrato em contexto de services e microservices (Teste de Contrato de Integração)
  8. 8. Globalcode – Open4education O que são testes de contrato? • Em um contexto de services e microservices http://martinfowler.com/bliki/IntegrationContractTest.html
  9. 9. Globalcode – Open4education O que são testes de contrato? • O que é um contrato? • Arquivo (ex: JSON) • Requisição • Resposta • Tipagem dos dados da resposta • Exemplos de dados de resposta
  10. 10. Globalcode – Open4education O que são testes de contrato? • Requisição
  11. 11. Globalcode – Open4education O que são testes de contrato? • Resposta
  12. 12. Globalcode – Open4education O que são testes de contrato? • Tipagem dos dados da resposta
  13. 13. Globalcode – Open4education O que são testes de contrato? • Em um contexto de services e microservices • Verificar a validade do stub • Suíte de testes separada • Executar uma vez ao dia
  14. 14. Globalcode – Open4education Arquitetura de testes de contrato em (micro)serviços • Mas e a abordagem de Teste de Integração? Consumidor Serviço BD X Y Z T T
  15. 15. Globalcode – Open4education Arquitetura de testes de contrato em (micro)serviços • Teste de Contrato do lado do Consumidor Consumidor Stub X BUILD REGULAR Consumidor X” Contrato Serviço T
  16. 16. Globalcode – Open4education Arquitetura de testes de contrato em (micro)serviços • Teste de Contrato do lado do Serviço BUILD REGULAR Serviço BD Contrato (Simulação) Y Z T
  17. 17. Globalcode – Open4education Arquitetura de testes de contrato em (micro)serviços • Vantagens em relação aos testes de integração: • Execução rápida • Redução de testes flakey(falso positivo) • Fácil identificação do erro. • O fluxo de integração pode executar múltiplos serviços.
  18. 18. Globalcode – Open4education Teste de contrato em (micro)serviços internos • Características • Propriedade do código. • Maior controle e também um teste mais rápido e fácil. • Auxilia a aplicar o padrão Consumer Driven-Contracts Consumidor 1 Provedor de ServiçoConsumidor 2 Consumidor 3 Contrato Contrato Contrato http://martinfowler.com/articles/consumerDrivenContracts.html
  19. 19. Globalcode – Open4education Teste de contrato em serviços de terceiros (públicos) • O que são serviços de terceiros(públicos)? • API’s externas das quais não temos controle sobre o código fonte e sobre suas alterações. http://graph.facebook.com http://api.twitter.com http://api.linkedin.com
  20. 20. Globalcode – Open4education Teste de contrato em serviços de terceiros (públicos) • Características • Não existe propriedade do código da api. • Adaptação ao serviço já existente. • Nenhum controle das alterações do service.
  21. 21. Globalcode – Open4education A solução? • Estudo e implementação de testes de contrato para essas API’s. ● POC das gems Pacto e Pact. ● Criação dos testes de contrato para o Facebook. ● Inclusão dos testes no build noturno.
  22. 22. Globalcode – Open4education Pact & Pacto TW Radar (Julho 2014/ Janeiro 2015)
  23. 23. Globalcode – Open4education Pact • Basicamente o Pact é indicado para (micro)services criados do zero. + Tem suporte para diagramas. + Documentação das API’s baseada na criação dos testes. + Documentação mais detalhada. - O contrato é gerado a partir da criação do teste. - Utiliza rake. - A própria documentação do Pact indica utilizar o Pacto para teste de API’s de terceiros. https://github.com/realestate-com-au/pact
  24. 24. Globalcode – Open4education Pact Diagrama - Gems pact + pact_broker
  25. 25. Globalcode – Open4education Pact Documentação autogerada - Gems pact + pact_broker
  26. 26. Globalcode – Open4education Pacto • O Pacto é indicado para testes de serviços de terceiros. + O contrato é gerado automaticamente a partir da requisição para a api. + Utiliza Rspec ou rake. + É mais fácil de utilizar. - Documentação menos detalhada. - Não possui gráficos e nem documentação das API’s. https://github.com/thoughtworks/pacto
  27. 27. Globalcode – Open4education Pacto • Pacto.generate! -> Primeira execução • Pacto.load_contracts(path, base_url) • <api request> • expect(Pacto).to have_validated(:method, api_url).against_contract(/contract.json/)
  28. 28. Globalcode – Open4education Case: Testes de Contrato na API do Facebook • Dificuldades encontradas na automação dos testes da api do Facebook • A gem pacto trabalha bem com arquiteturas REST bem definidas. • A api do Facebook tem uma arquitetura REST, contudo faz um grande uso de query params. • O filtro de headers não é muito efetivo. Os matchers falham por questões de letras maiúsculas e minúsculas. Solução: Criar um fork da gem e fazer commits para contornar o problema.
  29. 29. Globalcode – Open4education Case: Testes de Contrato na API do Facebook • Path params: Path: "/v2.5/me/accounts" -> OK! • Path + Query params: Path: "/v2.5/me/accounts?access_token=<HASH_TOKEN>&limit=2 00&type=page" -> NOK! Problema: Gera o contrato, mas na seguinte execução do teste o contrato não é encontrado.
  30. 30. Globalcode – Open4education Case: Testes de Contrato na API do Facebook
  31. 31. Globalcode – Open4education Case: Testes de Contrato na API do Facebook
  32. 32. Globalcode – Open4education Case: Testes de Contrato na API do Facebook
  33. 33. Globalcode – Open4education Case: Testes de Contrato na API do Facebook • Resultados obtidos • Diminuição de linhas de código do spec de integração • facebook_contract_spec.rb -> 86 linhas • facebook_client_spec.rb -> 526 linhas • “Contratos” jogados no meio do código. • Simulação de atualização da api do Facebook da versão 2.5 para 2.7 quebrou um endpoint.
  34. 34. Globalcode – Open4education Próximos Passos
  35. 35. Globalcode – Open4education Próximos Passos • Explorar o Pact para construção de microservices • Testes de contrato do LinkedIn e Twitter
  36. 36. Globalcode – Open4education Dúvidas? bruno.tanoue@resultadosdigitais.com.br https://linkedin.com/in/brunotanoue twitter: @brunotanoue

×