SlideShare uma empresa Scribd logo
1 de 67
Baixar para ler offline
Test-Driven Development - TDD
César Caetano Neto - ccaetano@atech.com.br
● Apresentações e Expectativas
● Coding Dojo
● Era uma vez...
● Introdução ao TDD
● As três Leis e Ciclo de TDD
● Refatoração, Princípios SOLID e Lei de Demeter
● Coding Dojo
● Tech Talk - Ferramentas e Frameworks
Agenda
Test-Driven Development - TDD
Apresentações e Expectativas
Apresentações e Expectativas
● Nome
● Biografia profissional
● Expectativas...
Testes: Todo mundo sabe, mas nem todos fazem (direito).
Test-Driven Development - TDD
Coding Dojo
Coding Dojo
Você se considera um bom programador?
● Em geral, programadores NÃO TREINAM
○ Até mesmo medalhistas olímpicos TREINAM
Coding Dojo
O que é? Para que serve? Benefícios?
Coding Dojo
Dinâmica:
● Pair Programming
● Papéis
○ Sparring (Piloto)
○ Co-Sparring (Co-piloto)
○ Advisors (Conselheiros)
● Rodadas de X minutos
● Foco no COMO e não na solução
Coding Dojo
Qual tal um desafio?
Coding Dojo
Dojo: Lista de Supermercado
Com base em uma lista de compra qualquer e um caminho que você
pode fazer em um supermercado de forma que você irá do primeiro ao
último corredor (ver imagem a seguir) sem precisar voltar em lugares
que você já passou.
FONTE: http://blog.billcode.com.br/2011/09/sugestao-para-primeiro-coding-dojo.html
Coding Dojo
Dojo: Lista de Supermercado
FONTE: http://blog.billcode.com.br/2011/09/sugestao-para-primeiro-coding-dojo.html
Coding Dojo
Dojo: Lista de Supermercado
Problema: Imagine uma situação real, onde você vai no supermercado e faz
uma pequena lista: - desodorante (corredor 5 – posição 3); alho (corredor 1 –
posição 9); shampoo (corredor 5 – posição 2); suco (corredor 1 – posição 1);
ovo (corredor 1 – posição 8); iogurte (corredor 1 – posição 7); escova dental
(corredor 4 – posição 7)
Resultado esperado: 1) suco; 2) iogurte; 3) ovo; 4) alho; 5) escova dental; 6)
shampoo; 7) desodorante.
FONTE: http://blog.billcode.com.br/2011/09/sugestao-para-primeiro-coding-dojo.html
Coding Dojo
Momento reflexão
● O que foi bom?
● O que pode melhorar?
Título em Arial Bold 24 pontos
Subtítulo em Arial Bold 15 pontos ed vulputate fermentum
Test-Driven Development - TDD
Era uma vez...
● Num projeto “não tão tão distante”...
● Uma equipe “fanfarrona” que decidiu...
● TESTES? → “Quick and Dirty”
● Cobrindo o código de produção, bastaria.
● De versão em versão, estimativas aumentaram...
● ATRASOS? → Culpa dos testes...
● A cada deploy, subia aquele “mal cheiro”
Era uma vez...
- Moral da história -
Código de teste é tão importante quanto o de produção.
Era uma vez...
Test-Driven Development - TDD
Introdução ao TDD
Introdução ao TDD
● O que é “testar”?
● Conceitos - Tipos de testes
○ Unidade
○ Integração
○ Stress
○ Carga
○ Performance
○ Outros (Regressão, Mock, Stubs)
O que é TDD?
O que é TDD?
● O que não é?
● Origem do nome
● Extreme Programming
● Princípios:
○ DRY - “Don’t Repeat Yourself”
○ KISS - “Keep It Simple Stupid”
○ YAGNI - “You Ain´t Gonna Need it”
“Code for Tomorrow, design for today.”
Pra quem o TDD é indicado?
● Testes são um meio para um fim
a. Ter CONFIANÇA no código produzido
● Com ele, você vai de:
a. Hesitante → Rápido aprendizado
b. Pouco comunicativo → Melhor comunicação
c. Evitar feedback → Aumentar feedbacks
d. Mal humorado → Confiante no código (que funciona)
Pra quem o TDD é indicado?
Motivação ao TDD
● Motivações (óbvias para nós, devs)
○ Eliminar MEDO e INCERTEZA
● Outras nem tão óbvias
○ Código mais limpo
○ Melhor design
○ Maior flexibilidade
○ Feedback rápido
Motivação ao TDD
Para o TDD fazer parte do seu dia-a-dia, e perdurar.
Seus testes precisam ser FIRST:
● Fast
● Independent
● Repeatable
● Self-Validating
● Timely
Introdução ao TDD
Como saber se escrevi “bons” testes?
● Setup longo?
● Setup duplicado?
● Testes demoram a rodar?
● Testes frágeis?
Introdução ao TDD
Porque o TDD funciona?
● Redução de bugs → menor custo
● Menor stress
● Foco
● Melhor relacionamento da equipe
● Sem builds quebrados
● Confiança interna e externa
● Nova versão → mais funcionalidades (e menos bugs)
Porque o TDD funciona?
“Não teste o código que não é seu" (Biblioteca de terceiros)
"Se você não testa seu código, ele já se tornou legado"
"Não re-escreva nada que você não tenha um teste"
Algumas citações sobre TDD
Test-Driven Development - TDD
As três Leis e o Ciclo TDD
As três Leis do TDD
1. Não escreverás código de produção até que tenhas escrito
um teste que esteja falhando.
2. Não escreverás mais que o suficiente para falhar um teste
de unidade, e não compilar é falhar.
3. Não escreverás mais código que o suficiente para passar o
teste falho.
Ciclo Red-Green-Refactor
RED: Escreva um teste que não funcione, nem mesmo compile
(teste falhando)
Ao escrever o teste falho, você decidiu:
● De “quem” é a funcionalidade?
● Qual nomenclatura (DSL)?
● Qual a resposta certa?
● Quais outros cenários/testes
relacionados?
Ciclo Red-Green-Refactor
GREEN: Faça o teste passar da forma mais simples e rápida
possível
● Objetivo → “barra verde” a qualquer custo
● Foco na resolução do problema/cenário
● Feedback rápido
Ciclo Red-Green-Refactor
REFACTOR: Hora de pagar o débito técnico. Código limpo!
(produção e testes)
● Refatoração sem MEDO
● Princípios SOLID
● Lei de Demeter
● Design Patterns
Test-Driven Development - TDD
Refatoração, Princípios SOLID e a Lei de Demeter
O que é Refatoração?
Refatoração
Refactoring: “A change made to the internal structure of
software to make it easier to understand and cheaper to
modify without changing its observable behavior.” [FOWLER,
1999]
Refactor: “To restructure software by applying a series of
refactorings without changing its observable behavior.”
[FOWLER, 1999]
Por que Refatorar?
Principais motivos:
● Pagar o débito técnico
○ “Code for Tomorrow, design for today.”
● Ajudar a encontrar “bugs”
● Tornar futuras mudanças “baratas”
● Legibilidade
● Legibilidade
● Legibilidade
Refatoração
Algumas técnicas conhecidas:
● Extract Method
● Remove temp with query
● Move method/field
● Extract class
● Hide delegate (Lei de Demeter)
● Remove middle man (Oposto de hide delegate)
● Remove data value with object
● ...
Refatoração
“Qualquer idiota pode escrever código que um
computador possa entender...”
Refatoração
“...Bons programadores escrevem código que
os seres humanos possam entender.”
Martin Fowler
Refatoração
Padrões de Projeto no TDD:
Padrão Escrita do Teste Refatoração
Command x
Value Object x
Null Object x
Template Method x
Factory Method x x
Imposter x x
Composite x x
Collecting Parameter x x
Refatoração
Quando posso apagar meus testes?
● Quando ele não ajuda a aumentar sua confiança
● Quando não ajuda a melhorar a comunicação
Princípios SOLID
Importantes princípios de modelagem OO:
● Single Responsibility Principle - SRP
● Open/Closed Principle - OCP
● Liskov Substitution Principle - LSP
● Interface Segregation Principle - ISP
● Dependency Inversion Principle - DIP
Single Responsibility Principle
“Uma classe deveria ter um único motivo para mudar”
Single Responsibility Principle
● Coesão
● O que é responsabilidade?
● Equilíbrio
○ Rigidez / Fragilidade
○ Complexidade desnecessária
Single Responsibility Principle
“Um ponto de mudança só é um ponto de mudança se a
mudança realmente ocorrer”
Open/Closed Principle
Quando um simples mudança resulta numa sequência de
outras, temos um programa:
● Frágil
● Rigido
● Imprevisível
● Sem re-uso
Open/Closed Principle
“Entidades de Software (classes, módulos, funções, etc.)
devem ser abertas para extensão, mas fechadas para
alteração”
Open/Closed Principle
Quando os requisitos mudam, estende-se um comportamento
adicionando código novo, ao invés de mudar código antigo que
funciona.
Como? → Abstração
Liskov Substitution Principle
● “Design by Contract”
● Violações (Code smells)
○ Run-Time Type Information (RTTI)
○ Cuidado com as relações “É um”
● O princípio é sobre: Comportamento
○ Pré-condições
○ Pós-condições
Interface Segregation Principle
“Clientes não deveriam ser forçados a depender de interfaces
que eles não utilizam.”
Interface Segregation Principle
Interface Segregation Principle
Dependency Inversion Principle
Dependency Inversion Principle
Dependency Inversion Principle
“Módulos de alto nível não devem depender de módulos de
baixo nível. Ambos os níveis deveriam depender de
abstrações.”
Dependency Inversion Principle
“Abstrações não deveriam depender de detalhes. Detalhes é
que devem depender de abstrações.”
Dependency Inversion Principle
Dependency Inversion Principle
Lei de Demeter
Um método de um objeto deveria invocar somente métodos
dos seguintes tipos de objetos:
● Dele próprio
● Dos pâmetros dele
● De qualquer objeto criado ou instanciado
● Seus objetos/componentes diretos (1 nível)
Lei de Demeter
Onde e quando aplicar a Lei de Demeter?
● Chamadas de métodos (normalmente “get”) encadeadas
● Onde há muitos objetos temporários
● Ao importar muitas classes
○ Exemplo: import java.awt.*;
● Design Patterns (GoF)
Test-Driven Development - TDD
Tech Talk - Ferramentas e Frameworks
Referências eletrônicas
● Apresentação:
http://www.slideshare.net/cesarcneto/treinamento-tdd-atech OU
https://portal.atech.com.
br/share/page/site/treinamentos/documentlibrary
● Código fonte no GitHub: http://github.com/cesarcneto/tdd-
course
● Design Patterns e Refatoração: http://sourcemaking.
com/refactoring
● Blog do Aniche:
http://www.aniche.com.br/tag/tdd/
● Princípios de OO
http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
Referências eletrônicas
● DbUnit
http://dbunit.sourceforge.net/howto.html
● Mockito
http://code.google.com/p/mockito/
● DOJOs
http://dojopuzzles.com/
Referências
● BECK, Kent. Test Driven Development: By Example, Addison-Wesley, 2002.
● EVANS, Benjamin J.; VERBURG, Martijn. The Well Grounded Java
Developer, Manning, 2013.
● FOWLER, Martin. Refactoring: Improving the Design of Existing Code,
Addison-Wesley, 1999.
● FREEMAN, Steve; PRYCE, Nat. Growing Object-Oriented Software Guided by
Tests, Addison-Wesley, 2009.
● HUNT, Andrew; THOMAS, David. The Pragmatic Programmer, Addison-
Wesley, 1999.
● MARTIN, Robert C. Clean Code - A Handbook of Agile Software
Craftsmanship, Prentice Hall, 2009.
● McCONNELL, Steve. Code Complete - A Practical Handbook of Software
Construction, 2nd Edition, Microsoft Press, 2004.
● MYERS, Glenford J. The Art of Software Testing, John Wiley & Sons, Inc.,
2004.
TDD: Test-Driven Development e Refatoração

