Evoluindo App´s e Serviços
com
Testes de Contrato
@rafaelportela
Você
Vestindo a
camisa do
projeto
seu
Chefe
Ajudando como pode
NO GRITO
sobre a arte de lidar com complexidade
NO GRITO
sobre a arte de lidar com complexidade
Don´t you know that´s toxic?
CONFLITO
Mais pessoas
Mais times
Mais complexidade
CONFLITO
Mais pessoas
Mais times
Mais complexidade
contrato
consumer-driven contracts
testes de contrato
Validate
bank
accounts
3-D Secure
Auth
Money
transfer
Login
List items
See details
Comment
Like
Add Card
Pay
Moderate
user...
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
uma única app
DIFERENTES
problema?
uma única experiência
DIFERENTES
problema?
problema?
DEPENDÊNCIA
discutir funcionalidades
priorizar tarefas
dependência de serviços
deploys sincronizados
problema?
DEPENDÊNCIA
discutir funcionalidades
priorizar tarefas
dependência de serviços
deploys sincronizados
contrato
Outro exemplo: <insira SEU projeto aqui>
Você e seu time estão desenvolvendo
uma aplicação maneira
(web, ou mobile, ou uma...
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...
Outro time da empresa quer usar
sua listagem de produtos. Massa! :)
Estamos com pouco tempo. Compartilhe a
string de conex...
Outro time da empresa quer usar
sua listagem de produtos. Massa! :)
Estamos com pouco tempo. Compartilhe a
string de conex...
Outro time da empresa quer usar
sua listagem de produtos. Massa! :)
Estamos com pouco tempo. Compartilhe a
string de conex...
Serviço de
Produtos
Código e dados isolados
Acesso apenas via HTTP/Rest
Serviço de
Produtos
Código e dados isolados
Acesso apenas via HTTP/Rest
Mas responsa-
bilidades estão
isoladas.
Times meno...
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 buil...
Deploy a
cada
2 semanas
Deploy 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 da...
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...
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
“...
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”...
Meu pipeline
de build
commit
• Build
• Unit tests
• Functional (API level) tests
• Contract tests
• Deploy
• PROFIT $$$
Meu pipeline
de build
commit
• Build
• Unit tests
• Functional (API level) tests
• Contract tests
• Deploy
• PROFIT $$$
Va...
Agora o pessoal fica tranquilo e
de boa quando eu aviso com
antecedência que vou deployar
uma breaking change..
Sei até os...
Se algo der errado, os testes
falham.. E não tem deploy.
Friendship never ends!!!
Consumer-driven contracts
BONUS TRACK
Queremos mais
umas mudanças!
Queremos mais
umas 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,
...
JSON
Schema
• Build
• Unit tests
• Functional (API level) tests
• Contract tests
• Deploy
• PROFIT $$$
pull
request
contra...
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...
SATISFACTION
http://martinfowler.com/articles/consumerDrivenContracts.html
http://www.infoq.com/articles/consumer-driven-contracts
http...
Obrigado!
@rafaelportela
rafaelportela90
@gmail.com
Evoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de Contrato
Próximos SlideShares
Carregando em…5
×

Evoluindo Apps e Serviços com Testes de Contrato

445 visualizações

Publicada em

Minha apresentação para o Agile Brazil 2015.

Desenvolver software costuma ser um trabalho que envolve várias pessoas. Quanto mais times e equipes trabalhando juntos, mas complexo é o desenvolvimento. Nessa apresentação nós conversamos sobre a importância de práticas de engenharia, como testes de software e integração contínua, com foco em testes de contrato, isto é, testes de interfaces de serviços entre diferentes aplicações.

