O documento discute testes de contrato em serviços e microserviços. Ele explica o que são testes de contrato, como eles são usados para verificar a interface entre serviços, e apresenta duas ferramentas chamadas Pact e Pacto para automatizar testes de contrato em serviços internos e de terceiros. O documento também descreve um caso de uso dos testes de contrato na API do Facebook.
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.