Upload
helio-costa-e-silva
View
865
Download
1
Embed Size (px)
DESCRIPTION
Palestra com foco na introdução ao desenvolvimento orientado à testes, passando em temas como: Design OO; Domain-Driven Design; Modelo Anêmico; Refabricação do código legado; Design Patterns; Princípios OO e boas práticas.
Citation preview
Test-Driven
Developmenthlegius
Test-Driven Development
TD.. o quê ?
Era uma vez…
BarbieSoftware Engineer
Era uma vez…
Barbie Software Engineer
Era uma vez…
Barbie Software Engineer
executa
Era uma vez…
Barbie Software Engineer
SVNversiona
Várias Barbie’s Software Engineer
Várias Barbie’s Software Engineer
Modificando a aplicação sem garantias !
Um bug.
Resultados…
… e outro.
Resultados…
… e mais um.
Resultados…
… outro, outro e tantos outros…
Resultados…
Desenvolvimento orientado à testes
Testa
Publica
Codifica
Forma non-TDD
Desenvolvimento orientado à testes
Desenvolvimento orientado à testes
Testa
Publica
Codifica
Forma non-TDD
Escreve o teste
Cria a implementação
Valida a implementação
Incrementa o teste
Evolui o design da
implementação
A maneira focada em testes
Mas afinal, qual o objetivo do TDD ?
Mas afinal, qual o objetivo do TDD ?
Mitigar bugs ?
Mas afinal, qual o objetivo do TDD ?
Mitigar bugs ?Evitar
re-testes ?
Mas afinal, qual o objetivo do TDD ?
Mitigar bugs ?Evitar
re-testes ?
Evoluir
o
design ?
Mas afinal, qual o objetivo do TDD ?
Mitigar bugs ?Evitar
re-testes ?
Evoluir
o
design ?
mimimi
Mas afinal, qual o objetivo do TDD ?
Mitigar bugs ?Evitar
re-testes ?
Evoluir
o
design ?
mimimi
Validar
o
escopo ?
Mas antes…
… falando sobre agile
O Manifesto Ágil
… falando sobre design
Table Module
… falando sobre design
Table Module
Fácil para gerar automáticamente;
… falando sobre design
Table Module
Fácil para gerar automáticamente;
Fácil para developers com pouca
experiência;
… falando sobre design
Table Module
Fácil para gerar automáticamente;
Fácil para developers com pouca
experiência;
One size fits all;
… falando sobre design
Table Module
Fácil para gerar automáticamente;
Fácil para developers com pouca
experiência;
One size fits all;
Alto acoplamento; viola o SRP;
… falando sobre design
Table Module
Fácil para gerar automáticamente;
Fácil para developers com pouca
experiência;
One size fits all;
Alto acoplamento; viola o SRP;
Pouco flexível, e;
… falando sobre design
Table Module
Fácil para gerar automáticamente;
Fácil para developers com pouca
experiência;
One size fits all;
Alto acoplamento; viola o SRP;
Pouco flexível, e;
Dados e comportamento estão
separados.
… falando sobre design
Table Module
Mais do mesmo: Transaction Script e Service Layer @ PoEAA por Fowler
Domain Model
… falando sobre princípios
S
O
L
I
D
… falando sobre princípios
S
O
L
I
D
ingle Responsibility Principle
… falando sobre princípios
S
O
L
I
D
pen Close Principle
ingle Responsibility Principle
… falando sobre princípios
S
O
L
I
D
pen Close Principle
ingle Responsibility Principle
iskov Substitution Principle
… falando sobre princípios
S
O
L
I
D
pen Close Principle
ingle Responsibility Principle
iskov Substitution Principle
nterface Segregation Principle
… falando sobre princípios
S
O
L
I
D
pen Close Principle
ingle Responsibility Principle
iskov Substitution Principle
nterface Segregation Principle
ependency Inversion Principle
E agora ele, o TDD.
Test-Driven Development
Test-Driven Development
Specification-Driven Design
Soa bem melhor e é menos confuso.
Test-Driven Development
• Focado na especificação;
• Evolução contínua, e;
• Documentação executável;
• Three-one
Tem como objetivos:
Test-Driven Development
• Focado na especificação;
• Evolução contínua, e;
• Documentação executável;
• Three-one
• OODesign;
• Domain-Driven Design;
• Modelo rico;
• Integração Contínua, e;
• Deploy contínuo.
• Three-one
Tem como objetivos: Premissa para:
Arquitetura dos Testes
Arquitetura dos testes
Escreve o teste
Cria a implementação
Valida a implementação
Incrementa o teste
Evolui o design da
implementação
• Escreve-se o teste com o mínimo possível;
• Procure focar-se na especificação;
• Não caia na tentação de codificar
algo antes;
• Verifique se o teste falha
sem a implementação, e;
• Certifique-se de que o teste está validando
o que está no documento de especificação.
Arquitetura dos testes
Escreve o teste
Cria a implementação
Valida a implementação
Incrementa o teste
Evolui o design da
implementação
• Implementação coesa, seguindo um
design simplista baseado no SOLID, por exemplo;
• Não rascunhe. Crie o necessário
para aquela implementação, baseado no
que leu até o momento, e;
• Não rode o teste até ter finalizado.
Arquitetura dos testes
Escreve o teste
Cria a implementação
Valida a implementação
Incrementa o teste
Evolui o design da
implementação
• Execute o teste.
Arquitetura dos testes
Escreve o teste
Cria a implementação
Valida a implementação
Incrementa o teste
Evolui o design da
implementação
• Melhore o design do teste.
Arquitetura dos testes
Escreve o teste
Cria a implementação
Valida a implementação
Incrementa o teste
Evolui o design da
implementação
• Melhore o design da implementação.
Arquitetura dos testes
E o modelo anêmico
Arquitetura dos testes
Arquitetura dos testes
• Alto acoplamento;
• SRP, e;
• Dificulta testes de unidade.
Arquitetura dos testes
Design pattern: Service
• Alto acoplamento;
• SRP, e;
• Dificulta testes de unidade.
Arquitetura dos testes
Arquitetura dos testes
• Alto acoplamento;
• Viola SRP;
• Dificulta testes de unidade;
• Baixa legibilidade, e;
• Orientado à função.
Arquitetura dos testes
• Alto acoplamento;
• Viola SRP;
• Dificulta testes de unidade;
• Baixa legibilidade, e;
• Orientado à função.
Um factory ao init(), melhoraria :)
The root of all evil is
Arquitetura dos testes
Ele, o symfony !
Design pattern arquitetônico: Table Module
Design pattern estrutural: Row Data Gateway
Arquitetura dos testes
• Alto acoplamento;
• SRP;
• Orientado à “tabelas”;
• One size fits all;
• Utiliza-se herença à composição, e;
• Fácil uso.
Soluções ?
• Mudar a arquitetura, ou;
• Redobrar atenção aos princípios SOLID.
Design dos testes
Design dos testes
Single Responsibility Principle;
Design dos testes
Single Responsibility Principle;
Baixo acoplamento
Design dos testes
Single Responsibility Principle;
Baixo acoplamento;
Doc block e annotations na classe
Design dos testes
Single Responsibility Principle;
Baixo acoplamento;
Doc block e annotations na classe;
Keep It Simple, Stupid.
Design dos testes
WTF !?
Design dos testes
Qual o problema aqui ?
Design dos testes
Por fim…
• Entender o que é realmente OO Design;
• Entender o que é realmente OO Design;
• Não esquecer dos princípios S.O.L.I.D;
• Entender o que é realmente OO Design;
• Não esquecer dos princípios S.O.L.I.D;
• #nota TDD é validação de escopo, não
bug finder;
• Entender o que é realmente OO Design;
• Não esquecer dos princípios S.O.L.I.D;
• #nota TDD é validação de escopo, não
bug finder;
• Arquitetura é importante ! ;
• Entender o que é realmente OO Design;
• Não esquecer dos princípios S.O.L.I.D;
• #nota TDD é validação de escopo, não
bug finder;
• Arquitetura é importante ! ;
• Design patterns não são balas-de-prata,
e;
• Entender o que é realmente OO Design;
• Não esquecer dos princípios S.O.L.I.D;
• #nota TDD é validação de escopo, não
bug finder;
• Arquitetura é importante ! ;
• Design patterns não são balas-de-prata,
e;
• Refatore cedo, refatore regularmente *
E para criar testes…
E isto é apenas o
começo.