TDD Projeto e Estrategias
-
Upload
eduardo-mendes-de-oliveira -
Category
Technology
-
view
239 -
download
0
description
Transcript of TDD Projeto e Estrategias
![Page 1: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/1.jpg)
DesenvolvimentoBaseado em TestesProjeto e EstratégiasEduardo [email protected]
![Page 2: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/2.jpg)
@dudumendes
Introdução
![Page 3: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/3.jpg)
@dudumendes
Introdução
O que se quer de um bom projeto
Princípios para alcançar
Situações que esclareçam
![Page 4: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/4.jpg)
@dudumendes
Manutenibilidade
![Page 5: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/5.jpg)
@dudumendes
O sistema OO com TDDSeguir o processo do TDD
Construir o sistema através de uma funcionalidade de cada vez
Quantidade de código crescendo
a única maneira de continuar a entender e mantê-lo
estruturação das funcionalidades em objetos, objetos em módulos, módulos em
![Page 6: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/6.jpg)
@dudumendes
02 estratégiasSoC (Separation of Concerns, Parnas, 1974)
quando se deseja mudar o comportamento de um sistema, deve-se puder ir direto ao ponto
Níveis altos de abstração
Evita-se o trato com a complexidade através da abstração
combinação de componentes ao invés de variáveis e estruturas de controle
![Page 7: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/7.jpg)
@dudumendes
Combinação de componentes
Como dividir o código em componentes?
Quais os limites das interfaces de comunicação?
![Page 8: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/8.jpg)
@dudumendes
Encapsulamento x Ocultação
Encapsulamento
O comportamento de um objeto só deve ser alterado através de sua própria API
Consequência
Ausência de dependências inesperadas entre componentes sem relação
Controle do quanto uma mudança em um objeto irá impactar em outras partes do sistema
Ocultação de informações
Um objeto esconde como implementa suas funcionalidades através da abstração de sua API
Ignoram-se os detalhes de baixo nível
![Page 9: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/9.jpg)
@dudumendes
Dentro e fora do objetoUma decisão de projeto
O que está dentro e fora de cada objeto?
para que o objeto possua uma API coerente
Comunicação entre objetos
mensagens
diretamente com seus vizinhos
Importância
Facilidade de uso de um objeto
Como ele contribui para a qualidade do sistema
![Page 10: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/10.jpg)
@dudumendes
Excesso de exposição
Consequências
Vizinhos farão parte do próprio trabalho do objeto
Comportamento distribuído através de muitos objetos
Forte acomplamento
Alto custo de manutenção
![Page 11: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/11.jpg)
@dudumendes
Excesso de exposição
master.getModelisable().getDockable()
.getCustomizer().getSaveItem.
setEnabled(TRUE)
![Page 12: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/12.jpg)
@dudumendes
Evitar “e”, “ou” e “mas” Cada objeto deve possuir uma única e bem definida funcionalidade
Guia de
quando adicionar funcionalidades a um novo objeto
criar um novo vizinho para o mesmo
Deve-se poder descrever o que um objeto faz sem usar conjunções como “e” , “ou”
![Page 13: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/13.jpg)
@dudumendes
Tipos de Vizinhoso que estes objetos dizem um ao outro?
Dependência
Contexto
A funcionalidade de um objeto depende dos serviços de outros objetos
Consequência
Não é possível criar um objeto sem os demais
![Page 14: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/14.jpg)
@dudumendes
Tipos de Vizinhoso que estes objetos dizem um ao outro?
Notificações
Contexto
Objetos que precisam se manter atualizados das atividades de seus vizinhos
Não precisa saber necessariamente quem está “ouvindo”
Consequência
Desacoplamento de vizinhos
![Page 15: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/15.jpg)
@dudumendes
Tipos de Vizinhoso que estes objetos dizem um ao outro?
Ajustes
Contexto
Vizinhos que ajustam o comportamento dos objetos a partir das necessidades mais amplas do sistema
Exemplo
Objetos de Layout que ajustam a disponibilização de elementos
![Page 16: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/16.jpg)
@dudumendes
O que mais importa é o contexto
Não são regras
Nos ajudam a pensar no projeto do código a partir da perspectiva de suas colaborações
O que é um objeto válido?
Um mesmo objeto pode atuar em mais de um papel
![Page 17: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/17.jpg)
@dudumendes
Composições simplesmais que a soma das partes
Utilização de Associações
Objetos compostos devem
fornecer um comportamento mais simples que a junção de todos os seus componentes
devem ocultar a existência de seus componentes
expor uma abstração simples de seus vizinhos
![Page 18: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/18.jpg)
@dudumendes
moneyEditor.getAmountField().setText(String.valueOf(money.amount)moneyEditor.getCurrencyField().setText(money.currencyCode)
![Page 19: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/19.jpg)
@dudumendes
moneyEditor.setAmountField(money.amount)moneyEditor.setCurrencyField(money.currencyCode)
![Page 20: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/20.jpg)
@dudumendes
moneyEditor.setValue(money);
![Page 21: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/21.jpg)
@dudumendes
Independência de contextoContexto
Um objeto não deve ser implementado dependendo de conhecimento sobre o sistema
Se necessário, ele deve receber esta informação
Objetos com contextos independentes
Relações explícitas
Objetos mais simples
Sistema mais fácil de absorver mudanças
![Page 22: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/22.jpg)
@dudumendes
TDD x Princípios
![Page 23: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/23.jpg)
@dudumendes
PrincípiosSOC
Abstração
Encapsulamento
Ocultação de informações
Vizinhança
Composições simples
Saber o que faz
Não como faz
Unidades coerentes
Independentes do ambiente
Flexibilidade
Adaptação mudanças
![Page 24: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/24.jpg)
@dudumendes
TDD / PrincípiosIniciar com um teste
Descreve-se o que um objeto fa antes de considerar o como
Foco
nível de abstração correta
Teste com intenção obscura
mistura de conceitos
não é hora de codificar
Ocultação de informações
decidir o que deve ser visível a partir do objeto
![Page 25: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/25.jpg)
@dudumendes
TDD / PrincípiosManter testes legíveis
Limite de escopo
Testes muito grandes
Sujeitos são muitos grandes
quebrar em componentes menores
Objetos compostos
devem possuir separação clara de interesses
passíveis de testes simples
![Page 26: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/26.jpg)
@dudumendes
TDD / PrincípiosConhecimento das dependências
Um sujeito em teste precisará de suas dependências
Consequência
Passamos a conhecer as dependências
Melhora-se o entendimento
Apóia a independência de contexto
Dependências implícitas
pode ser trabalhoso de preparar
pode ser necessário “emagrecê-lo”
![Page 27: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/27.jpg)
@dudumendes
Interface / ProtocoloInterface
descreve se 02 componentes se encaixam
Protocolo
descreve se eles trabalham juntos
O TDD torna visível o protocolo de comunicação entre os objetos
![Page 28: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/28.jpg)
@dudumendes
Adicionando funcionalidadesSurgimento de códigos de novas áreas
Ao iniciar novas áreas de código
deve-se esquecer temporariamente julgamentos sobre projeto
apenas escrever código sem se importar com estrutura
Consequência
Ganha-se confiança e experiência
Entende-se as intenções do código
Entretanto código pode se tornar muito grande
![Page 29: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/29.jpg)
@dudumendes
Teste informam
Fragmentar um objeto
se ele se tornou muito grande para se testar facilmente
se falhas de teste se tornaram difíceis de se interpretar
se o domínio está disperso
![Page 30: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/30.jpg)
@dudumendes
Testes e dependências
![Page 31: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/31.jpg)
@dudumendes
Contexto
Componente!
Dependencia!
Associação!Composição!
![Page 32: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/32.jpg)
@dudumendes
Contexto
Para aplicações que dependem de ambientes de execução, escrever testes pode ser um desafio
Testes precisam ser estáveis e quando executados repetidamente eles devem gerar os mesmos resultados
É necessário um modo de controlar o ambiente em que os testes são executados
![Page 33: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/33.jpg)
@dudumendes
Soluções
Configurar o ambiente real
pode ser prático e trazer benefícios reais
nem sempre é viável
Simular o que está faltando
substituindo por um por algo falsificado que se comporte do mesmo jeito
![Page 34: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/34.jpg)
@dudumendes
Estratégia
Componente!
![Page 35: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/35.jpg)
@dudumendes
Estratégia
Componente!
Mock!
Mock!Mock!
Falso
FalsoFalso
![Page 36: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/36.jpg)
@dudumendes
Dublês de TestesTest DoublesMESZAROS
![Page 37: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/37.jpg)
@dudumendes
Double
Dummy Fake Mock Stub Spy
![Page 38: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/38.jpg)
@dudumendes
Testes DublêsDummy Objects
são repassados como parâmetros
mas nunca utilizados
it “deve possuir um nome” doe = Endereco.newc = Cliente.new(“Cliente 1”, e)
expect(c.nome).to eql(“Cliente 1”)end
![Page 39: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/39.jpg)
@dudumendes
Testes Dublês
Fake Objects
Objeto que possuem implementações funcionais, mas normalmente utilizam algum atalho que os torna inadequados para produção
Ex: Bancos de dados em memória
![Page 40: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/40.jpg)
@dudumendes
Testes Dublês
Stubs
Objetos que providenciam respostas pré-configuradas para as chamadas feitas durante os testes
Normalmente, não respondem nada além do que esteja previamente programado para o teste
As respostas são estáticas
![Page 41: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/41.jpg)
@dudumendes
Stub
Fonte: MEZAROS, 2007
![Page 42: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/42.jpg)
@dudumendes
describe Statement doit “usa o nome do cliente” do cliente = double(‘cliente’) cliente.stub(:nome).and_return(“Joao”) statement = Statement.new(cliente) statement.generate.should == “Sentenca do Joao”end
![Page 43: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/43.jpg)
@dudumendes
Testes Dublês
Spy
Comportamento semelhante ao Mock, mas as verificações de comportamento são realizadas após o método testado ser chamado
É capaz de verificar se um determinado método foi chamado pois pode gravar informações
![Page 44: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/44.jpg)
@dudumendes
Spy
Fonte: MEZAROS, 2007
![Page 45: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/45.jpg)
@dudumendes
Testes Dublês
Mocks
Expectativas dos objetos sãopré-programadas antes de se executar um método a ser testado
Objetos fornecem o comportamento correto das chamadas que esperam receber
![Page 46: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/46.jpg)
@dudumendes
Mock
Fonte: MEZAROS, 2007
![Page 47: TDD Projeto e Estrategias](https://reader036.fdocumentos.tips/reader036/viewer/2022062710/5599c9941a28abde6e8b4890/html5/thumbnails/47.jpg)
@dudumendes
Bibliografia
FOWLER, Martin. “Mocks aren’t Stubs”.
FREEMAN, Steve; PRYCE, Nat. Growing Object-Oriented Software, Guiaded by Tests. Addison-Wesley.
MESZAROS, Gerard. xUnit Test Patterns: RefactoringTest Code. Addison-Wesley: 2007
MESZAROS, Gerard. xUnitTest Patterns.com. http://xunitpatterns.com/