SlideShare une entreprise Scribd logo
1  sur  47
Télécharger pour lire hors ligne
Desenvolvimento
Baseado em Testes
Projeto e Estratégias
Eduardo Mendes
edumendes@gmail.com
@dudumendes




Introdução
@dudumendes




Introdução


O que se quer de um bom projeto
Princípios para alcançar
Situações que esclareçam
@dudumendes




Manutenibilidade
@dudumendes




O sistema OO com TDD
Seguir 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
@dudumendes




02 estratégias
 SoC (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
@dudumendes



Combinação de
componentes


Como dividir o código em componentes?
Quais os limites das interfaces de comunicação?
@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
@dudumendes




Dentro e fora do objeto
 Uma 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
@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
@dudumendes




Excesso de exposição
    master.getModelisable()
         .getDockable()
       .getCustomizer()
          .getSaveItem.
      setEnabled(TRUE)
@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”
@dudumendes




Tipos de Vizinhos
o 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
@dudumendes




Tipos de Vizinhos
o 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
@dudumendes




Tipos de Vizinhos
o 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
@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
@dudumendes




Composições simples
mais 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
@dudumendes




moneyEditor.getAmountField().setText(String.valueOf(money.amount)
moneyEditor.getCurrencyField().setText(money.currencyCode)
@dudumendes




moneyEditor.setAmountField(money.amount)
moneyEditor.setCurrencyField(money.currencyCode)
@dudumendes




moneyEditor.setValue(money);
@dudumendes




Independência de contexto
Contexto
  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
@dudumendes




TDD x Princípios
@dudumendes




Princípios
 SOC                   Saber o que faz
 Abstração             Não como faz
 Encapsulamento        Unidades coerentes
 Ocultação de          Independentes do
 informações           ambiente
 Vizinhança            Flexibilidade
 Composições simples   Adaptação mudanças
@dudumendes




TDD / Princípios
 Iniciar 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
@dudumendes




TDD / Princípios
 Manter 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
@dudumendes




TDD / Princípios
 Conhecimento 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”
@dudumendes




Interface / Protocolo
 Interface
   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
@dudumendes




Adicionando funcionalidades
Surgimento 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
@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
@dudumendes




Testes e dependências
@dudumendes




Contexto

                     Dependencia!




                   Componente!


     Composição!                    Associação!
@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
@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
@dudumendes




Estratégia




             Componente!
@dudumendes




Estratégia

                 Falso
                 Mock!




               Componente!


      Falso
       Mock!                 Falso
                             Mock!
@dudumendes




Dublês de Testes
Test Doubles
MESZAROS
@dudumendes




               Double




Dummy   Fake   Mock     Stub      Spy
@dudumendes




Testes Dublês
Dummy Objects
  são repassados como parâmetros
   mas nunca utilizados

       it “deve possuir um nome” do
           e = Endereco.new
           c = Cliente.new(“Cliente 1”, e)

             expect(c.nome).to eql(“Cliente 1”)
       end
@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
@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
@dudumendes




Stub




       Fonte: MEZAROS, 2007
@dudumendes




describe Statement do
it “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
@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
@dudumendes




Spy




      Fonte: MEZAROS, 2007
@dudumendes




Testes Dublês

Mocks
  Expectativas dos objetos são
  pré-programadas antes de se executar um método a
  ser testado
  Objetos fornecem o comportamento correto das
  chamadas que esperam receber
@dudumendes




Mock




       Fonte: MEZAROS, 2007
@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/

Contenu connexe

En vedette

Acesso a banco de dados com JDBC
Acesso a banco de dados com JDBCAcesso a banco de dados com JDBC
Acesso a banco de dados com JDBC
Eduardo Mendes
 
Java Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuraçãoJava Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuração
Eduardo Mendes
 

En vedette (20)

TDD - Prática com RSpec
TDD - Prática com RSpecTDD - Prática com RSpec
TDD - Prática com RSpec
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
Desenvolvimento Web com PHP parte 7
Desenvolvimento Web com PHP parte 7Desenvolvimento Web com PHP parte 7
Desenvolvimento Web com PHP parte 7
 
Rails - parte 1
Rails - parte 1Rails - parte 1
Rails - parte 1
 
Desenvolvimento web com PHP parte 3
Desenvolvimento web com PHP parte 3Desenvolvimento web com PHP parte 3
Desenvolvimento web com PHP parte 3
 
Academia do Arquiteto Globalcode
Academia do Arquiteto GlobalcodeAcademia do Arquiteto Globalcode
Academia do Arquiteto Globalcode
 
Jquery
JqueryJquery
Jquery
 
Introdução à Linguagem Ruby - Fundamentos - Parte 2
 Introdução à Linguagem Ruby - Fundamentos - Parte 2 Introdução à Linguagem Ruby - Fundamentos - Parte 2
Introdução à Linguagem Ruby - Fundamentos - Parte 2
 
Turbinando o desenvolvimento com Eclipse
Turbinando o desenvolvimento com EclipseTurbinando o desenvolvimento com Eclipse
Turbinando o desenvolvimento com Eclipse
 
Academia java intensivo
Academia java intensivoAcademia java intensivo
Academia java intensivo
 
Evolucao de software - parte 1
Evolucao de software - parte 1Evolucao de software - parte 1
Evolucao de software - parte 1
 
AngularJS - Rotas
AngularJS - RotasAngularJS - Rotas
AngularJS - Rotas
 
Teste de Software - parte 1
Teste de Software - parte 1Teste de Software - parte 1
Teste de Software - parte 1
 
Evolucao de software - parte 2
Evolucao de software - parte 2Evolucao de software - parte 2
Evolucao de software - parte 2
 
Html Aula 1 - parte 2
Html Aula 1 - parte 2Html Aula 1 - parte 2
Html Aula 1 - parte 2
 
Desenvolvimento web com PHP parte 4
Desenvolvimento web com PHP parte 4Desenvolvimento web com PHP parte 4
Desenvolvimento web com PHP parte 4
 
RSpec com doubles
RSpec com doublesRSpec com doubles
RSpec com doubles
 
Acesso a banco de dados com JDBC
Acesso a banco de dados com JDBCAcesso a banco de dados com JDBC
Acesso a banco de dados com JDBC
 
Testes de Software parte 2
Testes de Software parte 2Testes de Software parte 2
Testes de Software parte 2
 
Java Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuraçãoJava Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuração
 

Similaire à TDD Projeto e Estrategias

Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven Design
André Borgonovo
 
01 Orientacao A Objetos Programacao
01   Orientacao A Objetos   Programacao01   Orientacao A Objetos   Programacao
01 Orientacao A Objetos Programacao
taniamaciel
 
qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrões
edgarddavidson.com
 
Arquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhrArquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhr
Thiago Boufleuhr
 

Similaire à TDD Projeto e Estrategias (20)

Treinamento DDD .Net
Treinamento DDD .NetTreinamento DDD .Net
Treinamento DDD .Net
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
Desenvolvimento orientado a testes
Desenvolvimento orientado a testesDesenvolvimento orientado a testes
Desenvolvimento orientado a testes
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven Design
 
Modelagem de sistemas
Modelagem de sistemasModelagem de sistemas
Modelagem de sistemas
 
Mock objects - Teste de código com dependências
Mock objects - Teste de código com dependênciasMock objects - Teste de código com dependências
Mock objects - Teste de código com dependências
 
01 Orientacao A Objetos Programacao
01   Orientacao A Objetos   Programacao01   Orientacao A Objetos   Programacao
01 Orientacao A Objetos Programacao
 
qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrões
 
Análise de sistemas oo 1
Análise de sistemas oo   1Análise de sistemas oo   1
Análise de sistemas oo 1
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Test driven development
Test driven developmentTest driven development
Test driven development
 
Java - Boas práticas
Java - Boas práticasJava - Boas práticas
Java - Boas práticas
 
Arquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhrArquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhr
 
Paradigma de orientação a objetos -
Paradigma de orientação a objetos - Paradigma de orientação a objetos -
Paradigma de orientação a objetos -
 
Clean Code
Clean CodeClean Code
Clean Code
 
Softwares que Duram: Uma abordagem Arquitetônica
Softwares que Duram: Uma abordagem ArquitetônicaSoftwares que Duram: Uma abordagem Arquitetônica
Softwares que Duram: Uma abordagem Arquitetônica
 
Growing oos guided_by_tests entire
Growing oos guided_by_tests entireGrowing oos guided_by_tests entire
Growing oos guided_by_tests entire
 
DDD - Domain Driven Design
DDD - Domain Driven DesignDDD - Domain Driven Design
DDD - Domain Driven Design
 
Clean code
Clean codeClean code
Clean code
 

Plus de Eduardo Mendes

Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)
Eduardo Mendes
 

Plus de Eduardo Mendes (20)

JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a Objetos
 
Angular JS - Fundamentos
Angular JS - FundamentosAngular JS - Fundamentos
Angular JS - Fundamentos
 
Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de Projeto
 
Layout Fluido
Layout FluidoLayout Fluido
Layout Fluido
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 
Html - Aula 4
Html - Aula 4Html - Aula 4
Html - Aula 4
 
Html - Aula 3
Html - Aula 3Html - Aula 3
Html - Aula 3
 
Introdução à Internet, Http e HTML
Introdução à Internet, Http e HTMLIntrodução à Internet, Http e HTML
Introdução à Internet, Http e HTML
 
ExtJS-4
ExtJS-4ExtJS-4
ExtJS-4
 
Jquery 2
Jquery 2Jquery 2
Jquery 2
 
Estimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEstimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de Software
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2
 
Validações no Ruby on Rails
Validações no Ruby on Rails Validações no Ruby on Rails
Validações no Ruby on Rails
 
Padrão Iterator
Padrão IteratorPadrão Iterator
Padrão Iterator
 
Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)
 
