79
Test-Driven Development hlegius

Test-Driven Development - Introdução

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

Page 1: Test-Driven Development - Introdução

Test-Driven

Developmenthlegius

Page 2: Test-Driven Development - Introdução

Test-Driven Development

TD.. o quê ?

Page 3: Test-Driven Development - Introdução

Era uma vez…

Page 4: Test-Driven Development - Introdução

BarbieSoftware Engineer

Page 5: Test-Driven Development - Introdução

Era uma vez…

Barbie Software Engineer

Page 6: Test-Driven Development - Introdução

Era uma vez…

Barbie Software Engineer

executa

Page 7: Test-Driven Development - Introdução

Era uma vez…

Barbie Software Engineer

SVNversiona

Page 8: Test-Driven Development - Introdução

Várias Barbie’s Software Engineer

Page 9: Test-Driven Development - Introdução

Várias Barbie’s Software Engineer

Modificando a aplicação sem garantias !

Page 10: Test-Driven Development - Introdução

Um bug.

Resultados…

Page 11: Test-Driven Development - Introdução

… e outro.

Resultados…

Page 12: Test-Driven Development - Introdução

… e mais um.

Resultados…

Page 13: Test-Driven Development - Introdução

… outro, outro e tantos outros…

Resultados…

Page 14: Test-Driven Development - Introdução

Desenvolvimento orientado à testes

Page 15: Test-Driven Development - Introdução

Testa

Publica

Codifica

Forma non-TDD

Desenvolvimento orientado à testes

Page 16: Test-Driven Development - Introdução

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

Page 17: Test-Driven Development - Introdução

Mas afinal, qual o objetivo do TDD ?

Page 18: Test-Driven Development - Introdução

Mas afinal, qual o objetivo do TDD ?

Mitigar bugs ?

Page 19: Test-Driven Development - Introdução

Mas afinal, qual o objetivo do TDD ?

Mitigar bugs ?Evitar

re-testes ?

Page 20: Test-Driven Development - Introdução

Mas afinal, qual o objetivo do TDD ?

Mitigar bugs ?Evitar

re-testes ?

Evoluir

o

design ?

Page 21: Test-Driven Development - Introdução

Mas afinal, qual o objetivo do TDD ?

Mitigar bugs ?Evitar

re-testes ?

Evoluir

o

design ?

mimimi

Page 22: Test-Driven Development - Introdução

Mas afinal, qual o objetivo do TDD ?

Mitigar bugs ?Evitar

re-testes ?

Evoluir

o

design ?

mimimi

Validar

o

escopo ?

Page 23: Test-Driven Development - Introdução

Mas antes…

Page 24: Test-Driven Development - Introdução

… falando sobre agile

O Manifesto Ágil

Page 25: Test-Driven Development - Introdução

… falando sobre design

Table Module

Page 26: Test-Driven Development - Introdução

… falando sobre design

Table Module

Fácil para gerar automáticamente;

Page 27: Test-Driven Development - Introdução

… falando sobre design

Table Module

Fácil para gerar automáticamente;

Fácil para developers com pouca

experiência;

Page 28: Test-Driven Development - Introdução

… falando sobre design

Table Module

Fácil para gerar automáticamente;

Fácil para developers com pouca

experiência;

One size fits all;

Page 29: Test-Driven Development - Introdução

… 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;

Page 30: Test-Driven Development - Introdução

… 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;

Page 31: Test-Driven Development - Introdução

… 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.

Page 32: Test-Driven Development - Introdução

… falando sobre design

Table Module

Mais do mesmo: Transaction Script e Service Layer @ PoEAA por Fowler

Domain Model

Page 33: Test-Driven Development - Introdução

… falando sobre princípios

S

O

L

I

D

Page 34: Test-Driven Development - Introdução

… falando sobre princípios

S

O

L

I

D

ingle Responsibility Principle

Page 35: Test-Driven Development - Introdução

… falando sobre princípios

S

O

L

I

D

pen Close Principle

ingle Responsibility Principle

Page 36: Test-Driven Development - Introdução

… falando sobre princípios

S

O

L

I

D

pen Close Principle

ingle Responsibility Principle

iskov Substitution Principle

Page 37: Test-Driven Development - Introdução

… falando sobre princípios

S

O

L

I

D

pen Close Principle

ingle Responsibility Principle

iskov Substitution Principle

nterface Segregation Principle

Page 38: Test-Driven Development - Introdução

… falando sobre princípios

S

O

L

I

