Upload
tdc-globalcode
View
169
Download
3
Embed Size (px)
Citation preview
Globalcode – Open4education
Trilha – RubyTestes de contrato em um contexto de services e
microservices
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
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.
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/
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)
Globalcode – Open4education
O que são testes de contrato?
• Em um contexto de services e microservices
http://martinfowler.com/bliki/IntegrationContractTest.html
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
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
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
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
Globalcode – Open4education
Arquitetura de testes de contrato em (micro)serviços
• Teste de Contrato do lado do Serviço
BUILD REGULAR
Serviço BDContrato
(Simulação)
Y Z
T
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.
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
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
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.
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.
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
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
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/)
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.
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=200&type=page" -> NOK!
Problema: Gera o contrato, mas na seguinte execução do teste o contrato não é encontrado.
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.
Globalcode – Open4education
Próximos Passos
• Explorar o Pact para construção de microservices• Testes de contrato do LinkedIn e Twitter
Globalcode – Open4education
Dúvidas?
[email protected]://linkedin.com/in/brunotanoue
twitter: @brunotanoue