SlideShare una empresa de Scribd logo
1 de 19
QUALIDADE DE
CÓDIGO
Test Driven Development
 Por que é importante?
 Código de produção testável
 Refatoração sem medo
 Código melhor estruturado
 O que não testar?
 Cadastros
 Leitura/Gravação de arquivos
 Independência
 Banco de dados
 Arquivos do sistema
 Arquivos de configuração
Mocks
 Então como testar?
 Mocks
 Exemplo DataAccess
 Testar a conversão dos Feriados do SIAP em DateTime
 Biblioteca Moq.
 Testes Unitários
 Deve testar um único método. Todas as outras
dependências que esse método usa devem ser mockadas.
 Evitar métodos estáticos
 Não é possível mocká-los
 DateTime.Now
 Exemplo Business & DateTime.Now
 Mostrar código do SIGEP (ApontamentoServicoDeve)
Exemplo: classe não testável
 Classe não testável:
Refatoração
 O código de produção
deve ser escrito o mais
simples possível para
passar
 Depois de escrever
vários testes e códigos
de produção, pode-se
perceber que há códigos
duplicados ou que
poderiam ser melhores
escritos
 Então chegou a hora de
refatorá-los
Refatorando ConsultaArquivo
 Temos que testar a regra de obter o texto SQL
sem depender de um arquivo do
sistema, como?
 Dependency Inversion
1º
• Vamos fazer a classe ConsultaArquivo não depender mais
dos métodos estáticos da classe File
2º
• ConsultaArquivo exigirá no construtor uma interface
IFileHelper
3º
• IFileHelper conterá 2 métodos: Existe(...) e LeTodoTexto(...)
4º
• Mockamos o IFileHelper para testar o método
ObterConsultaPorNome(...)
ConsultaArquivo Refatorada
Testes de Integração
 Poderíamos testar o FileHelper, mas seria um teste
de Integração e não um teste de unidade.
 Seria um teste de Integração com o sistema de
arquivos do windows
 Testes de Integração se caracterizam por
necessitarem de um ambiente preparado para o
teste funcionar
 Acesso a arquivos
 Acesso ao banco de dados
 Acesso a WebServices
 Testar unidades em conjunto (integradas)
Nomenclatura
 Nome classe de teste:
 NomeClasseTestadaDeve
 NomeClasseTestadaNomeMetodoDeve
 Nome dos métodos do teste:
 Deve ser uma ação que a classe testada deve fazer
 Exemplos:
 PedidoBusinessDeve
 Quebrar_Pedidos_Por_Representante_Quando_Parametro_Estiver_
Setado
 Retornar_Apenas_Pedidos_Faturados_Da_Conta_X
 Totalizar_Itens_Pedidos_Corretamente
 Lancar_Excecao_Quando_Pedido_Estiver_Bloqueado
 Por quê?
 Facilita o entendimento sobre o que está sendo testado
 Facilita para o desenvolvedor escrever o teste
Nomenclatura - AAA
 Arrange
 Organiza os objetos antes de executar o teste
 Act
 Executa o método que está testando
 Assert
 Verifica as condições para que o teste passe
 Por quê?
 Testes mais organizados
 Testes mais limpos
 Bater o olho e saber o que e como certa
funcionalidade está sendo testada
SUGESTÕES DE
MELHORIA
Opiniões e Debates
Muitas dependências
 Classe recebe vários parametros no construtor
 Talvez essa classe deva ser quebrada em mais
classes
 Agrupar os parametros em outra classe e fazer o
construtor receber essa nova classe.
Business
 Acho que não devíamos ficar presos as
Business.
 Regra de negócio deve ser na Business, ok.
 Mas também poderíamos criar outras classes
que a Business usa.
 Exemplo: validação do Pedido é complexa
 Talvez criar uma classe ValidadorPedido(Pedido)
 Passar tudo o que é preciso para validar o Pedido
 Na Business de Pedido chamar essa classe.
 Atualmente os métodos das Business possuem
muito código e as regras estão obscuras
Business
 Acho que poderíamos ter mais Business ao
invés de apenas Business relativas ao Model.
 Exemplo CRM:
CampanhaBusinessComplement
 Possui método CriarAgendamentos
 Poderia ser criado uma Business relativa a
Agendamentos, pois a criação de Agendamentos
é complexa e poderia ser isolada.
Parametros out
 ReadComplete
 Por que não retornar apenas uma classe e nessa