D

pen Close Principle

ingle Responsibility Principle

iskov Substitution Principle

nterface Segregation Principle

ependency Inversion Principle

Page 39: Test-Driven Development - Introdução

E agora ele, o TDD.

Page 40: Test-Driven Development - Introdução

Test-Driven Development

Page 41: Test-Driven Development - Introdução

Test-Driven Development

Specification-Driven Design

Soa bem melhor e é menos confuso.

Page 42: Test-Driven Development - Introdução

Test-Driven Development

• Focado na especificação;

• Evolução contínua, e;

• Documentação executável;

• Three-one

Tem como objetivos:

Page 43: Test-Driven Development - Introdução

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:

Page 44: Test-Driven Development - Introdução

Arquitetura dos Testes

Page 45: Test-Driven Development - Introdução

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.

Page 46: Test-Driven Development - Introduçã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.

Page 47: Test-Driven Development - Introdução

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.

Page 48: Test-Driven Development - Introdução

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.

Page 49: Test-Driven Development - Introdução

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.

Page 50: Test-Driven Development - Introdução

Arquitetura dos testes

E o modelo anêmico

Page 51: Test-Driven Development - Introdução

Arquitetura dos testes

Page 52: Test-Driven Development - Introdução

Arquitetura dos testes

• Alto acoplamento;

• SRP, e;

• Dificulta testes de unidade.

Page 53: Test-Driven Development - Introdução

Arquitetura dos testes

Design pattern: Service

• Alto acoplamento;

• SRP, e;

• Dificulta testes de unidade.

Page 54: Test-Driven Development - Introdução

Arquitetura dos testes

Page 55: Test-Driven Development - Introdução

Arquitetura dos testes

• Alto acoplamento;

• Viola SRP;

• Dificulta testes de unidade;

• Baixa legibilidade, e;

• Orientado à função.

Page 56: Test-Driven Development - Introdução

Arquitetura dos testes

• Alto acoplamento;

• Viola SRP;

• Dificulta testes de unidade;

• Baixa legibilidade, e;

• Orientado à função.

Um factory ao init(), melhoraria :)

Page 57: Test-Driven Development - Introdução

The root of all evil is

Page 58: Test-Driven Development - Introdução

Arquitetura dos testes

Ele, o symfony !

Design pattern arquitetônico: Table Module

Design pattern estrutural: Row Data Gateway

Page 59: Test-Driven Development - Introdução

Arquitetura dos testes

• Alto acoplamento;

• SRP;

• Orientado à “tabelas”;

• One size fits all;

• Utiliza-se herença à composição, e;

• Fácil uso.

Page 60: Test-Driven Development - Introdução

Soluções ?

Page 61: Test-Driven Development - Introdução

• Mudar a arquitetura, ou;

• Redobrar atenção aos princípios SOLID.

Page 62: Test-Driven Development - Introdução

Design dos testes

Page 63: Test-Driven Development - Introdução

Design dos testes

Single Responsibility Principle;

Page 64: Test-Driven Development - Introdução

Design dos testes

Single Responsibility Principle;

Baixo acoplamento

Page 65: Test-Driven Development - Introdução

Design dos testes

Single Responsibility Principle;

Baixo acoplamento;

Doc block e annotations na classe

Page 66: Test-Driven Development - Introdução

Design dos testes

Single Responsibility Principle;

Baixo acoplamento;

Doc block e annotations na classe;

Keep It Simple, Stupid.

Page 67: Test-Driven Development - Introdução

Design dos testes

WTF !?

Page 68: Test-Driven Development - Introdução

Design dos testes

Qual o problema aqui ?

Page 69: Test-Driven Development - Introdução

Design dos testes

Page 70: Test-Driven Development - Introdução

Por fim…

Page 71: Test-Driven Development - Introdução

• Entender o que é realmente OO Design;

Page 72: Test-Driven Development - Introdução

• Entender o que é realmente OO Design;

• Não esquecer dos princípios S.O.L.I.D;

Page 73: Test-Driven Development - Introdução

• 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;

Page 74: Test-Driven Development - Introdução

• 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 ! ;

Page 75: Test-Driven Development - Introdução

• 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;

Page 76: Test-Driven Development - Introdução

• 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 *

Page 77: Test-Driven Development - Introdução

E para criar testes…

Page 78: Test-Driven Development - Introdução

E para criar testes…

http://www.phpunit.de ;)

Page 79: Test-Driven Development - Introdução

E isto é apenas o

começo.