Post on 14-Aug-2015
BDD
Mas o que é DDD?
• DDD?
• DDD? • DDD?
• DDD? • DDD?
• DDD?
• DDD? • DDD?
• DDD? • DDD?
• DDD? • DDD?
• DDD? • DDD?
Havia um grande local cheio de aeronaves de um ricaço que morreu.James, seu sobrinho, herdou este local e decidiu que queria abrir um negócio.
Uma loja de aeronaves.E para isso era necessário um sistema...
E aí Bregaida, beleza?
Estou precisando de sua ajuda mais uma vez,
preciso de um sistema para minha loja de
aeronaves.
Domain-Driven Design
Domain-Driven Design
Teremos Tupis, Cherokees, Aeroboeiros,
Paulistinhas e outras aeronaves, com diferentes capacidades e potências.
?
Hum...Então se eu fizer
CapacidadeTO estender de AbstractAeronave, acho
que vai dar certo
?
Domain
Negócio Complexo
Problema Real
Pessoas
Linguagem de Negócio
ConversaSobre o domínio
Para criar um sistema
ConversaSobre o domínio
Para criar um sistema
Precisamos falar a mesma língua!
Língua Ubíqua(Ubiquitous Language)
Temos hangares aqui no nosso espaço, com
vários aviões diferentes...
Nosso cliente chegará no Hangar e usará o sistema para encontrar os melhores
aviões para sua necessidade.
Por exemplo, temos aviões de diferentes cores
e capacidades.
Normalmente o cliente também pode
escolher pela empresa fabricante (Embraer,
Piper, Aviat, etc)
Aviao
-Cor-Capacidade- Fabricante
Cor
-Nome
Capacidade
(Potência, Quantidade Passageiros)
Fabricante
(Piper, Embraer, Aviate, Boeing, etc)
Isso mesmo e nossos aviões possuem um nome
e um prefixo que é sua identificação no Brasil.
Aviao
-id-Nome-Cor
-Capacidade- Fabricante
Cor
-Nome
Capacidade
(Potência, Quantidade Passageiros)
Fabricante
(Airbus, Embraer, Piper, Boeing, etc)
Exatamente, mas nosso cliente vai mesmo
querer pesquisar por Fabricante e nome da
aeronave.
Aviao
-Prefixo-Nome-Cor
-Capacidade- Fabricante
Cor
-Nome
Capacidade
(Potência, Quantidade Passageiros)
Repositório de aviões
buscarPorNome buscarPorFabricante
Fabricante
(Airbus, Embraer, Piper, Boeing, etc)
Aliás outra busca que quero é dado um avião quero saber quais os aviões com mesma
potência.
Creio que com esse nosso repositório fica mais
fácil de saber, né?
Aviao
-Prefixo-Nome-Cor
-Capacidade- Fabricante
-AviõesComMesmaPotência
Cor
-Nome
Capacidade
(Potência, Quantidade Passageiros)
Repositório de aviões
buscarPorNome buscarPorFabricante
Fabricante
(Airbus, Embraer, Piper, Boeing, etc)
public class Aviao {
private Long id;private String nome;
private Fabricante fabricante;private Cor cor;private Capacidade capacidade;
}
public class Fabricante {
private String nome;
//getters & setters}
public class Cor {
private String nome;
//getters & setters}
public class Capacidade {
private String potencia;private String quantidadePassageiro;
//getters & setters}
Repositório... BD? DAO?
O que nosso cliente quer?
public interface AviaoRepository {
List<Aviao> getTodosAvioes();List<Aviao> getAvioesPorNome(String nome);List<Aviao> getAvioesPorFabricante(Fabricante fabricante);List<Aviao> getAvioesPorCapacidade(Capacidade capacidade);Aviao getAviaoPorId(Long id);
}
Como implementar o Repositório?
Poxa é isso mesmo que eu queria, está ficando
muito bom, porém esqueci que quero hangarar juntas
as aeronaves com a mesma potência.
Model
Código
Model
Código
public class Aviao {
//Códigos anteriores... public boolean possuemMesmaPotencia(Aviao outroAviao){
return this.capacidade.getPotencia().equals(outroAviao.getPotencia());}
}
Domain-Driven Design
• Voltado (driven) totalmente ao problema a ser resolvido (domain)
• Ubiquitous Language
• Funciona muito bem com Agile
• Modelos ricos (não anêmicos)
• Nomes importam!
Não importa a tecnologia. O que importa é o domain.
http://image.slidesharecdn.com/bddextent20111029-111113010328-phpapp01/95/behavior-driven-development-pros-and-cons-5-728.jpg?cb=1321171622
Mas o que é BDD?
O que é BDD?
• Foca no comportamento do sistema;
• Visando desenvolvimento voltado a testes;
• Usam uma linguagem comum como visto no DDD;
• Beneficia os desenvolvedores e os usuários de negócio;
• Comporta vários cenários;
• Não apenas o que uma determinada função deve fazer;
• Possui aspectos do DDD e conceitos fundamentais do TDD.
Como fazer?• Narrativa/Estória: (Nome)
• Para ( Valor ao Negócio)
• Eu, como (Papel)
• Desejo poder realizar (Funcionalidade)
• Story: …
• In order to …
• As a …
• I want to …
• Narrativa/Estória: Busca Por Aeronaves
• Para meu sistema de vendas de aeronaves
• Eu, como cliente
• Desejo poder realizar buscas por nome das Aeronaves
Exemplo
O que mais?• Cenários: (Nome)
• Dado que (Estado inicial do sistema)
• Quando (Ação a ser realizada)
• Então (O que deve fazer após a ação)
• Scenario: …
• Given a …
• And …
• When …
• Then …
Exemplo• Cenário I: Busca Aeronaves por nome
• Dado que meu cliente digite o nome da Aeronave
• Quando clicar no botão buscar
• Então o sistema deverá retornar todas as aeronaves disponíveis com aquele nome.
TDD
Mas o que é TDD?
O que é TDD ou Test Driven Development?
• É uma técnica de desenvolvimento de software baseada em um ciclo curto de repetições.
• Escrevendo seus testes antes de escrever o código de produção.
• Ao escrever primeiro os testes:
• Garantimos uma boa qualidade no código (mínimo de sujeira e códigos esquecidos que nunca serão utilizados).
• Garantimos o funcionamento do que está sendo implementado.
• Não precisamos saber tudo de uma vez, conforme eu desenvolvo um teste, crio e implemento as classes que serão utilizadas.
TDD - Test Driven Development
• Escreva um teste que falhe;
• Faça-o passar da maneira mais simples possível;
• Refatore o código.
• É conhecido como Ciclo Vermelho-Verde-Refatora (Red - Green - Refactor).
BDD + TDD
Ferramentas• ASSpec
• BDoc
• BDD para Python
• Behat - PHP
• Bumblebee - Extrai documentação de testes escritos com JUnit.
• beanSpec - Java
• Calabash - Permite rodar testes em aplicativos móveis para Android e iOS
• CppSpec - C++
• cfSpec - ColdFusion
• CSpec - C
• dSpec - Delphi
• Concordion - Ferramenta de testes automatizados em Java para fazer BDD usando textos em HTML para descrever comportamentos.
• Cucumber - (Java, .NET, Ruby, Flex ou qualquer aplicação web através do Watir ou Selenium)
• easyb - Groovy/Java
• EasySpec - Groovy, usável em Java
• GSpec - Groovy
• Instinct - Java
• JavaStubs - Java - Framework de BDD com suporte a Mock e Method Stubbing
• JBee - Java
• JBehave - Java
E muitas outras…https://pt.wikipedia.org/wiki/Behavior_Driven_Development#Ferramentas
Referências• https://en.wikipedia.org/wiki/Behavior-driven_development
• http://eduardopires.net.br/2012/06/ddd-tdd-bdd/
• http://sobrecodigo.com/wp-content/uploads/2011/03/tdd_bdd.png
• http://www.princiweb.com.br/blog/programacao/tdd/tdd-ddd-e-bdd-praticas-de-desenvolvimento.html
• http://www.hascode.com/2011/05/oh-jbehave-baby-behaviour-driven-development-using-jbehave/
• http://arnauld.github.io/incubation/jbehave-get-started/bdd-cycle-around-tdd-cycles.png
• https://anoopjshetty.files.wordpress.com/2012/03/bdd.png
• https://pt.wikipedia.org/wiki/Behavior_Driven_Development#Ferramentas
• http://www.ianbicking.org/
• http://docs.behat.org/en/v2.5/
• http://www.agileandart.com/2010/07/16/ddd-introducao-a-domain-driven-design/
• http://pt.slideshare.net/engenhariadesoftwareagil/ddd-domain-driven-design-5139191
• http://pt.slideshare.net/rponte/entendendo-domaindriven-design?related=1
• http://pt.slideshare.net/giovanni.bassi/programando-com-prazer-com-ddd?related=2
• http://pt.slideshare.net/eduardo.bregaida/ddd-linguagem?related=3
• http://www.infoq.com/br/domain-driven-design
• http://martinfowler.com/tags/domain%20driven%20design.html
• http://www.methodsandtools.com/archive/archive.php?id=97
Referências II• http://www.infoq.com/br/news/2014/09/dddx-evans-challenging
• https://skillsmatter.com/conferences/1776-ddd-exchange-2014
• https://en.wikipedia.org/wiki/Domain-driven_design
• http://martinfowler.com/bliki/UbiquitousLanguage.html
• http://www.buscape.com.br/domain-driven-design-atacando-as-complexidades-no-coracao-do-software-2-ed-2011-eric-evans-8576085046.html#precos
• http://javawora.blogspot.com.br/2012/05/tdd-test-driven-development.html
• https://pt.wikipedia.org/wiki/Test_Driven_Development
• http://www.devmedia.com.br/test-driven-development-tdd-simples-e-pratico/18533
• http://tdd.caelum.com.br/
• http://tableless.com.br/tdd-por-que-usar/
• http://blog.thiagobelem.net/aprendendo-tdd-ou-desenvolvimento-orientado-a-testes/
• http://www.casadocodigo.com.br/products/livro-tdd
• http://agiledata.org/essays/tdd.html
• http://www.desenvolvimentoagil.com.br/xp/praticas/tdd/
• http://imasters.com.br/artigo/24242/desenvolvimento/principios-de-test-driven-development-tdd/
• http://www.johnidouglas.com.br/wp-content/uploads/2014/02/tdd-post.png
• http://pt.slideshare.net/IosifItkin/behavior-driven-development-pros-and-cons
• https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcTAodyDP0DbiRihtiJcWt_slpWtYj4ynHENiYutmBWyXIA4HUSm
Dúvidas?
Obrigado!Eduardo Bregaida - @bregaidaeduardo.bregaida@reservafacil.tur.br
http://javawora.blogspot.com.br