Mais conteúdo relacionado

Mais procurados

Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDouglas V. Pasqua
 
P01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhorP01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhorLeandro Ferreira
 
TDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de TestesTDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de TestesSandro Giacomozzi
 
Desenvolvimento dirigido por comportamento e por teste
Desenvolvimento dirigido por comportamento e por testeDesenvolvimento dirigido por comportamento e por teste
Desenvolvimento dirigido por comportamento e por testeUniversidade Tiradentes
 
Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...
Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...
Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...Adam Victor Brandizzi
 
Boas práticas no desenvolvimento de software através do uso de TDD
Boas práticas no desenvolvimento de software através do uso de TDDBoas práticas no desenvolvimento de software através do uso de TDD
Boas práticas no desenvolvimento de software através do uso de TDDJony Ferreira dos Santos
 
Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?Wellington Moreira
 
O Programador Pragmático
O Programador PragmáticoO Programador Pragmático
O Programador PragmáticoTadeu Marinho
 
TDD (Test-Driven Development)
TDD (Test-Driven Development)TDD (Test-Driven Development)
TDD (Test-Driven Development)Renato Groff
 
Seja Um Programador Pragmatico
Seja Um Programador PragmaticoSeja Um Programador Pragmatico
Seja Um Programador PragmaticoLeonardo Fernandes
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018Renato Groff
 

