Test-Driven Development - Introdução

Preview:

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 para criar testes…

http://www.phpunit.de ;)

E isto é apenas o

começo.