Treinamento:Treinamento:
AutomaçãoAutomação
de Testesde Testes
Módulo 01 - HistóriasMódulo 01 - Histórias
Módulo 1 – Histórias 2
IntroduçãoIntrodução

Demoiselle BehaveDemoiselle Behave
 O que é?
 É um framework de integração...
Módulo 1 – Histórias 3
Visão GeralVisão Geral
6) acessar sistema
5) selecionar motor de execução
1) iniciar teste
3) ler h...
Módulo 1 – Histórias 4
IntroduçãoIntrodução

BDD - Behaviour Driven DevelopmentBDD - Behaviour Driven Development
 Proce...
Módulo 1 – Histórias 5
IntroduçãoIntrodução

BDDBDD
 Essência:
 Repensar a abordagem de testes unitários e de aceitação...
Módulo 1 – Histórias 6
IntroduçãoIntrodução

BDDBDD
 A partir destes princípios, North propos um framework BDD
para um a...
Módulo 1 – Histórias 7
IntroduçãoIntrodução

BDDBDD
 Second Generation
 Processo ágil que auxilia o time a entregar sof...
Módulo 1 – Histórias 8
IntroduçãoIntrodução

BDDBDD
 Multiple-stakeholder
 BDD ajuda a eliminar a ideia de um usuário “...
Módulo 1 – Histórias 9
IntroduçãoIntrodução
BDDBDD
 High-automation
 Quando a qualidade da solução é definida, o time pr...
Módulo 1 – Histórias 10
IntroduçãoIntrodução

Especificação de ComportamentoEspecificação de Comportamento
 Um dos grand...
Módulo 1 – Histórias 11
IntroduçãoIntrodução

Especificação de ComportamentoEspecificação de Comportamento
 Quando nos c...
Módulo 1 – Histórias 12
IntroduçãoIntrodução

Linguagem GherkinLinguagem Gherkin
 É uma “Business Readable Domain Specif...