Mais procurados (20)

Testes Unitários
Testes UnitáriosTestes Unitários
Testes Unitários
 
TDD
TDDTDD
TDD
 
Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHP
 
Teste Driven Development
Teste Driven DevelopmentTeste Driven Development
Teste Driven Development
 
Gof design patterns
Gof design patternsGof design patterns
Gof design patterns
 
P01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhorP01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhor
 
TDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de TestesTDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
 
TDD - Test Driven Development com JAVA
TDD - Test Driven Development com JAVATDD - Test Driven Development com JAVA
TDD - Test Driven Development com JAVA
 
Desenvolvimento dirigido por comportamento e por teste
Desenvolvimento dirigido por comportamento e por testeDesenvolvimento dirigido por comportamento e por teste
Desenvolvimento dirigido por comportamento e por teste
 
Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...
Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...
Desenvolvimento Orientado a Documentação? Utilizando doctests para tornar seu...
 
Boas práticas no desenvolvimento de software através do uso de TDD
Boas práticas no desenvolvimento de software através do uso de TDDBoas práticas no desenvolvimento de software através do uso de TDD
Boas práticas no desenvolvimento de software através do uso de TDD
 
Minicurso de TDD
Minicurso de TDDMinicurso de TDD
Minicurso de TDD
 
Design patterns de uma vez por todas
Design patterns de uma vez por todasDesign patterns de uma vez por todas
Design patterns de uma vez por todas
 
Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?
 
