Evoluindo Apps e Serviços com Testes de Contrato

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