Padrão Command
Padrão CommandPadrão Command
Padrão Command
 
Padrão Fachada
Padrão FachadaPadrão Fachada
Padrão Fachada
 
Padrão Adapter
Padrão AdapterPadrão Adapter
Padrão Adapter
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 
PHP básico para iniciantes
PHP básico para iniciantesPHP básico para iniciantes
PHP básico para iniciantes
 

Dernier

Dernier (8)

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 

TDD Projeto e Estrategias

  • 1. Desenvolvimento Baseado em Testes Projeto e Estratégias Eduardo Mendes edumendes@gmail.com
  • 3. @dudumendes Introdução O que se quer de um bom projeto Princípios para alcançar Situações que esclareçam
  • 5. @dudumendes O sistema OO com TDD Seguir 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
  • 6. @dudumendes 02 estratégias SoC (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
  • 7. @dudumendes Combinação de componentes Como dividir o código em componentes? Quais os limites das interfaces de comunicação?
  • 8. @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
  • 9. @dudumendes Dentro e fora do objeto Uma 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
  • 10. @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
  • 11. @dudumendes Excesso de exposição master.getModelisable() .getDockable() .getCustomizer() .getSaveItem. setEnabled(TRUE)
  • 12. @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”
  • 13. @dudumendes Tipos de Vizinhos o 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
  • 14. @dudumendes Tipos de Vizinhos o 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
  • 15. @dudumendes Tipos de Vizinhos o 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
  • 16. @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
  • 17. @dudumendes Composições simples mais 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
  • 21. @dudumendes Independência de contexto Contexto 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
  • 23. @dudumendes Princípios SOC Saber o que faz Abstração Não como faz Encapsulamento Unidades coerentes Ocultação de Independentes do informações ambiente Vizinhança Flexibilidade Composições simples Adaptação mudanças
  • 24. @dudumendes TDD / Princípios Iniciar 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
  • 25. @dudumendes TDD / Princípios Manter 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
  • 26. @dudumendes TDD / Princípios Conhecimento 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”
  • 27. @dudumendes Interface / Protocolo Interface 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
  • 28. @dudumendes Adicionando funcionalidades Surgimento 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
  • 29. @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
  • 31. @dudumendes Contexto Dependencia! Componente! Composição! Associação!
  • 32. @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
  • 33. @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
  • 34. @dudumendes Estratégia Componente!
  • 35. @dudumendes Estratégia Falso Mock! Componente! Falso Mock! Falso Mock!
  • 37. @dudumendes Double Dummy Fake Mock Stub Spy
  • 38. @dudumendes Testes Dublês Dummy Objects são repassados como parâmetros mas nunca utilizados it “deve possuir um nome” do e = Endereco.new c = Cliente.new(“Cliente 1”, e) expect(c.nome).to eql(“Cliente 1”) end
  • 39. @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
  • 40. @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
  • 41. @dudumendes Stub Fonte: MEZAROS, 2007
  • 42. @dudumendes describe Statement do it “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
  • 43. @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
  • 44. @dudumendes Spy Fonte: MEZAROS, 2007
  • 45. @dudumendes Testes Dublês Mocks Expectativas dos objetos são pré-programadas antes de se executar um método a ser testado Objetos fornecem o comportamento correto das chamadas que esperam receber
  • 46. @dudumendes Mock Fonte: MEZAROS, 2007
  • 47. @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/