evoluindo apps e serviços com testes de contrato
TRANSCRIPT
![Page 1: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/1.jpg)
Evoluindo App´s e Serviçoscom
Testes de Contrato
@rafaelportela
![Page 2: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/2.jpg)
Você
Vestindo a camisa do
projeto
seu
Chefe
Ajudando como pode
![Page 3: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/3.jpg)
NO GRITOsobre a arte de lidar com complexidade
![Page 4: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/4.jpg)
NO GRITOsobre a arte de lidar com complexidade
Don´t you know that´s toxic?
![Page 5: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/5.jpg)
CONFLITO
Mais pessoasMais timesMais complexidade
![Page 6: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/6.jpg)
CONFLITO
Mais pessoasMais timesMais complexidade
![Page 7: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/7.jpg)
contrato
consumer-driven contracts
testes de contrato
![Page 8: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/8.jpg)
![Page 9: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/9.jpg)
![Page 10: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/10.jpg)
Validate bank
accounts
3-D Secure Auth
Money transfer
LoginList items
See details
CommentLike
Add CardPay
Moderate users
Back end
Moderator
Bank
Android
iOS
web
![Page 11: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/11.jpg)
![Page 12: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/12.jpg)
![Page 13: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/13.jpg)
![Page 14: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/14.jpg)
Time 1
Time 2
Time 3
Time 4
Time 5
![Page 15: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/15.jpg)
Time 1
Time 2
Time 3
Time 4
Time 5
![Page 16: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/16.jpg)
Time 1
Time 2
Time 3
Time 4
Time 5
![Page 17: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/17.jpg)
Time 1
Time 2
Time 3
Time 4
Time 5
![Page 18: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/18.jpg)
Time 1
Time 2
Time 3
Time 4
Time 5
![Page 19: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/19.jpg)
Time 1
Time 2
Time 3
Time 4
Time 5
![Page 20: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/20.jpg)
Time 1
Time 2
Time 3
Time 4
Time 5
![Page 21: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/21.jpg)
Time 1
Time 2
Time 3
Time 4
Time 5
![Page 22: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/22.jpg)
problema?
![Page 23: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/23.jpg)
problema?ENTENDIMENTO
ENTRE OS
TIMES
![Page 24: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/24.jpg)
uma única app
DIFERENTES
TIMESproblema?
![Page 25: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/25.jpg)
uma única experiência
DIFERENTES
TIMESproblema?
![Page 26: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/26.jpg)
problema?
DEPENDÊNCIAdiscutir funcionalidadespriorizar tarefasdependência de serviçosdeploys sincronizados
![Page 27: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/27.jpg)
problema?
DEPENDÊNCIAdiscutir funcionalidadespriorizar tarefasdependência de serviçosdeploys sincronizados
contrato
![Page 28: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/28.jpg)
Outro exemplo: <insira SEU projeto aqui>
Você e seu time estão desenvolvendo uma aplicação maneira
(web, ou mobile, ou uma api etc)
![Page 29: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/29.jpg)
O projeto cresce.O time cresce.O estresse cresce.
![Page 30: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/30.jpg)
O projeto cresce.O time cresce.O estresse cresce.
Módulo de Produtos
![Page 31: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/31.jpg)
Outro time da empresa quer usar sua listagem de produtos. Massa! :)
![Page 32: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/32.jpg)
Outro time da empresa quer usar sua listagem de produtos. Massa! :)
Estamos com pouco tempo. Compartilhe a string de conexão do banco com o pessoal, eles vão dar um jeito.
Gerente do seu projeto:
![Page 33: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/33.jpg)
Outro time da empresa quer usar sua listagem de produtos. Massa! :)
Estamos com pouco tempo. Compartilhe a string de conexão do banco com o pessoal, eles vão dar um jeito.
Gerente do seu projeto:
Melhor amigo:Além dos dados, tem código também. Crie um jar file de produtos e manda por email.
![Page 34: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/34.jpg)
Outro time da empresa quer usar sua listagem de produtos. Massa! :)
Estamos com pouco tempo. Compartilhe a string de conexão do banco com o pessoal, eles vão dar um jeito.
Gerente do seu projeto:
Melhor amigo:Além dos dados, tem código também. Crie um jar file de produtos e manda por email.
![Page 35: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/35.jpg)
Outro time da empresa quer usar sua listagem de produtos. Massa! :)
Estamos com pouco tempo. Compartilhe a string de conexão do banco com o pessoal, eles vão dar um jeito.
Gerente do seu projeto:
Melhor amigo:Além dos dados, tem código também. Crie um jar file de produtos e manda por email.
você: =(
![Page 36: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/36.jpg)
Serviço de Produtos
Código e dados isoladosAcesso apenas via HTTP/Rest
![Page 37: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/37.jpg)
Serviço de Produtos
Código e dados isoladosAcesso apenas via HTTP/Rest
Mas responsa-bilidades estão
isoladas.
Times menores, cuidando de
partes diferentes.
NÃO diminue a complexidade
do sistema como um todo.
(complexidade aumenta!)
![Page 38: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/38.jpg)
![Page 39: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/39.jpg)
Consumidor do serviço
Cliente
Time A
Provedor do serviço
Servidor
Time B
![Page 40: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/40.jpg)
GET /products/1
Accept: application/json
200 OK
Content-Type: application/json
{“id”: 1,“name”: “beer”}
REQUEST RESPONSE
![Page 41: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/41.jpg)
• Repositórios (base de código) independentes• Ferramentas de desenv. e suite de testes independentes• Pipelines de build independentes• Times mais ou menos independentes
• Time A (consumidor) depende de Time B (provedor)
![Page 42: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/42.jpg)
Deploy a cada
2 semanasDeploy todo dia
![Page 43: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/43.jpg)
![Page 44: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/44.jpg)
{ “id”: 1, “name”: “Duff Beer”, “content”: “341ml”}
GET /products/1
![Page 45: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/45.jpg)
{ “id”: 1, “name”: “Duff Beer”, “content”: “341ml”}
![Page 46: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/46.jpg)
{ “id”: 1, “brand”: “Duff Beer”, “content”: “341ml”}
![Page 47: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/47.jpg)
Mudança => quebrando clientes em produção
O site não tá mais abrindo!
Essa tela branca fica carregando pra sempre!
Meus dados sumiram?!
Não acontece nada quando eu aperto o botão!
![Page 48: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/48.jpg)
Sou sempre o último a saber
![Page 49: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/49.jpg)
Na verdade, a gente precisa só da parte numérica..
Separar da unidade na mão é muita gambiarra! =/
Tranquilo..Mudo e faço
deploy! ;)“341ml” => “341”
![Page 50: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/50.jpg)
Ei, tá maluco?A gente já tá usando as medidas com unidades!!
...
![Page 51: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/51.jpg)
Pra mim, tudo certo! Eu só uso o nome e id. ...
![Page 52: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/52.jpg)
Time A
Time B
![Page 53: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/53.jpg)
Se eu soubesse como cada um tá usando
minha API...
Tô meio perdido..
![Page 54: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/54.jpg)
Dá pra deixar claro o que vocês querem?
Sério, preciso saber!
![Page 55: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/55.jpg)
Relaxa, filhão..
A gente precisa de um negócio assim:
“id” -> um número “brand” -> uma string “content” -> número também
![Page 56: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/56.jpg)
Mas a gente usa as unidades com as
medidas. Manda os dois!!!
“id” -> um número “brand” -> uma string “content” -> número “unit_of_measure -> string
![Page 57: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/57.jpg)
Por mim.. Só uso o id e o
nome..
“id” -> número “brand” -> string
![Page 58: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/58.jpg)
um objeto json
{ “id”: 1, “brand”: “Duff Beer”, “unit_of_measure”: “ml”, “content”: 341}
inteiro
inteiro
string
![Page 59: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/59.jpg)
{ “properties”: { “id”: {“type”: “integer”}, “brand”: {“type”: “string”}, “unit_of_measure”: {“type”: “string”}, “content”: {“type”: “integer”} }} JSON Schema
![Page 60: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/60.jpg)
Meu pipelinede build
commit• Build• Unit tests• Functional (API level) tests• Contract tests• Deploy• PROFIT $$$
![Page 61: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/61.jpg)
Meu pipelinede build
commit• Build• Unit tests• Functional (API level) tests• Contract tests• Deploy• PROFIT $$$
Valido se os contratos dos meus clientes estão sendo satisfeitos!
Agora eu sei quando uma mudança é séria (breaking change)
![Page 62: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/62.jpg)
Agora o pessoal fica tranquilo e de boa quando eu aviso com
antecedência que vou deployar uma breaking change..
Sei até os clientes que vão quebrar e os que não vão!
Dá pra desenrolar as mudanças aos incrementos, eles vão se adaptando aos
poucos.
E não tem mais essa de deploy do
cliente e serviço ao mesmo tempo pra
não quebrar!!
![Page 63: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/63.jpg)
![Page 64: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/64.jpg)
Se algo der errado, os testes falham.. E não tem deploy.
![Page 65: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/65.jpg)
Friendship never ends!!!
![Page 66: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/66.jpg)
Consumer-driven contracts
![Page 67: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/67.jpg)
BONUS TRACK
![Page 68: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/68.jpg)
Queremos maisumas mudanças!
![Page 69: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/69.jpg)
Queremos maisumas mudanças!
Beleza! Atualizem os
contratos com as mudanças,
e então eu acerto.
![Page 70: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/70.jpg)
JSON Schema
pull request
contrato
![Page 71: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/71.jpg)
JSON Schema
• Build• Unit tests• Functional (API level) tests• Contract tests
pull request
contrato
![Page 72: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/72.jpg)
JSON Schema
• Build• Unit tests• Functional (API level) tests• Contract tests
pull request
contrato
Atualizo o código, implemento o que
elas querem
![Page 73: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/73.jpg)
JSON Schema
• Build• Unit tests• Functional (API level) tests• Contract tests• Deploy• PROFIT $$$
pull request
contrato
commit
Atualizo o código, implemento o que
elas querem
![Page 74: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/74.jpg)
BONUS TRACK
![Page 75: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/75.jpg)
JSON Schema
Vamos testar mais rápido!!Vamos usar mocks pros
nossos testes..
Mas vez ou outra a gente valida o contrato na API de
verdade! ;)
Test request
Resposta mock
Test request
API de verdade
JSON Schema
![Page 76: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/76.jpg)
SATISFACTION
![Page 77: Evoluindo Apps e Serviços com Testes de Contrato](https://reader035.vdocuments.com.br/reader035/viewer/2022062503/58743b881a28ab0e6c8b588b/html5/thumbnails/77.jpg)
http://martinfowler.com/articles/consumerDrivenContracts.html
http://www.infoq.com/articles/consumer-driven-contracts
https://www.thoughtworks.com/radar/techniques/consumer-driven-contract-testing
https://www.thoughtworks.com/radar/tools/pact-pacto
https://github.com/thoughtworks/pacto
https://github.com/realestate-com-au/pact
REFERÊNCIAS