classe colocar todos os parametros out?
 CreateComplete
 Por que não receber essa mesma classe que foi
criada no item anterior ao inves de vários
parametros out?
 Acho que não devíamos ficar presos aos
Models.
 Mais classes poderiam ser criadas para que as
responsabilidades sejam divididas.
Factories
 São classes que funcionam como uma fábrica
de objetos.
 Às vezes para instanciar uma classe, é
requerido vários parametros ou algumas
regras especificas.
 Essas regras poderiam estar encapsuladas em
uma Factory
 Exemplo CRM:
AtividadeFactory
 Poderia ser criado uma classe Factory que
recebesse os objetos destacados e retornasse
uma instancia de AtividadeInfo.
Dependência de Web Services
 Acho que não devíamos usar o Schema gerado
pelo wsdl
 Se o schema mudar, toda a aplicação terá que ser
alterada
 Solução
 Criar nossas próprias classes
 Criar camada intermediária entre nossas classes e o
schema
 Converter nossas classes para o schema
 Converter o schema para nossa classe
 Se schema mudar, precisamos mexer apenas nessa
camada de conversão
 Exemplo ruim: DualNFe usa os schemas
 Exemplo bom: PortalTiss usa classes próprias
Referências
 Software Practices, Pluralsight
 Principles of Object Oriented Design
 Design Patterns
 Clean Code A Handbook of Agile Software
Craftsmanship, Robert C. Martin
 DDD Quickly, Abel Avram & Floyd Marinescu
 Resumo de DDD por Eric Evans

Más contenido relacionado

La actualidad más candente

Zend Framework Estrutura e TDD
Zend Framework Estrutura e TDDZend Framework Estrutura e TDD
Zend Framework Estrutura e TDD
PHP Day Curitiba
 
Por que você não escreve Testes Unitários?
Por que você não escreve Testes Unitários?Por que você não escreve Testes Unitários?
Por que você não escreve Testes Unitários?
Alex Tercete
 
Poo1 aula 2 - java - apresentação do netbeans e 1º programa
Poo1   aula 2 - java - apresentação do netbeans e 1º programaPoo1   aula 2 - java - apresentação do netbeans e 1º programa
Poo1 aula 2 - java - apresentação do netbeans e 1º programa
Denis Sobrenome
 

La actualidad más candente (20)

1° Madrugada de Testes
1° Madrugada de Testes1° Madrugada de Testes
1° Madrugada de Testes
 
Zend Framework Estrutura e TDD
Zend Framework Estrutura e TDDZend Framework Estrutura e TDD
Zend Framework Estrutura e TDD
 
Boas práticas com TDD
Boas práticas com TDD Boas práticas com TDD
Boas práticas com TDD
 
Automação de Teste Funcionais - Selenium
Automação de Teste Funcionais - SeleniumAutomação de Teste Funcionais - Selenium
Automação de Teste Funcionais - Selenium
 
Apresentacao teste
Apresentacao testeApresentacao teste
Apresentacao teste
 
Curso treinamento automação de testes com selenium
Curso treinamento automação de testes com seleniumCurso treinamento automação de testes com selenium
Curso treinamento automação de testes com selenium
 
A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...
 
O poder do TDD
O poder do TDDO poder do TDD
O poder do TDD
 
Testes Unitários/Integrados
Testes Unitários/IntegradosTestes Unitários/Integrados
Testes Unitários/Integrados
 
Por que você não escreve Testes Unitários?
Por que você não escreve Testes Unitários?Por que você não escreve Testes Unitários?
Por que você não escreve Testes Unitários?
 
Por que automatizar testes de software?
Por que automatizar testes de software?Por que automatizar testes de software?
Por que automatizar testes de software?
 
Introdução a tdd
Introdução a tddIntrodução a tdd
Introdução a tdd
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
Poo1 aula 2 - java - apresentação do netbeans e 1º programa
Poo1   aula 2 - java - apresentação do netbeans e 1º programaPoo1   aula 2 - java - apresentação do netbeans e 1º programa
Poo1 aula 2 - java - apresentação do netbeans e 1º programa
 
Selenium Workshop
Selenium Workshop Selenium Workshop
Selenium Workshop
 
Apresentação PhpDescribe
Apresentação PhpDescribeApresentação PhpDescribe
Apresentação PhpDescribe
 