O programador pragmático
O programador pragmáticoO programador pragmático
O programador pragmático
 
O Programador Pragmático
O Programador PragmáticoO Programador Pragmático
O Programador Pragmático
 
TDD (Test-Driven Development)
TDD (Test-Driven Development)TDD (Test-Driven Development)
TDD (Test-Driven Development)
 
Seja Um Programador Pragmatico
Seja Um Programador PragmaticoSeja Um Programador Pragmatico
Seja Um Programador Pragmatico
 
Python tdc2019
Python tdc2019 Python tdc2019
Python tdc2019
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
 

Semelhante a TDD: Test-Driven Development e Refatoração

Teste sua aplicação antes que ela teste você
Teste sua aplicação antes que ela teste vocêTeste sua aplicação antes que ela teste você
Teste sua aplicação antes que ela teste vocêTiago Link
 
Sobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaSobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaRogerio Fontes
 
Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...
Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...
Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...Thiago Barradas
 
TDD com Código Legado
TDD com Código LegadoTDD com Código Legado
TDD com Código LegadoCesar Romero
 
Introdução ao TDD nas soluções Global AppCasting
Introdução ao TDD nas soluções Global AppCastingIntrodução ao TDD nas soluções Global AppCasting
Introdução ao TDD nas soluções Global AppCastingPedro Pereira Martins
 
Coding Dojo - Funcionamento
Coding Dojo - FuncionamentoCoding Dojo - Funcionamento
Coding Dojo - Funcionamentothiagodp
 