Publicada em: Engenharia
0 comentários
2 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
445
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3
Ações
Compartilhamentos
0
Downloads
8
Comentários
0
Gostaram
2
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Evoluindo Apps e Serviços com Testes de Contrato

  1. 1. Evoluindo App´s e Serviços com Testes de Contrato @rafaelportela
  2. 2. Você Vestindo a camisa do projeto seu Chefe Ajudando como pode
  3. 3. NO GRITO sobre a arte de lidar com complexidade
  4. 4. NO GRITO sobre a arte de lidar com complexidade Don´t you know that´s toxic?
  5. 5. CONFLITO Mais pessoas Mais times Mais complexidade
  6. 6. CONFLITO Mais pessoas Mais times Mais complexidade
  7. 7. contrato consumer-driven contracts testes de contrato
  8. 8. Validate bank accounts 3-D Secure Auth Money transfer Login List items See details Comment Like Add Card Pay Moderate users Back end Moderator Bank Android iOS web
  9. 9. Time 1 Time 2 Time 3 Time 4 Time 5
  10. 10. Time 1 Time 2 Time 3 Time 4 Time 5
  11. 11. Time 1 Time 2 Time 3 Time 4 Time 5
  12. 12. Time 1 Time 2 Time 3 Time 4 Time 5
  13. 13. Time 1 Time 2 Time 3 Time 4 Time 5
  14. 14. Time 1 Time 2 Time 3 Time 4 Time 5
  15. 15. Time 1 Time 2 Time 3 Time 4 Time 5
  16. 16. Time 1 Time 2 Time 3 Time 4 Time 5
  17. 17. problema?
  18. 18. problema? ENTENDIMENTO ENTRE OS
  19. 19. uma única app DIFERENTES problema?
  20. 20. uma única experiência DIFERENTES problema?
  21. 21. problema? DEPENDÊNCIA discutir funcionalidades priorizar tarefas dependência de serviços deploys sincronizados
  22. 22. problema? DEPENDÊNCIA discutir funcionalidades priorizar tarefas dependência de serviços deploys sincronizados contrato
  23. 23. Outro exemplo: <insira SEU projeto aqui> Você e seu time estão desenvolvendo uma aplicação maneira (web, ou mobile, ou uma api etc)
  24. 24. O projeto cresce. O time cresce. O estresse cresce.
  25. 25. O projeto cresce. O time cresce. O estresse cresce. Módulo de Produtos
  26. 26. Outro time da empresa quer usar sua listagem de produtos. Massa! :)
  27. 27. 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:
  28. 28. 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.
  29. 29. 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.
  30. 30. 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ê: =(
  31. 31. Serviço de Produtos Código e dados isolados Acesso apenas via HTTP/Rest
  32. 32. Serviço de Produtos Código e dados isolados Acesso 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!)
  33. 33. Consumidor do serviço Cliente Time A Provedor do serviço Servidor Time B
  34. 34. GET /products/1 Accept: application/json 200 OK Content-Type: application/json {“id”: 1,“name”: “beer”} REQUEST RESPONSE
  35. 35. • 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)
  36. 36. Deploy a cada 2 semanas Deploy todo dia
  37. 37. { “id”: 1, “name”: “Duff Beer”, “content”: “341ml” } GET /products/1
  38. 38. { “id”: 1, “name”: “Duff Beer”, “content”: “341ml” }
  39. 39. { “id”: 1, “brand”: “Duff Beer”, “content”: “341ml” }
  40. 40. 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!
  41. 41. Sou sempre o último a saber
  42. 42. 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”
  43. 43. Ei, tá maluco? A gente já tá usando as medidas com unidades!! ...
  44. 44. Pra mim, tudo certo! Eu só uso o nome e id. ...
  45. 45. Time A Time B
  46. 46. Se eu soubesse como cada um tá usando minha API... Tô meio perdido..
  47. 47. Dá pra deixar claro o que vocês querem? Sério, preciso saber!
  48. 48. Relaxa, filhão.. A gente precisa de um negócio assim: “id” -> um número “brand” -> uma string “content” -> número também
  49. 49. 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
  50. 50. Por mim.. Só uso o id e o nome.. “id” -> número “brand” -> string
  51. 51. um objeto json { “id”: 1, “brand”: “Duff Beer”, “unit_of_measure”: “ml”, “content”: 341 } inteiro inteiro string
  52. 52. { “properties”: { “id”: {“type”: “integer”}, “brand”: {“type”: “string”}, “unit_of_measure”: {“type”: “string”}, “content”: {“type”: “integer”} } } JSON Schema
  53. 53. Meu pipeline de build commit • Build • Unit tests • Functional (API level) tests • Contract tests • Deploy • PROFIT $$$
  54. 54. Meu pipeline de 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)
  55. 55. 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!!
  56. 56. Se algo der errado, os testes falham.. E não tem deploy.
  57. 57. Friendship never ends!!!
  58. 58. Consumer-driven contracts
  59. 59. BONUS TRACK
  60. 60. Queremos mais umas mudanças!
  61. 61. Queremos mais umas mudanças! Beleza! Atualizem os contratos com as mudanças, e então eu acerto.
  62. 62. JSON Schema pull request contrato
  63. 63. JSON Schema • Build • Unit tests • Functional (API level) tests • Contract tests pull request contrato
  64. 64. JSON Schema • Build • Unit tests • Functional (API level) tests • Contract tests pull request contrato Atualizo o código, implemento o que elas querem
  65. 65. 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
  66. 66. BONUS TRACK
  67. 67. 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
  68. 68. SATISFACTION
  69. 69. 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
  70. 70. Obrigado! @rafaelportela rafaelportela90 @gmail.com

×