Pensando em java univali turbinando seus testes
Pensando em java univali   turbinando seus testesPensando em java univali   turbinando seus testes
Pensando em java univali turbinando seus testes
 
Aop Aspect J 1.5.4
Aop Aspect J 1.5.4Aop Aspect J 1.5.4
Aop Aspect J 1.5.4
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de Software
 
TDD (Resumo)
TDD (Resumo)TDD (Resumo)
TDD (Resumo)
 

Similar a Qualidade de Código

Similar a Qualidade de Código (20)

Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Treinamento Básico Sobre ASP.NET MVC
Treinamento Básico Sobre ASP.NET MVCTreinamento Básico Sobre ASP.NET MVC
Treinamento Básico Sobre ASP.NET MVC
 
Boas Práticas de programação WordPress
Boas Práticas de programação WordPressBoas Práticas de programação WordPress
Boas Práticas de programação WordPress
 
Aula1
Aula1Aula1
Aula1
 
Programação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com DojoProgramação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com Dojo
 
TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para Testers
 
Modelo de desenvolvimento de software em 3 camadas para Wordpress
Modelo de desenvolvimento de software em 3 camadas para WordpressModelo de desenvolvimento de software em 3 camadas para Wordpress
Modelo de desenvolvimento de software em 3 camadas para Wordpress
 
Desenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesDesenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por Testes
 
Extreme 360 Arquitetura para Aplicações Delphi Spring4D - OOP e RAD
Extreme 360 Arquitetura para Aplicações Delphi Spring4D - OOP e RADExtreme 360 Arquitetura para Aplicações Delphi Spring4D - OOP e RAD
Extreme 360 Arquitetura para Aplicações Delphi Spring4D - OOP e RAD
 
Segurança e automação na Amazon: Lições das trincheiras
Segurança e automação na Amazon: Lições das trincheirasSegurança e automação na Amazon: Lições das trincheiras
Segurança e automação na Amazon: Lições das trincheiras
 