Módulo 1 – Histórias 13
IntroduçãoIntrodução
Especificação FormalEspecificação Formal Especificação FormalEspecificação Fo...
Módulo 1 – Histórias 14
IntroduçãoIntrodução
WebDriver driver = new FirefoxDriver();
driver.get("http://localhost:8080/tre...
Módulo 1 – Histórias 15
IntroduçãoIntrodução
WebDriver driver = new FirefoxDriver();
driver.get("http://localhost:8080/tre...
Módulo 1 – Histórias 16
IntroduçãoIntrodução

Linguagem EstruturaLinguagem Estrutura
 Dado:
 Descreve uma situação
 “D...
Módulo 1 – Histórias 17
IntroduçãoIntrodução

Arquitetura dbehaveArquitetura dbehave
Core
Parser Runner Integration
TECNO...
Módulo 1 – Histórias 18
IntroduçãoIntrodução

Arquitetura dbehaveArquitetura dbehave
 Parser
 Camada responsável pelo c...
Módulo 1 – Histórias 19
IntroduçãoIntrodução

Arquitetura dbehaveArquitetura dbehave
 Parser – Reuso de Histórias
Funcio...
Módulo 1 – Histórias 20
Exercício 1Exercício 1

ObjetivosObjetivos
 Construir uma solução de Controle de Estoque utiliza...
Módulo 1 – Histórias 21
Exercício 1Exercício 1

Configuração do seu AmbienteConfiguração do seu Ambiente
 Espera-se que ...
Módulo 1 – Histórias 22
Exercício 1Exercício 1

Dúvidas?Dúvidas?
 Caso encontre algum problema ou dificuldade durante se...
Módulo 1 – Histórias 23
Exercício 1Exercício 1

Material para DownloadMaterial para Download
 http://sourceforge.net/pro...
Módulo 1 – Histórias 24
Exercício 1Exercício 1

Configuração dos Arquétipos do DemoiselleConfiguração dos Arquétipos do D...
Módulo 1 – Histórias 25
Exercício 1Exercício 1

Configuração dos Snippets do TreinamentoConfiguração dos Snippets do Trei...
Módulo 1 – Histórias 26
Exercício 1Exercício 1

Configuração dos Snippets do TreinamentoConfiguração dos Snippets do Trei...
Módulo 1 – Histórias 27
Exercício 1Exercício 1

Configuração Plugin JBehaveConfiguração Plugin JBehave
 Para que os arqu...
Módulo 1 – Histórias 28
HistóriasHistórias

Criando Projeto 01Criando Projeto 01
 Menu: File : New : Maven Project;
 Vá...
Módulo 1 – Histórias 29
HistóriasHistórias

Criando Projeto 01Criando Projeto 01
 Selecione a última versão do jbehave-j...
Módulo 1 – Histórias 30
HistóriasHistórias

Criando Projeto 01Criando Projeto 01
 Informe o Group Id: br.gov.serpro.beha...
Módulo 1 – Histórias 31
HistóriasHistórias

Criando Projeto 01Criando Projeto 01
 A pasta stories contém os arquivos de
...
Módulo 1 – Histórias 32
Exercício 1Exercício 1

Criação da Classe EstoqueCriação da Classe Estoque
 No pacote “br.gov.se...
Módulo 1 – Histórias 33
Exercício 1Exercício 1

Classe ProdutoClasse Produto
public class Produto implements Comparable<P...
Módulo 1 – Histórias 34
Exercício 1Exercício 1

Classe EstoqueClasse Estoque
public class Estoque {
public static Estoque...
Módulo 1 – Histórias 35
Exercício 1Exercício 1

Pasta de HistóriasPasta de Histórias
 Crie uma pasta chamada estoque
den...
Módulo 1 – Histórias 36
Exercício 1Exercício 1

Histórias: Inclusão de ProdutosHistórias: Inclusão de Produtos
Funcionali...
Módulo 1 – Histórias 37
Exercício 1Exercício 1

Classe EstoqueTest.javaClasse EstoqueTest.java
 Na pasta src/test/java, ...
Módulo 1 – Histórias 38
Exercício 1Exercício 1

Execução da Classe EstoqueTest.javaExecução da Classe EstoqueTest.java
 ...
Módulo 1 – Histórias 39
Exercício 1Exercício 1

Execução da Classe EstoqueTest.javaExecução da Classe EstoqueTest.java
 ...
Módulo 1 – Histórias 40
Exercício 1Exercício 1

Execução da Classe EstoqueTest.javaExecução da Classe EstoqueTest.java
 ...
Módulo 1 – Histórias 41
Exercício 1Exercício 1

Criando classe de passosCriando classe de passos
 No pacote br.gov.serpr...
Módulo 1 – Histórias 42
Exercício 1Exercício 1
public class EstoquePassos implements Step {
Estoque estoque = Estoque.cone...
Módulo 1 – Histórias 43
Exercício 1Exercício 1

Inclusão dos Passos CustomizadosInclusão dos Passos Customizados
 No mét...
Módulo 1 – Histórias 44
Exercício 1Exercício 1

Execução da Classe EstoqueTest.javaExecução da Classe EstoqueTest.java
 ...
Módulo 1 – Histórias 45
Exercício 1Exercício 1

Reuso de HistóriasReuso de Histórias
 Aplique o snippet 09 histórias reu...
Módulo 1 – Histórias 46
Exercício 1Exercício 1

Desenvolvimento Orientado a ComportamentoDesenvolvimento Orientado a Comp...
Módulo 1 – Histórias 47
Exercício 1Exercício 1

Mais históriasMais histórias
 Crie um novo arquivo na pasta src/test/res...
Módulo 1 – Histórias 48
Exercício 1Exercício 1

Desenvolvimento Orientado a ComportamentoDesenvolvimento Orientado a Comp...
Módulo 1 – Histórias 49
Exercício 1Exercício 1

Controle de EstoqueControle de Estoque
 Crie um novo arquivo na pasta sr...
Módulo 1 – Histórias 50
Exercício 1Exercício 1

Desenvolvimento Orientado a ComportamentoDesenvolvimento Orientado a Comp...
Módulo 1 – Histórias 51
Exercício 1Exercício 1

Exercício ComplementarExercício Complementar
 A partir da técnica BDD cr...
Módulo 1 – Histórias 52
ConfiguraçõesConfigurações

behave.propertiesbehave.properties
 Todas as configurações do DBehav...
Módulo 1 – Histórias 53
ConfiguraçõesConfigurações

behave.propertiesbehave.properties
 Ordem de Carregamento
 Propried...
Módulo 1 – Histórias 54
Conclusão do MóduloConclusão do Módulo

ResumoResumo
 Especifique sistemas por histórias!
 O De...
Módulo 1 – Histórias 55
ReferênciasReferências
 Conceitos do BDD: http://pt.wikipedia.org/wiki/Behavior_Driven_Developmen...
Próximos SlideShares
Carregando em…5
×

Demoiselle Behave - Parte 1

8.675 visualizações

Publicada em

Treinamento da ferramenta de automação de testes de software Demoiselle Behave (http://demoiselle.github.io/behave/).

Parte 1: Apresenta conceitos essenciais do BDD e da ferramenta DBehave, além de propor um exercício prático de uso com foco em construção de histórias.

Publicada em: Tecnologia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Demoiselle Behave - Parte 1

  1. 1. Treinamento:Treinamento: AutomaçãoAutomação de Testesde Testes Módulo 01 - HistóriasMódulo 01 - Histórias
  2. 2. Módulo 1 – Histórias 2 IntroduçãoIntrodução  Demoiselle BehaveDemoiselle Behave  O que é?  É um framework de integração para técnicas de Desenvolvimento Orientadas a Comportamento – Behaviour Driven Development (BDD).  É mais que uma ferramenta BDD:  Abstração para ferramentas de BDD;  Abstração para ferramentas de automação de testes;  Abstração para ferramentas de gestão de testes.  É um subprojeto do Framework Demoiselle: (http://www.frameworkdemoiselle.gov.br/).
  3. 3. Módulo 1 – Histórias 3 Visão GeralVisão Geral 6) acessar sistema 5) selecionar motor de execução 1) iniciar teste 3) ler histórias 4) ler mapeamentos de tela 7) registrar resultados 2) selecionar motor BDD Alvo doAlvo do Módulo 1Módulo 1
  4. 4. Módulo 1 – Histórias 4 IntroduçãoIntrodução  BDD - Behaviour Driven DevelopmentBDD - Behaviour Driven Development  Processo de desenvolvimento de software criado por Dan North que combina técnicas e princípios do Test Driver Development – TDD.  Problemas encontrados no TDD:  Onde começa o processo?  O que testar e o que não testar?  O que chamamos de teste?  Como analisar falhas?
  5. 5. Módulo 1 – Histórias 5 IntroduçãoIntrodução  BDDBDD  Essência:  Repensar a abordagem de testes unitários e de aceitação:  Testes unitários iniciados com o prefixo should.  Testes de aceitação escritos como histórias de usuários. Como um [papel] Eu quero [recurso], para que [benefícios] Dado [contexto inicial], quando [evento ocorre], então [garantir alguns resultados]  Os critérios de aceitação escritos como cenários:
  6. 6. Módulo 1 – Histórias 6 IntroduçãoIntrodução  BDDBDD  A partir destes princípios, North propos um framework BDD para um ambiente de colaboração entre desenvolvedores e outros papéis não técnicos, de um projeto de software.  Durante o “Agile specifications, BDD and Testing eXchange” em 2009 Dan North definiu: BDD is a second-generation, outside-in, pull-based,BDD is a second-generation, outside-in, pull-based, multiple-stakeholder, multiple-scale, high-automation,multiple-stakeholder, multiple-scale, high-automation, agile methodology. It describes a cycle of interactionsagile methodology. It describes a cycle of interactions with well-defined outputs, resulting in the deliverywith well-defined outputs, resulting in the delivery of working, tested software that matters.of working, tested software that matters.
  7. 7. Módulo 1 – Histórias 7 IntroduçãoIntrodução  BDDBDD  Second Generation  Processo ágil que auxilia o time a entregar software de alta qualidade, respondendo questões até então em aberto pelos processos ágeis iniciais, tais como documentação e testes.  Outside-in and pull-based  Permite que o software seja construído com foco nos resultados esperados do sistema, assegurando que estes resultados sejam alcançados.  Possível pela colaboração das especificações de forma ilustrativa.  As histórias são criadas apenas quando necessárias.
  8. 8. Módulo 1 – Histórias 8 IntroduçãoIntrodução  BDDBDD  Multiple-stakeholder  BDD ajuda a eliminar a ideia de um usuário “sem forma” reconhecendo que diferentes grupos de pessoas serão afetadas com o software de diferentes maneiras.  Na Gestão de Qualidade de Software, Gerald Weinberg escreveu: "Qualidade é um valor para uma pessoa”.  BDD permite entender e definir a qualidade, especificando para quais pessoas o software trará algum valor e quão necessário será para elas.  Agile  BDD funciona melhor com iterações curtas de trabalho, onde o time especifica, implementa e entrega pequenas partes do software.  Requer equipes multifuncionais para colaborar com as especificações e testes.
  9. 9. Módulo 1 – Histórias 9 IntroduçãoIntrodução BDDBDD  High-automation  Quando a qualidade da solução é definida, o time precisa verificar as funcionalidades do sistema com frequência, comparando-as com os resultados esperados.  Para fazer esta verificação eficaz, ele tem de ser automatizado.  BDD depende fortemente de automação e especificações executáveis.  A automação da definição BDD no nível mais alto é feita com uso de ferramentas como o JBehave.
  10. 10. Módulo 1 – Histórias 10 IntroduçãoIntrodução  Especificação de ComportamentoEspecificação de Comportamento  Um dos grandes riscos na construção de um software é não entender exatamente o que ele deve fazer.  Uma alternativa para reduzir essa dificuldade é fazer uso de exemplos concretos para ilustrar o que se deseja do software.  Cenários de uso são mais eficientes na comunicação do que descrições, por mais detalhadas que sejam.  Utilizar exemplos reais para descrever o comportamento desejado de um sistema, nos mantém conectados com a visão dos nossos stakeholders.
  11. 11. Módulo 1 – Histórias 11 IntroduçãoIntrodução  Especificação de ComportamentoEspecificação de Comportamento  Quando nos comunicamos usando cenários de uso reais conseguimos fazer que nossos clientes “visualizem” a solução em uso.  Dessa forma, conseguimos obter feedbacks úteis e, até algumas boas ideias, antes de escrever qualquer linha de código.
  12. 12. Módulo 1 – Histórias 12 IntroduçãoIntrodução  Linguagem GherkinLinguagem Gherkin  É uma “Business Readable Domain Specific Language (DSL)”. Uma linguagem simples para especificação de domínio de negócio.  É uma linguagem semiformal para construção de testes que avaliam o comportamento da aplicação.  Permite a colaboração de múltiplos atores para a especificação do software. “That said, I do think that the greatest potential benefit of DSLs comes when business people participate directly in the writing of the DSL code” Martin Fowler “That said, I do think that the greatest potential benefit of DSLs comes when business people participate directly in the writing of the DSL code” Martin Fowler
  13. 13. Módulo 1 – Histórias 13 IntroduçãoIntrodução Especificação FormalEspecificação Formal Especificação FormalEspecificação Formal Funcionalidade: Acessa ao Sistema Cenário: Acessa sistema com usuário válido Dado que vou para a tela "Tela de Login" Quando informo "joao" no campo "Usuário" E informo "123" no campo "Campo Senha" Quando clico em "Entrar" Então estou autenticado Especificação TestávelEspecificação Testável transcrição WebDriver driver = new FirefoxDriver(); driver.get("http://localhost:8080/treino/"); WebElement login = driver.findElement(By.xpath("(//input[contai ns(@id, 'formLogin')][contains(@type, 'text')])")); login.clear(); login.sendKeys("joao"); WebElement senha = driver.findElement(By.xpath("(//input[contai ns(@id, 'formLogin')][contains(@type, 'password')])")); senha.sendKeys("123"); WebElement botaoOk = driver.findElement(By.xpath("(//button[conta ins(@type, 'submit')])")); botaoOk.click(); Linguagem de ProgramaçãoLinguagem de Programação transcrição
  14. 14. Módulo 1 – Histórias 14 IntroduçãoIntrodução WebDriver driver = new FirefoxDriver(); driver.get("http://localhost:8080/treino/"); WebElement login = driver.findElement(By.xpath("(//input[contai ns(@id, 'formLogin')][contains(@type, 'text')])")); login.click(); login.clear(); login.sendKeys("joao"); WebElement senha = driver.findElement(By.xpath("(//input[contai ns(@id, 'formLogin')][contains(@type, 'password')])")); senha.clear(); senha.sendKeys("123"); WebElement botaoOk = driver.findElement(By.xpath("(//button[conta ins(@type, 'submit')])")); botaoOk.click(); Funcionalidade: Acessa ao Sistema Cenário: Acessa sistema com usuário válido Dado que vou para a tela "Tela de Login" Quando informo "joao" no campo "Usuário" E informo "123" no campo "Campo Senha" Quando clico em "Entrar" Então estou autenticado BenefíciosBenefícios CustoCusto ManutençãoManutenção AprendizagemAprendizagem ProdutividadeProdutividade
  15. 15. Módulo 1 – Histórias 15 IntroduçãoIntrodução WebDriver driver = new FirefoxDriver(); driver.get("http://localhost:8080/treino/"); WebElement login = driver.findElement(By.xpath("(//input[contai ns(@id, 'formLogin')][contains(@type, 'text')])")); login.click(); login.clear(); login.sendKeys("joao"); WebElement senha = driver.findElement(By.xpath("(//input[contai ns(@id, 'formLogin')][contains(@type, 'password')])")); senha.clear(); senha.sendKeys("123"); WebElement botaoOk = driver.findElement(By.xpath("(//button[conta ins(@type, 'submit')])")); botaoOk.click(); Funcionalidade: Acessa ao Sistema Cenário: Acessa sistema com usuário válido Dado que vou para a tela "Tela de Login" Quando informo "joao" no campo "Usuário" E informo "123" no campo "Campo Senha" Quando clico em "Entrar" Então estou autenticado BenefíciosBenefícios ColaboraçãoColaboração
  16. 16. Módulo 1 – Histórias 16 IntroduçãoIntrodução  Linguagem EstruturaLinguagem Estrutura  Dado:  Descreve uma situação  “Dado que um cliente desistiu da compra”  Quando:  Descreve uma certa ação  “Quando solicito a exclusão de um produto”  Então:  Descreve os resultados esperados  “Então o sistema apresentará uma mensagem de erro”  E:  Repete o último termo  “Então a lista de usuários é apresentada”  “E uma mensagem é apresentada”
  17. 17. Módulo 1 – Histórias 17 IntroduçãoIntrodução  Arquitetura dbehaveArquitetura dbehave Core Parser Runner Integration TECNOLOGIAS JBehave Concordion Cucumber TECNOLOGIAS Selenium FEST TECNOLOGIAS ALM - RQM
  18. 18. Módulo 1 – Histórias 18 IntroduçãoIntrodução  Arquitetura dbehaveArquitetura dbehave  Parser  Camada responsável pelo carregamento das histórias.  Usa como implementação de referência a linguagem Gherkin e o framework Jbehave.  Pode ser extensível para outras linguagens.  Fornece o recurso para Reuso de Histórias. Parser TECNOLOGIAS JBehave Concordion Cucumber
  19. 19. Módulo 1 – Histórias 19 IntroduçãoIntrodução  Arquitetura dbehaveArquitetura dbehave  Parser – Reuso de Histórias Funcionalidade: Acesso ao Sistema Como um: operador do sistema Eu quero: ser autenticado por meio de senha De modo que: o acesso ao sistema seja dado apenas aos operadores Cadastrados Cenário: Acessar o sistema com o usuário "{usuário}" e senha "{senha}" Dado que vou para a tela "Tela de Login" Quando informo "{usuário}" no campo "Campo Usuário" E informo "{senha}" no campo "Campo Senha" Quando clico em "Entrar" Então será exibido "Seja bem vindo" Cenário: Acessar o Sistema XPTO Acessar o sistema com o usuário "06762344887" e senha "188542"
  20. 20. Módulo 1 – Histórias 20 Exercício 1Exercício 1  ObjetivosObjetivos  Construir uma solução de Controle de Estoque utilizando a técnica de BDD.  Criar as histórias do sistema utilizando os termos: Dado, Quando e Então.  Criar um projeto utilizando os modelos de projeto do Demoiselle Behave.  Entender a técnica de reuso de cenários.
  21. 21. Módulo 1 – Histórias 21 Exercício 1Exercício 1  Configuração do seu AmbienteConfiguração do seu Ambiente  Espera-se que o ambiente de treinamento contenha os seguintes softwares instalados: Software Versão Objetivo Site Compilador Java (JDK) 1.6 ou superior Compilação dos projetos http://www.oracle.com/technetwork/java/javase /downloads/index.html Eclipse IDE for Java EE Developers Luna IDE para desenvolvimento dos projetos https://www.eclipse.org/downloads/packages/e clipse-standard-432/keplersr2 JBehave Eclipse Plugin 1.0.0.201 40605- 0717 Integração com projetos Maven http://jbehave.org/eclipse-integration.html Navegador Firefox 17 ou superior Navegador padrão para os exercícios https://www.mozilla.org/pt-BR/firefox/ Navegador Google Chrome 33 ou superior Navegador para o exercício do módulo 2 http://www.google.com/intl/pt- BR/chrome/browser/
  22. 22. Módulo 1 – Histórias 22 Exercício 1Exercício 1  Dúvidas?Dúvidas?  Caso encontre algum problema ou dificuldade durante seu treinamento abra uma questão no GitHub:  https://github.com/demoiselle/behave/issues Agradecemos seu feedback!Agradecemos seu feedback!
  23. 23. Módulo 1 – Histórias 23 Exercício 1Exercício 1  Material para DownloadMaterial para Download  http://sourceforge.net/projects/demoiselle/files/tools/behave/ Arquivo com os trechos de código para realização dos exercícios Aplicação de treinamento para realizar os testes sugeridos pelos exercícios
  24. 24. Módulo 1 – Histórias 24 Exercício 1Exercício 1  Configuração dos Arquétipos do DemoiselleConfiguração dos Arquétipos do Demoiselle  Abra o eclipse.  Acione o menu:  Window → Preferences → Maven → Archetypes  Botão: “Add Remote Catalog...”  Informe na tela com o título “Remote Archetype Catalog”:  Catalog File: http://demoiselle.sourceforge.net/repository/archetype-catalog.xml  Description: Demoiselle Behave  Confirme e feche as janelas de preferências do Window
  25. 25. Módulo 1 – Histórias 25 Exercício 1Exercício 1  Configuração dos Snippets do TreinamentoConfiguração dos Snippets do Treinamento  Os snippets são estruturas de texto pré-definidas utilizadas para agilizar a implementação de alguns trechos de código ao longo de todos os laboratórios.
  26. 26. Módulo 1 – Histórias 26 Exercício 1Exercício 1  Configuração dos Snippets do TreinamentoConfiguração dos Snippets do Treinamento  Abra a janela de Snippets por meio do menu:  Window → Show View → Other... → General → Snippets:  Clique com o botão direito sobre o Snippet, selecione o menu “Customize...”. Na sequencia clique no botão Import e importe o arquivo snippets-exercicios.xml, localizado no material do treinamento.
  27. 27. Módulo 1 – Histórias 27 Exercício 1Exercício 1  Configuração Plugin JBehaveConfiguração Plugin JBehave  Para que os arquivos de histórias tenham o recurso de autocompletar configure o plugin do JBehave:  Menu: Window → Preferences → JBehave → Project Settings  Altere a língua para português: pt
  28. 28. Módulo 1 – Histórias 28 HistóriasHistórias  Criando Projeto 01Criando Projeto 01  Menu: File : New : Maven Project;  Vá para a próxima tela (next);  Selecione o Catálogo: Demoiselle Behave.
  29. 29. Módulo 1 – Histórias 29 HistóriasHistórias  Criando Projeto 01Criando Projeto 01  Selecione a última versão do jbehave-junit-archetype:
  30. 30. Módulo 1 – Histórias 30 HistóriasHistórias  Criando Projeto 01Criando Projeto 01  Informe o Group Id: br.gov.serpro.behave;  Informe o Artifact Id: projeto01;  Clique em Finish.
  31. 31. Módulo 1 – Histórias 31 HistóriasHistórias  Criando Projeto 01Criando Projeto 01  A pasta stories contém os arquivos de histórias BDD do seu projeto.  Recomenda-se criar uma estrutura de subpastas para organizar os arquivos de histórias, conforme as necessidades do projeto.
  32. 32. Módulo 1 – Histórias 32 Exercício 1Exercício 1  Criação da Classe EstoqueCriação da Classe Estoque  No pacote “br.gov.serpro.behave.projeto01” da pasta “src/main/java”, crie uma classe Java chamada “Produto”;  Substitua o conteúdo da classe “Produto” pelo snippet “01 Classe Produto”;  Crie uma classe Java chamada “Estoque”;  Substitua o conteúdo da classe “Estoque” pelo snippet “02 Classe Estoque”.
  33. 33. Módulo 1 – Histórias 33 Exercício 1Exercício 1  Classe ProdutoClasse Produto public class Produto implements Comparable<Produto> { private String nome; private int quantidade; ... @Override public int compareTo(Produto produto) { return nome.compareTo(produto.getNome()); } } Atributos Necessário para ordenação
  34. 34. Módulo 1 – Histórias 34 Exercício 1Exercício 1  Classe EstoqueClasse Estoque public class Estoque { public static Estoque conectar() { } public void submeter() { } public void funcao(String funcao) { } private void buscarProduto(String nome) {} private void adicionarEstoque(Produto produto) { } private void removerEstoque(Produto produto) { } private ArrayList<Produto> listarEstoque() { } private void adicionarProduto(Produto produto) { } public void limparEstoque() { } public String ultimaMensagem() { } } Obtém a última mensagem do sistema Obtém referência ao objeto estoque Remove todos os produtos do estoque Adiciona um produto ao estoque Remove itens do estoque Adiciona itens no estoque Busca um produto do estoque pelo nome Executa a ação selecionada Lista todos os produtos do estoque Seleciona uma ação
  35. 35. Módulo 1 – Histórias 35 Exercício 1Exercício 1  Pasta de HistóriasPasta de Histórias  Crie uma pasta chamada estoque dentro da pasta src/test/resources  Dentro desta pasta crie o arquivo de histórias produto-inclusao.story  Aplique o snippet 03 história Inclusão de Produtos ao arquivo criado
  36. 36. Módulo 1 – Histórias 36 Exercício 1Exercício 1  Histórias: Inclusão de ProdutosHistórias: Inclusão de Produtos Funcionalidade: Inclusão de Produtos Eu quero: Incluir Produtos no Controle de Estoque De modo que: Os produtos sejam armazenados do Controle de Estoque Cenário: Adicionar um produto Dado que a lista de produtos está vazia Quando aciono a função "Incluir Produto" Quando informo o nome "computador" Quando informo a quantidade "300" Quando submeto o formulário Então o sistema apresentará a mensagem "Produto Incluído" Cenário Funcionalidade Descrição Passos
  37. 37. Módulo 1 – Histórias 37 Exercício 1Exercício 1  Classe EstoqueTest.javaClasse EstoqueTest.java  Na pasta src/test/java, no pacote br.gov.serpro.behave.projeto01 crie uma classe chamada EstoqueTest  Substitua seu conteúdo pelo snippet 04 EstoqueTest.java public class EstoqueTest { private BehaveContext eng = null; public EstoqueTest() { eng = BehaveContext.getInstance(); } @Test public void testAllStories() throws Throwable { eng.run("/estoque"); } } Obtém o contexto do dbehave Informa ao contexto as pastas ou arquivos de histórias que serão executados
  38. 38. Módulo 1 – Histórias 38 Exercício 1Exercício 1  Execução da Classe EstoqueTest.javaExecução da Classe EstoqueTest.java  Execute a classe EstoqueTest por meio do JUnit
  39. 39. Módulo 1 – Histórias 39 Exercício 1Exercício 1  Execução da Classe EstoqueTest.javaExecução da Classe EstoqueTest.java  Observer o log de saída: Passos pendentesPassos pendentes
  40. 40. Módulo 1 – Histórias 40 Exercício 1Exercício 1  Execução da Classe EstoqueTest.javaExecução da Classe EstoqueTest.java  Execute a classe EstoqueTest no JUnit e verifique o log de saída: Recomendações
  41. 41. Módulo 1 – Histórias 41 Exercício 1Exercício 1  Criando classe de passosCriando classe de passos  No pacote br.gov.serpro.behave.projeto01 da pasta src/test/java crie uma classe chamada EstoquePassos  Substitua o conteúdo da classe pelo snippet 05 EstoquePassos.java
  42. 42. Módulo 1 – Histórias 42 Exercício 1Exercício 1 public class EstoquePassos implements Step { Estoque estoque = Estoque.conectar(); @Given("a lista de produtos está vazia") public void givenAListaDeProdutosEstáVazia() { estoque.limparEstoque(); } @When("informo o nome "$nome"") public void whenInformoONomecomputador(String nome) { estoque.informarNome(nome); } @Then("o sistema apresentará a mensagem "$mensagem"") public void thenOSistemaApresentara(String mensagem) { Assert.assertEquals(mensagem, estoque.getMensagem()); } } Parâmetros Asserções do JUnit Uso de parâmetros Abrindo conexão com o Estoque Dado... uma situação Quando... acesso a recursos Então... consequências esperadas
  43. 43. Módulo 1 – Histórias 43 Exercício 1Exercício 1  Inclusão dos Passos CustomizadosInclusão dos Passos Customizados  No método testAllStories da classe EstoqueTest inclua no contexto do DBehave um objeto EstoquePassos: @Test public void testAllStories() throws Throwable { eng.addSteps(new EstoquePassos()); eng.run("/estoque"); }
  44. 44. Módulo 1 – Histórias 44 Exercício 1Exercício 1  Execução da Classe EstoqueTest.javaExecução da Classe EstoqueTest.java  Execute a classe EstoqueTest no JUnit e verifique o log de saída: Erro Ações executadas com sucesso Falha Ações executadas com sucesso Ações executadas com sucesso
  45. 45. Módulo 1 – Histórias 45 Exercício 1Exercício 1  Reuso de HistóriasReuso de Histórias  Aplique o snippet 09 histórias reutilizadas ao final do arquivo produto-inclusao.story Cenário: Adicionar produto "{nome}" com "{quantidade}" unidades Quando aciono a função "Incluir Produto" Quando informo o nome "{nome}" Quando informo a quantidade "{quantidade}" Quando submeto o formulário Então o sistema apresentará a mensagem "Produto Incluído" Cenário: Adicionar vários Produtos Dado que a lista de produtos está vazia Adicionar produto "mesa" com "20" unidades Adicionar produto "cadeira" com "30" unidades Adicionar produto "computador" com "100" unidades Então o estoque terá "3" produtos cadastrados ParâmetrosParâmetros Chamada ao cenário Chamada ao cenário Chamadas ao cenário
  46. 46. Módulo 1 – Histórias 46 Exercício 1Exercício 1  Desenvolvimento Orientado a ComportamentoDesenvolvimento Orientado a Comportamento  Implementaremos os métodos da classe Estoque em função das falhas apresentadas pelo teste:  No método adicionarProduto aplique o snippet 06 adicionarProduto  Modifique o método limparEstoque: public void limparEstoque() { lista.clear(); }
  47. 47. Módulo 1 – Histórias 47 Exercício 1Exercício 1  Mais históriasMais histórias  Crie um novo arquivo na pasta src/test/resources/estoque com o nome produto-pesquisa.story  Aplique o snippet 07 histórias Busca de Produtos  Rode os testes e verifique os erros. Falha
  48. 48. Módulo 1 – Histórias 48 Exercício 1Exercício 1  Desenvolvimento Orientado a ComportamentoDesenvolvimento Orientado a Comportamento  Implemente o método buscarProduto da classe Estoque com o snippet 08 buscarProduto:  Rode novamente seu testes. Neste momento não haverá mais erros.
  49. 49. Módulo 1 – Histórias 49 Exercício 1Exercício 1  Controle de EstoqueControle de Estoque  Crie um novo arquivo na pasta src/test/resources/estoque com o nome estoque-controle.story  Aplique o 10 histórias Controlar Estoque  Rode os testes e verifique os resultados: Falha
  50. 50. Módulo 1 – Histórias 50 Exercício 1Exercício 1  Desenvolvimento Orientado a ComportamentoDesenvolvimento Orientado a Comportamento  Implemente os seguintes métodos da classe Estoque:  adicionarEstoque  Snippet: 11 método adicionarEstoque  removerEstoque  Snippet: 12 método removerEstoque  listarEstoque  Snippet: 13 método listarEstoque  Execute novamente os testes.  Observer que as falhas foram removidas.
  51. 51. Módulo 1 – Histórias 51 Exercício 1Exercício 1  Exercício ComplementarExercício Complementar  A partir da técnica BDD crie a funcionalidade “Remover Produto”  Crie as respectivas histórias e passos;  Rode as histórias, mesmo com erro;  Implemente as evoluções da classe Estoque em função dos resultados.  Implemente a funcionalidade “raiz quadrada” da Calculadora (Calc.java)
  52. 52. Módulo 1 – Histórias 52 ConfiguraçõesConfigurações  behave.propertiesbehave.properties  Todas as configurações do DBehave são registradas no arquivo behave.properties  Vamos apresentar a cada módulo as configurações mais relevantes: behave.parser.language=pt behave.parser.story.extension.original=story behave.parser.story.extension.converted=storyConverted behave.parser.commonssteps.enabled=true Configura a língua Padrão das histórias Extensão dos arquivos de histórias Extensão dos arquivos de histórias convertidos Habilita os passos comuns do DBehave
  53. 53. Módulo 1 – Histórias 53 ConfiguraçõesConfigurações  behave.propertiesbehave.properties  Ordem de Carregamento  Propriedades da JVM (System do Java)  behave.properties do projeto  behave.properties do framework  Portanto, de forma estática todas as propriedades podem ser sobrescritas no behave.propeties do projeto.  Dinamicamente é possível modificar todas as propriedades do DBehave por meio da classe System ou passando os parâmetros na inicialização da JVM System.setProperty("behave.parser.commonssteps.enabled", "false"); -Dbehave.parser.commonssteps.enabled=false
  54. 54. Módulo 1 – Histórias 54 Conclusão do MóduloConclusão do Módulo  ResumoResumo  Especifique sistemas por histórias!  O Demoiselle Behave é um framework de integração para testes em BDD.  A camada Parser do DBehave é responsável pelo carremento das histórias.  A criação de projetos do DBehave pode ser feita com a utilização de modelos de projeto Maven.  O modelo jbehave-junit-archetype cria projetos para testes apenas com JUnit sem camadas de apresentação.
  55. 55. Módulo 1 – Histórias 55 ReferênciasReferências  Conceitos do BDD: http://pt.wikipedia.org/wiki/Behavior_Driven_Development  Princípios do BDD: http://cuke4ninja.com/sec_cucumber_bdd.html  DSLs: http://martinfowler.com/bliki/BusinessReadableDSL.html  BDD na Prática: http://elemarjr.net/2012/04/12/bdd-na-prtica-parte-3-gherkin/

×