tdc2016poa | trilha ruby - testes de contrato em um contexto de services e microservices

36
Globalcode – Open4education Trilha – Ruby Testes de contrato em um contexto de services e microservices

Upload: tdc-globalcode

Post on 15-Apr-2017

169 views

Category:

Education


3 download

TRANSCRIPT

Globalcode – Open4education

Trilha – RubyTestes de contrato em um contexto de services e

microservices

Globalcode – Open4education

Quem sou eu?

Bruno TanoueQA Engineer

@ResultadosDigitais

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

Motivação

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?

• Requisição

Globalcode – Open4education

O que são testes de contrato?

• Resposta

Globalcode – Open4education

O que são testes de contrato?

• Tipagem dos dados da 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 & Pacto

TW Radar (Julho 2014/ Janeiro 2015)

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

Pact

Diagrama - Gems pact + pact_broker

Globalcode – Open4education

Pact

Documentação autogerada - Gems pact + pact_broker

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

Globalcode – Open4education

Case: Testes de Contrato na API do Facebook

Globalcode – Open4education

Case: Testes de Contrato na API do Facebook

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

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