Como fazer um bom desgn de c[odigo em java
Como fazer um bom desgn de c[odigo em javaComo fazer um bom desgn de c[odigo em java
Como fazer um bom desgn de c[odigo em java
 
Iniciando com realm
Iniciando com realmIniciando com realm
Iniciando com realm
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshop
 
Microsoft ALM = Produtividade
Microsoft ALM = ProdutividadeMicrosoft ALM = Produtividade
Microsoft ALM = Produtividade
 
Gestão automática de configuração usando puppet
Gestão automática de configuração usando puppetGestão automática de configuração usando puppet
Gestão automática de configuração usando puppet
 
Gradle spring-hateoas-Lombok
Gradle spring-hateoas-LombokGradle spring-hateoas-Lombok
Gradle spring-hateoas-Lombok
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
 
Java No Setor Público: Produtividade, Flexibilidade e Baixo Custo
Java No Setor Público: Produtividade, Flexibilidade e Baixo CustoJava No Setor Público: Produtividade, Flexibilidade e Baixo Custo
Java No Setor Público: Produtividade, Flexibilidade e Baixo Custo
 
Test driven development
Test driven developmentTest driven development
Test driven development
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com Python
 

Último

Último (9)

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 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
 
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
 
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
 
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
 
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
 
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
 
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
 

Qualidade de Código

  • 2. Test Driven Development  Por que é importante?  Código de produção testável  Refatoração sem medo  Código melhor estruturado  O que não testar?  Cadastros  Leitura/Gravação de arquivos  Independência  Banco de dados  Arquivos do sistema  Arquivos de configuração
  • 3. Mocks  Então como testar?  Mocks  Exemplo DataAccess  Testar a conversão dos Feriados do SIAP em DateTime  Biblioteca Moq.  Testes Unitários  Deve testar um único método. Todas as outras dependências que esse método usa devem ser mockadas.  Evitar métodos estáticos  Não é possível mocká-los  DateTime.Now  Exemplo Business & DateTime.Now  Mostrar código do SIGEP (ApontamentoServicoDeve)
  • 4. Exemplo: classe não testável  Classe não testável:
  • 5. Refatoração  O código de produção deve ser escrito o mais simples possível para passar  Depois de escrever vários testes e códigos de produção, pode-se perceber que há códigos duplicados ou que poderiam ser melhores escritos  Então chegou a hora de refatorá-los
  • 6. Refatorando ConsultaArquivo  Temos que testar a regra de obter o texto SQL sem depender de um arquivo do sistema, como?  Dependency Inversion 1º • Vamos fazer a classe ConsultaArquivo não depender mais dos métodos estáticos da classe File 2º • ConsultaArquivo exigirá no construtor uma interface IFileHelper 3º • IFileHelper conterá 2 métodos: Existe(...) e LeTodoTexto(...) 4º • Mockamos o IFileHelper para testar o método ObterConsultaPorNome(...)
  • 8. Testes de Integração  Poderíamos testar o FileHelper, mas seria um teste de Integração e não um teste de unidade.  Seria um teste de Integração com o sistema de arquivos do windows  Testes de Integração se caracterizam por necessitarem de um ambiente preparado para o teste funcionar  Acesso a arquivos  Acesso ao banco de dados  Acesso a WebServices  Testar unidades em conjunto (integradas)
  • 9. Nomenclatura  Nome classe de teste:  NomeClasseTestadaDeve  NomeClasseTestadaNomeMetodoDeve  Nome dos métodos do teste:  Deve ser uma ação que a classe testada deve fazer  Exemplos:  PedidoBusinessDeve  Quebrar_Pedidos_Por_Representante_Quando_Parametro_Estiver_ Setado  Retornar_Apenas_Pedidos_Faturados_Da_Conta_X  Totalizar_Itens_Pedidos_Corretamente  Lancar_Excecao_Quando_Pedido_Estiver_Bloqueado  Por quê?  Facilita o entendimento sobre o que está sendo testado  Facilita para o desenvolvedor escrever o teste
  • 10. Nomenclatura - AAA  Arrange  Organiza os objetos antes de executar o teste  Act  Executa o método que está testando  Assert  Verifica as condições para que o teste passe  Por quê?  Testes mais organizados  Testes mais limpos  Bater o olho e saber o que e como certa funcionalidade está sendo testada
  • 12. Muitas dependências  Classe recebe vários parametros no construtor  Talvez essa classe deva ser quebrada em mais classes  Agrupar os parametros em outra classe e fazer o construtor receber essa nova classe.
  • 13. Business  Acho que não devíamos ficar presos as Business.  Regra de negócio deve ser na Business, ok.  Mas também poderíamos criar outras classes que a Business usa.  Exemplo: validação do Pedido é complexa  Talvez criar uma classe ValidadorPedido(Pedido)  Passar tudo o que é preciso para validar o Pedido  Na Business de Pedido chamar essa classe.  Atualmente os métodos das Business possuem muito código e as regras estão obscuras
  • 14. Business  Acho que poderíamos ter mais Business ao invés de apenas Business relativas ao Model.  Exemplo CRM: CampanhaBusinessComplement  Possui método CriarAgendamentos  Poderia ser criado uma Business relativa a Agendamentos, pois a criação de Agendamentos é complexa e poderia ser isolada.
  • 15. Parametros out  ReadComplete  Por que não retornar apenas uma classe e nessa classe colocar todos os parametros out?  CreateComplete  Por que não receber essa mesma classe que foi criada no item anterior ao inves de vários parametros out?  Acho que não devíamos ficar presos aos Models.  Mais classes poderiam ser criadas para que as responsabilidades sejam divididas.
  • 16. Factories  São classes que funcionam como uma fábrica de objetos.  Às vezes para instanciar uma classe, é requerido vários parametros ou algumas regras especificas.  Essas regras poderiam estar encapsuladas em uma Factory  Exemplo CRM:
  • 17. AtividadeFactory  Poderia ser criado uma classe Factory que recebesse os objetos destacados e retornasse uma instancia de AtividadeInfo.
  • 18. Dependência de Web Services  Acho que não devíamos usar o Schema gerado pelo wsdl  Se o schema mudar, toda a aplicação terá que ser alterada  Solução  Criar nossas próprias classes  Criar camada intermediária entre nossas classes e o schema  Converter nossas classes para o schema  Converter o schema para nossa classe  Se schema mudar, precisamos mexer apenas nessa camada de conversão  Exemplo ruim: DualNFe usa os schemas  Exemplo bom: PortalTiss usa classes próprias
  • 19. Referências  Software Practices, Pluralsight  Principles of Object Oriented Design  Design Patterns  Clean Code A Handbook of Agile Software Craftsmanship, Robert C. Martin  DDD Quickly, Abel Avram & Floyd Marinescu  Resumo de DDD por Eric Evans