A necessidade da mudança de arquitetura dos sistemas para o contexto de services e microservices fez com que um novo tipo de problema surgisse: a quebra de contrato entre o provedor e o cliente. Uma mudança de estrutura ou tipo de dado pelo provedor de serviço pode causar grandes perdas para o cliente, se não for comunicado antecipadamente sobre a mudança. Mesmo que essa comunicação tenha sido feita, é possível que ele não saiba o real impacto. Uma mudança do lado do cliente também pode fazer com que os dados retornem em formato diferente do esperado. Os testes de contrato nesse contexto auxiliam para que não haja um ruído sobre os dados que trafegam em ambos os lados.
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. 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.
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. 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. Globalcode – Open4education
O que são testes de contrato?
• Em um contexto de services e microservices
http://martinfowler.com/bliki/IntegrationContractTest.html
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
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. 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. 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. 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. 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. 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. 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. 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. 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.
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
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
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. 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.
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.