Coding Dojos para Aprendizagem de TDD - Há Evidências Científicas? - Ignite T...
Coding Dojos para Aprendizagem de TDD - Há Evidências Científicas? - Ignite T...Coding Dojos para Aprendizagem de TDD - Há Evidências Científicas? - Ignite T...
Coding Dojos para Aprendizagem de TDD - Há Evidências Científicas? - Ignite T...Adolfo Neto
 
O que faz (ou não) um tester no mundo ágil
O que faz (ou não) um tester no mundo ágilO que faz (ou não) um tester no mundo ágil
O que faz (ou não) um tester no mundo ágilSamanta Cicilia
 
Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...
Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...
Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...Developer Academy
 
Como TDD pode influenciar na construção do seu Produto?
Como TDD pode influenciar na construção do seu Produto?Como TDD pode influenciar na construção do seu Produto?
Como TDD pode influenciar na construção do seu Produto?Raphael Paiva
 
Os Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de softwareOs Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de softwareDextra Sistemas / Etec Itu
 
Clean Code: Por um mundo com códigos melhores - SETI 2017
Clean Code: Por um mundo com códigos melhores - SETI 2017Clean Code: Por um mundo com códigos melhores - SETI 2017
Clean Code: Por um mundo com códigos melhores - SETI 2017Thiago Barradas
 

Semelhante a TDD: Test-Driven Development e Refatoração (20)

Teste sua aplicação antes que ela teste você
Teste sua aplicação antes que ela teste vocêTeste sua aplicação antes que ela teste você
Teste sua aplicação antes que ela teste você
 
Sobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaSobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis Uberlândia
 
Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...
Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...
Clean Code: Por um mundo com códigos melhores - The Developers Conference - P...
 
Codigo limpo
Codigo limpoCodigo limpo
Codigo limpo
 
TDD com Código Legado
TDD com Código LegadoTDD com Código Legado
TDD com Código Legado
 
Test First, TDD e outros Bichos
Test First, TDD e outros BichosTest First, TDD e outros Bichos
Test First, TDD e outros Bichos
 
Introdução ao TDD nas soluções Global AppCasting
Introdução ao TDD nas soluções Global AppCastingIntrodução ao TDD nas soluções Global AppCasting
Introdução ao TDD nas soluções Global AppCasting
 
Teste automatizados e tdd
Teste automatizados e tddTeste automatizados e tdd
Teste automatizados e tdd
 
Coding Dojo - Funcionamento
Coding Dojo - FuncionamentoCoding Dojo - Funcionamento
Coding Dojo - Funcionamento
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
BDD em Ação
BDD em AçãoBDD em Ação
BDD em Ação
 
Coding Dojos para Aprendizagem de TDD - Há Evidências Científicas? - Ignite T...
Coding Dojos para Aprendizagem de TDD - Há Evidências Científicas? - Ignite T...Coding Dojos para Aprendizagem de TDD - Há Evidências Científicas? - Ignite T...
Coding Dojos para Aprendizagem de TDD - Há Evidências Científicas? - Ignite T...
 
O que faz (ou não) um tester no mundo ágil
O que faz (ou não) um tester no mundo ágilO que faz (ou não) um tester no mundo ágil
O que faz (ou não) um tester no mundo ágil
 
Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...
Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...
Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...
 
Clean code part 2
Clean code   part 2Clean code   part 2
Clean code part 2
 
Pensando TDD
Pensando TDDPensando TDD
Pensando TDD
 
Como TDD pode influenciar na construção do seu Produto?
Como TDD pode influenciar na construção do seu Produto?Como TDD pode influenciar na construção do seu Produto?
Como TDD pode influenciar na construção do seu Produto?
 
Os Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de softwareOs Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de software
 
Over engineering
Over engineeringOver engineering
Over engineering
 
Clean Code: Por um mundo com códigos melhores - SETI 2017
Clean Code: Por um mundo com códigos melhores - SETI 2017Clean Code: Por um mundo com códigos melhores - SETI 2017
Clean Code: Por um mundo com códigos melhores - SETI 2017
 

