###Consumer Driven Contracts (http://martinfowler.com/articles/consumerDrivenContracts.html)
####Como evoluir um serviço?
Um exemplo: Product Search, serviço que permite procurar produtos. Duas aplicações consomem esse serviço. Essas aplicações utilizam [XSD] (https://en.wikipedia.org/wiki/XML_Schema_(W3C)) para validar a resposta do serviço antes de realizar qualquer processamento. Um terceiro consumidor precisa de um novo campo na resposta do serviço já existente. Duas abordagens para implementar essa alteração:
-
Provedor altera o esquema e os consumidores terão que atualizar a cópia dos seus esquemas para validar corretamente a resposta do serviço, necessitando mudanças de todos os envolvidos (provedor e os três consumidores).
-
Adicionar uma nova operação ao serviço, com um novo esquema. O custo das mudanças fica todo do lado do provedor, mas o serviço irá ficar mais complexo e difícil de manter.
####Visão Geral
Consumer Driven Contracts é uma abordagem para desenvolver/evoluir serviços, onde cada consumidor detalha um conjunto de expectativas a um provedor através de um contrato. Isso garante que exista um entendimento maior de como mudanças efetuadas no lado do serviço, provedor, podem alterar o funcionamento dos consumidores. Assim, os provedores podem sempre ter clareza na hora de atualizar seus serviços, verificando se uma determinada alteração em um serviço em questão pode "quebrar" um consumidor.
- Consumidores - times, projetos, aplicações que consumem informações de um serviço
- Provedores - times, projetos, aplicações que fornecem um serviço
Contratos de Provedores
Detalha todos as funcionalidades de negócio que aquele provedor pode oferecer. Nesse tipo de contrato podem aparecer inúmeros elementos como schemas e policies, mas, essencialmente esses elementos são qualquer artefato que influencie diretamente a estratégia de evolução de um serviço.
Contratos de Consumidores
Expectativas dos consumidores em relação ao provedor. Com esse tipo de contrato, o provedor sabe exatamente o que os consumidores esperam.
Contratos "Consumer-Driven"
Contratos de provedores que surgem somente através da necessidade dos consumidores. Se a necessidade dos consumidores é alterada, esses contratos são atualizados também.
####Detalhes de uma possível implementação
É recomendado utilizar dois tipos de contrato quando implementando esse padrão: contratos do tipo "Consumer-Driven" e contratos de consumidor. Entretanto, nenhum tipo de estrutura é especificado para a criação desses contratos. Tabelas e planilhas são mencionadas como possíveis alternativas. Testes automatizados são mencionados para garantir repetibilidade e execuções em ferramentas de integração contínua.
####Benefícios
Dois benefícios claros quando utilizando contratos do tipo "Consumer-Driven":
- Foco no valor de negócio que o serviço oferece. Um serviço só tem valor se é utilizado. Evoluir um serviço significa que essas alterações serão utilizadas e trarão valor para o negócio. Dessa maneira, provedores possuem somente um contrato enxuto que faz sentido para o negócio (consumidores).
- Entendimento profundo e feedback rápido para alterar planos, permitindo que o impacto de qualquer alteração necessária seja clara em relação as aplicações consumidoras. Isso pode ser utilizado para se ter conversas mais eficientes com consumidores. Além disso, esses contratos podem vir a ser utilizados como um repositório de conhecimento, documentação viva.
####Leituras Interessantes
- Repositório para a versão Ruby do Pact - https://github.com/realestate-com-au/pact
- Diagramas com alguns conceitos de CDC - https://thoughtworks.github.io/pacto/patterns/cdc/
- Tech Radar sobre CDC Testing - https://www.thoughtworks.com/radar/techniques/consumer-driven-contract-testing