View
448
Download
2
Category
Preview:
Citation preview
Evoluindo App´s e Serviçoscom
Testes de Contrato
@rafaelportela
Você
Vestindo a camisa do
projeto
seu
Chefe
Ajudando como pode
NO GRITOsobre a arte de lidar com complexidade
NO GRITOsobre a arte de lidar com complexidade
Don´t you know that´s toxic?
CONFLITO
Mais pessoasMais timesMais complexidade
CONFLITO
Mais pessoasMais timesMais complexidade
contrato
consumer-driven contracts
testes de contrato
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
Time 1
Time 2
Time 3
Time 4
Time 5
Time 1
Time 2
Time 3
Time 4
Time 5
Time 1
Time 2
Time 3
Time 4
Time 5
Time 1
Time 2
Time 3
Time 4
Time 5
Time 1
Time 2
Time 3
Time 4
Time 5
Time 1
Time 2
Time 3
Time 4
Time 5
Time 1
Time 2
Time 3
Time 4
Time 5
Time 1
Time 2
Time 3
Time 4
Time 5
problema?
problema?ENTENDIMENTO
ENTRE OS
TIMES
uma única app
DIFERENTES
TIMESproblema?
uma única experiência
DIFERENTES
TIMESproblema?
problema?
DEPENDÊNCIAdiscutir funcionalidadespriorizar tarefasdependência de serviçosdeploys sincronizados
problema?
DEPENDÊNCIAdiscutir funcionalidadespriorizar tarefasdependência de serviçosdeploys sincronizados
contrato
Outro exemplo: <insira SEU projeto aqui>
Você e seu time estão desenvolvendo uma aplicação maneira
(web, ou mobile, ou uma api etc)
O projeto cresce.O time cresce.O estresse cresce.
O projeto cresce.O time cresce.O estresse cresce.
Módulo de Produtos
Outro time da empresa quer usar sua listagem de produtos. Massa! :)
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:
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.
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.
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ê: =(
Serviço de Produtos
Código e dados isoladosAcesso apenas via HTTP/Rest
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!)
Consumidor do serviço
Cliente
Time A
Provedor do serviço
Servidor
Time B
GET /products/1
Accept: application/json
200 OK
Content-Type: application/json
{“id”: 1,“name”: “beer”}
REQUEST RESPONSE
• 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)
Deploy a cada
2 semanasDeploy todo dia
{ “id”: 1, “name”: “Duff Beer”, “content”: “341ml”}
GET /products/1
{ “id”: 1, “name”: “Duff Beer”, “content”: “341ml”}
{ “id”: 1, “brand”: “Duff Beer”, “content”: “341ml”}
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!
Sou sempre o último a saber
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”
Ei, tá maluco?A gente já tá usando as medidas com unidades!!
...
Pra mim, tudo certo! Eu só uso o nome e id. ...
Time A
Time B
Se eu soubesse como cada um tá usando
minha API...
Tô meio perdido..
Dá pra deixar claro o que vocês querem?
Sério, preciso saber!
Relaxa, filhão..
A gente precisa de um negócio assim:
“id” -> um número “brand” -> uma string “content” -> número também
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
Por mim.. Só uso o id e o
nome..
“id” -> número “brand” -> string
um objeto json
{ “id”: 1, “brand”: “Duff Beer”, “unit_of_measure”: “ml”, “content”: 341}
inteiro
inteiro
string
{ “properties”: { “id”: {“type”: “integer”}, “brand”: {“type”: “string”}, “unit_of_measure”: {“type”: “string”}, “content”: {“type”: “integer”} }} JSON Schema
Meu pipelinede build
commit• Build• Unit tests• Functional (API level) tests• Contract tests• Deploy• PROFIT $$$
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)
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!!
Se algo der errado, os testes falham.. E não tem deploy.
Friendship never ends!!!
Consumer-driven contracts
BONUS TRACK
Queremos maisumas mudanças!
Queremos maisumas mudanças!
Beleza! Atualizem os
contratos com as mudanças,
e então eu acerto.
JSON Schema
pull request
contrato
JSON Schema
• Build• Unit tests• Functional (API level) tests• Contract tests
pull request
contrato
JSON Schema
• Build• Unit tests• Functional (API level) tests• Contract tests
pull request
contrato
Atualizo o código, implemento o que
elas querem
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
BONUS TRACK
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
SATISFACTION
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
Obrigado!
@rafaelportela
rafaelportela90@gmail.com
Recommended