TDD: Test-Driven Development e Refatoração

  • 1. Test-Driven Development - TDD César Caetano Neto - ccaetano@atech.com.br
  • 2. ● Apresentações e Expectativas ● Coding Dojo ● Era uma vez... ● Introdução ao TDD ● As três Leis e Ciclo de TDD ● Refatoração, Princípios SOLID e Lei de Demeter ● Coding Dojo ● Tech Talk - Ferramentas e Frameworks Agenda
  • 3. Test-Driven Development - TDD Apresentações e Expectativas
  • 4. Apresentações e Expectativas ● Nome ● Biografia profissional ● Expectativas... Testes: Todo mundo sabe, mas nem todos fazem (direito).
  • 5. Test-Driven Development - TDD Coding Dojo
  • 6. Coding Dojo Você se considera um bom programador? ● Em geral, programadores NÃO TREINAM ○ Até mesmo medalhistas olímpicos TREINAM
  • 7. Coding Dojo O que é? Para que serve? Benefícios?
  • 8. Coding Dojo Dinâmica: ● Pair Programming ● Papéis ○ Sparring (Piloto) ○ Co-Sparring (Co-piloto) ○ Advisors (Conselheiros) ● Rodadas de X minutos ● Foco no COMO e não na solução
  • 9. Coding Dojo Qual tal um desafio?
  • 10. Coding Dojo Dojo: Lista de Supermercado Com base em uma lista de compra qualquer e um caminho que você pode fazer em um supermercado de forma que você irá do primeiro ao último corredor (ver imagem a seguir) sem precisar voltar em lugares que você já passou. FONTE: http://blog.billcode.com.br/2011/09/sugestao-para-primeiro-coding-dojo.html
  • 11. Coding Dojo Dojo: Lista de Supermercado FONTE: http://blog.billcode.com.br/2011/09/sugestao-para-primeiro-coding-dojo.html
  • 12. Coding Dojo Dojo: Lista de Supermercado Problema: Imagine uma situação real, onde você vai no supermercado e faz uma pequena lista: - desodorante (corredor 5 – posição 3); alho (corredor 1 – posição 9); shampoo (corredor 5 – posição 2); suco (corredor 1 – posição 1); ovo (corredor 1 – posição 8); iogurte (corredor 1 – posição 7); escova dental (corredor 4 – posição 7) Resultado esperado: 1) suco; 2) iogurte; 3) ovo; 4) alho; 5) escova dental; 6) shampoo; 7) desodorante. FONTE: http://blog.billcode.com.br/2011/09/sugestao-para-primeiro-coding-dojo.html
  • 13. Coding Dojo Momento reflexão ● O que foi bom? ● O que pode melhorar?
  • 14. Título em Arial Bold 24 pontos Subtítulo em Arial Bold 15 pontos ed vulputate fermentum Test-Driven Development - TDD Era uma vez...
  • 15. ● Num projeto “não tão tão distante”... ● Uma equipe “fanfarrona” que decidiu... ● TESTES? → “Quick and Dirty” ● Cobrindo o código de produção, bastaria. ● De versão em versão, estimativas aumentaram... ● ATRASOS? → Culpa dos testes... ● A cada deploy, subia aquele “mal cheiro” Era uma vez...
  • 16. - Moral da história - Código de teste é tão importante quanto o de produção. Era uma vez...
  • 17. Test-Driven Development - TDD Introdução ao TDD
  • 18. Introdução ao TDD ● O que é “testar”? ● Conceitos - Tipos de testes ○ Unidade ○ Integração ○ Stress ○ Carga ○ Performance ○ Outros (Regressão, Mock, Stubs)
  • 19. O que é TDD?
  • 20. O que é TDD? ● O que não é? ● Origem do nome ● Extreme Programming ● Princípios: ○ DRY - “Don’t Repeat Yourself” ○ KISS - “Keep It Simple Stupid” ○ YAGNI - “You Ain´t Gonna Need it” “Code for Tomorrow, design for today.”
  • 21. Pra quem o TDD é indicado?
  • 22. ● Testes são um meio para um fim a. Ter CONFIANÇA no código produzido ● Com ele, você vai de: a. Hesitante → Rápido aprendizado b. Pouco comunicativo → Melhor comunicação c. Evitar feedback → Aumentar feedbacks d. Mal humorado → Confiante no código (que funciona) Pra quem o TDD é indicado?
  • 24. ● Motivações (óbvias para nós, devs) ○ Eliminar MEDO e INCERTEZA ● Outras nem tão óbvias ○ Código mais limpo ○ Melhor design ○ Maior flexibilidade ○ Feedback rápido Motivação ao TDD
  • 25. Para o TDD fazer parte do seu dia-a-dia, e perdurar. Seus testes precisam ser FIRST: ● Fast ● Independent ● Repeatable ● Self-Validating ● Timely Introdução ao TDD
  • 26. Como saber se escrevi “bons” testes? ● Setup longo? ● Setup duplicado? ● Testes demoram a rodar? ● Testes frágeis? Introdução ao TDD
  • 27. Porque o TDD funciona?
  • 28. ● Redução de bugs → menor custo ● Menor stress ● Foco ● Melhor relacionamento da equipe ● Sem builds quebrados ● Confiança interna e externa ● Nova versão → mais funcionalidades (e menos bugs) Porque o TDD funciona?
  • 29. “Não teste o código que não é seu" (Biblioteca de terceiros) "Se você não testa seu código, ele já se tornou legado" "Não re-escreva nada que você não tenha um teste" Algumas citações sobre TDD
  • 30. Test-Driven Development - TDD As três Leis e o Ciclo TDD
  • 31. As três Leis do TDD 1. Não escreverás código de produção até que tenhas escrito um teste que esteja falhando. 2. Não escreverás mais que o suficiente para falhar um teste de unidade, e não compilar é falhar. 3. Não escreverás mais código que o suficiente para passar o teste falho.
  • 32. Ciclo Red-Green-Refactor RED: Escreva um teste que não funcione, nem mesmo compile (teste falhando) Ao escrever o teste falho, você decidiu: ● De “quem” é a funcionalidade? ● Qual nomenclatura (DSL)? ● Qual a resposta certa? ● Quais outros cenários/testes relacionados?
  • 33. Ciclo Red-Green-Refactor GREEN: Faça o teste passar da forma mais simples e rápida possível ● Objetivo → “barra verde” a qualquer custo ● Foco na resolução do problema/cenário ● Feedback rápido
  • 34. Ciclo Red-Green-Refactor REFACTOR: Hora de pagar o débito técnico. Código limpo! (produção e testes) ● Refatoração sem MEDO ● Princípios SOLID ● Lei de Demeter ● Design Patterns
  • 35. Test-Driven Development - TDD Refatoração, Princípios SOLID e a Lei de Demeter
  • 36. O que é Refatoração?
  • 37. Refatoração Refactoring: “A change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior.” [FOWLER, 1999] Refactor: “To restructure software by applying a series of refactorings without changing its observable behavior.” [FOWLER, 1999]
  • 38. Por que Refatorar? Principais motivos: ● Pagar o débito técnico ○ “Code for Tomorrow, design for today.” ● Ajudar a encontrar “bugs” ● Tornar futuras mudanças “baratas” ● Legibilidade ● Legibilidade ● Legibilidade
  • 39. Refatoração Algumas técnicas conhecidas: ● Extract Method ● Remove temp with query ● Move method/field ● Extract class ● Hide delegate (Lei de Demeter) ● Remove middle man (Oposto de hide delegate) ● Remove data value with object ● ...
  • 40. Refatoração “Qualquer idiota pode escrever código que um computador possa entender...”
  • 41. Refatoração “...Bons programadores escrevem código que os seres humanos possam entender.” Martin Fowler
  • 42. Refatoração Padrões de Projeto no TDD: Padrão Escrita do Teste Refatoração Command x Value Object x Null Object x Template Method x Factory Method x x Imposter x x Composite x x Collecting Parameter x x
  • 43. Refatoração Quando posso apagar meus testes? ● Quando ele não ajuda a aumentar sua confiança ● Quando não ajuda a melhorar a comunicação
  • 44. Princípios SOLID Importantes princípios de modelagem OO: ● Single Responsibility Principle - SRP ● Open/Closed Principle - OCP ● Liskov Substitution Principle - LSP ● Interface Segregation Principle - ISP ● Dependency Inversion Principle - DIP
  • 45. Single Responsibility Principle “Uma classe deveria ter um único motivo para mudar”
  • 46. Single Responsibility Principle ● Coesão ● O que é responsabilidade? ● Equilíbrio ○ Rigidez / Fragilidade ○ Complexidade desnecessária
  • 47. Single Responsibility Principle “Um ponto de mudança só é um ponto de mudança se a mudança realmente ocorrer”
  • 48. Open/Closed Principle Quando um simples mudança resulta numa sequência de outras, temos um programa: ● Frágil ● Rigido ● Imprevisível ● Sem re-uso
  • 49. Open/Closed Principle “Entidades de Software (classes, módulos, funções, etc.) devem ser abertas para extensão, mas fechadas para alteração”
  • 50. Open/Closed Principle Quando os requisitos mudam, estende-se um comportamento adicionando código novo, ao invés de mudar código antigo que funciona. Como? → Abstração
  • 51. Liskov Substitution Principle ● “Design by Contract” ● Violações (Code smells) ○ Run-Time Type Information (RTTI) ○ Cuidado com as relações “É um” ● O princípio é sobre: Comportamento ○ Pré-condições ○ Pós-condições
  • 52. Interface Segregation Principle “Clientes não deveriam ser forçados a depender de interfaces que eles não utilizam.”
  • 57. Dependency Inversion Principle “Módulos de alto nível não devem depender de módulos de baixo nível. Ambos os níveis deveriam depender de abstrações.”
  • 58. Dependency Inversion Principle “Abstrações não deveriam depender de detalhes. Detalhes é que devem depender de abstrações.”
  • 61. Lei de Demeter Um método de um objeto deveria invocar somente métodos dos seguintes tipos de objetos: ● Dele próprio ● Dos pâmetros dele ● De qualquer objeto criado ou instanciado ● Seus objetos/componentes diretos (1 nível)
  • 62. Lei de Demeter Onde e quando aplicar a Lei de Demeter? ● Chamadas de métodos (normalmente “get”) encadeadas ● Onde há muitos objetos temporários ● Ao importar muitas classes ○ Exemplo: import java.awt.*; ● Design Patterns (GoF)
  • 63. Test-Driven Development - TDD Tech Talk - Ferramentas e Frameworks
  • 64. Referências eletrônicas ● Apresentação: http://www.slideshare.net/cesarcneto/treinamento-tdd-atech OU https://portal.atech.com. br/share/page/site/treinamentos/documentlibrary ● Código fonte no GitHub: http://github.com/cesarcneto/tdd- course ● Design Patterns e Refatoração: http://sourcemaking. com/refactoring ● Blog do Aniche: http://www.aniche.com.br/tag/tdd/ ● Princípios de OO http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
  • 65. Referências eletrônicas ● DbUnit http://dbunit.sourceforge.net/howto.html ● Mockito http://code.google.com/p/mockito/ ● DOJOs http://dojopuzzles.com/
  • 66. Referências ● BECK, Kent. Test Driven Development: By Example, Addison-Wesley, 2002. ● EVANS, Benjamin J.; VERBURG, Martijn. The Well Grounded Java Developer, Manning, 2013. ● FOWLER, Martin. Refactoring: Improving the Design of Existing Code, Addison-Wesley, 1999. ● FREEMAN, Steve; PRYCE, Nat. Growing Object-Oriented Software Guided by Tests, Addison-Wesley, 2009. ● HUNT, Andrew; THOMAS, David. The Pragmatic Programmer, Addison- Wesley, 1999. ● MARTIN, Robert C. Clean Code - A Handbook of Agile Software Craftsmanship, Prentice Hall, 2009. ● McCONNELL, Steve. Code Complete - A Practical Handbook of Software Construction, 2nd Edition, Microsoft Press, 2004. ● MYERS, Glenford J. The Art of Software Testing, John Wiley & Sons, Inc., 2004.