78
Evoluindo App´s e Serviços com Testes de Contrato @rafaelportel a

Evoluindo Apps e Serviços com Testes de Contrato

Embed Size (px)

Citation preview

Page 1: Evoluindo Apps e Serviços com Testes de Contrato

Evoluindo App´s e Serviçoscom

Testes de Contrato

@rafaelportela

Page 2: Evoluindo Apps e Serviços com Testes de Contrato

Você

Vestindo a camisa do

projeto

seu

Chefe

Ajudando como pode

Page 3: Evoluindo Apps e Serviços com Testes de Contrato

NO GRITOsobre a arte de lidar com complexidade

Page 4: Evoluindo Apps e Serviços com Testes de Contrato

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

CONFLITO

Mais pessoasMais timesMais complexidade

Page 6: Evoluindo Apps e Serviços com Testes de Contrato

CONFLITO

Mais pessoasMais timesMais complexidade

Page 7: Evoluindo Apps e Serviços com Testes de Contrato

contrato

consumer-driven contracts

testes de contrato

Page 8: Evoluindo Apps e Serviços com Testes de Contrato
Page 9: Evoluindo Apps e Serviços com Testes de Contrato
Page 10: Evoluindo Apps e Serviços com 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

Page 11: Evoluindo Apps e Serviços com Testes de Contrato
Page 12: Evoluindo Apps e Serviços com Testes de Contrato
Page 13: Evoluindo Apps e Serviços com Testes de Contrato
Page 14: Evoluindo Apps e Serviços com Testes de Contrato

Time 1

Time 2

Time 3

Time 4

Time 5

Page 15: Evoluindo Apps e Serviços com Testes de Contrato

Time 1

Time 2

Time 3

Time 4

Time 5

Page 16: Evoluindo Apps e Serviços com Testes de Contrato

Time 1

Time 2

Time 3

Time 4

Time 5

Page 17: Evoluindo Apps e Serviços com Testes de Contrato

Time 1

Time 2

Time 3

Time 4

Time 5

Page 18: Evoluindo Apps e Serviços com Testes de Contrato

Time 1

Time 2

Time 3

Time 4

Time 5

Page 19: Evoluindo Apps e Serviços com Testes de Contrato

Time 1

Time 2

Time 3

Time 4

Time 5

Page 20: Evoluindo Apps e Serviços com Testes de Contrato

Time 1

Time 2

Time 3

Time 4

Time 5

Page 21: Evoluindo Apps e Serviços com Testes de Contrato

Time 1

Time 2

Time 3

Time 4

Time 5

Page 22: Evoluindo Apps e Serviços com Testes de Contrato

problema?

Page 23: Evoluindo Apps e Serviços com Testes de Contrato

problema?ENTENDIMENTO

ENTRE OS

TIMES

Page 24: Evoluindo Apps e Serviços com Testes de Contrato

uma única app

DIFERENTES

TIMESproblema?

Page 25: Evoluindo Apps e Serviços com Testes de Contrato

uma única experiência

DIFERENTES

TIMESproblema?

Page 26: Evoluindo Apps e Serviços com Testes de Contrato

problema?

DEPENDÊNCIAdiscutir funcionalidadespriorizar tarefasdependência de serviçosdeploys sincronizados

Page 27: Evoluindo Apps e Serviços com Testes de Contrato

problema?

DEPENDÊNCIAdiscutir funcionalidadespriorizar tarefasdependência de serviçosdeploys sincronizados

contrato

Page 28: Evoluindo Apps e Serviços com Testes de 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)

Page 29: Evoluindo Apps e Serviços com Testes de Contrato

O projeto cresce.O time cresce.O estresse cresce.

Page 30: Evoluindo Apps e Serviços com Testes de Contrato

O projeto cresce.O time cresce.O estresse cresce.

Módulo de Produtos

Page 31: Evoluindo Apps e Serviços com Testes de Contrato

Outro time da empresa quer usar sua listagem de produtos. Massa! :)

Page 32: Evoluindo Apps e Serviços com Testes de Contrato

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

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

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

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

Serviço de Produtos

Código e dados isoladosAcesso apenas via HTTP/Rest

Page 37: Evoluindo Apps e Serviços com Testes de Contrato

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
Page 39: Evoluindo Apps e Serviços com Testes de Contrato

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

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

• 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

Deploy a cada

2 semanasDeploy todo dia

Page 43: Evoluindo Apps e Serviços com Testes de Contrato
Page 44: Evoluindo Apps e Serviços com Testes de Contrato

{ “id”: 1, “name”: “Duff Beer”, “content”: “341ml”}

GET /products/1

Page 45: Evoluindo Apps e Serviços com Testes de Contrato

{ “id”: 1, “name”: “Duff Beer”, “content”: “341ml”}

Page 46: Evoluindo Apps e Serviços com Testes de Contrato

{ “id”: 1, “brand”: “Duff Beer”, “content”: “341ml”}

Page 47: Evoluindo Apps e Serviços com Testes de Contrato

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

Sou sempre o último a saber

Page 49: Evoluindo Apps e Serviços com Testes de Contrato

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

Ei, tá maluco?A gente já tá usando as medidas com unidades!!

...

Page 51: Evoluindo Apps e Serviços com Testes de Contrato

Pra mim, tudo certo! Eu só uso o nome e id. ...

Page 52: Evoluindo Apps e Serviços com Testes de Contrato

Time A

Time B

Page 53: Evoluindo Apps e Serviços com Testes de Contrato

Se eu soubesse como cada um tá usando

minha API...

Tô meio perdido..

Page 54: Evoluindo Apps e Serviços com Testes de Contrato

Dá pra deixar claro o que vocês querem?

Sério, preciso saber!

Page 55: Evoluindo Apps e Serviços com Testes de Contrato

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

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

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

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

{ “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

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

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

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
Page 64: Evoluindo Apps e Serviços com Testes de Contrato

Se algo der errado, os testes falham.. E não tem deploy.

Page 65: Evoluindo Apps e Serviços com Testes de Contrato

Friendship never ends!!!

Page 66: Evoluindo Apps e Serviços com Testes de Contrato

Consumer-driven contracts

Page 67: Evoluindo Apps e Serviços com Testes de Contrato

BONUS TRACK

Page 68: Evoluindo Apps e Serviços com Testes de Contrato

Queremos maisumas mudanças!

Page 69: Evoluindo Apps e Serviços com Testes de Contrato

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

JSON Schema

pull request

contrato

Page 71: Evoluindo Apps e Serviços com Testes de Contrato

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

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

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

BONUS TRACK

Page 75: Evoluindo Apps e Serviços com Testes de Contrato

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

SATISFACTION

Page 77: Evoluindo Apps e Serviços com Testes de Contrato

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

Page 78: Evoluindo Apps e Serviços com Testes de Contrato

Obrigado!

@rafaelportela

[email protected]