SlideShare une entreprise Scribd logo
1  sur  55
Télécharger pour lire hors ligne
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 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/).
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
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?
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:
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.
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.
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.
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.
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.
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.
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
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
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
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
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”
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
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
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"
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.
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/
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!
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
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
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.
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.
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
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.
Módulo 1 – Histórias 29
HistóriasHistórias

Criando Projeto 01Criando Projeto 01
 Selecione a última versão do jbehave-junit-archetype:
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.
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.
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”.
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
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
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
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
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
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
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
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
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
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
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");
}
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
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
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();
}
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
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.
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
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.
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)
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
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
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.
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/

Contenu connexe

Tendances

Java Fx Guia De IntroduçãO
Java Fx Guia De IntroduçãOJava Fx Guia De IntroduçãO
Java Fx Guia De IntroduçãO
danielfc
 
Lottie API Para Animações no Android
Lottie API Para Animações no AndroidLottie API Para Animações no Android
Lottie API Para Animações no Android
Vinícius Thiengo
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Vinícius Thiengo
 
SelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidSelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView Android
Vinícius Thiengo
 
Live Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioLive Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android Studio
Vinícius Thiengo
 
Data Binding Para Vinculo de Dados na UI Android
Data Binding Para Vinculo de Dados na UI AndroidData Binding Para Vinculo de Dados na UI Android
Data Binding Para Vinculo de Dados na UI Android
Vinícius Thiengo
 
Android Studio
Android StudioAndroid Studio
Android Studio
Vinícius Thiengo
 

Tendances (20)

TDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOSTDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOS
 
Java swingcomponentes
Java swingcomponentesJava swingcomponentes
Java swingcomponentes
 
Introdução à Programação em Java - Aula 1 (PT-PT)
Introdução à Programação em Java - Aula 1 (PT-PT)Introdução à Programação em Java - Aula 1 (PT-PT)
Introdução à Programação em Java - Aula 1 (PT-PT)
 
Java Fx Guia De IntroduçãO
Java Fx Guia De IntroduçãOJava Fx Guia De IntroduçãO
Java Fx Guia De IntroduçãO
 
Lottie API Para Animações no Android
Lottie API Para Animações no AndroidLottie API Para Animações no Android
Lottie API Para Animações no Android
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de software
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?
 
Tutorial Java EE
Tutorial Java EETutorial Java EE
Tutorial Java EE
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXing
 
SelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidSelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView Android
 
Live Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioLive Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android Studio
 
Data Binding Para Vinculo de Dados na UI Android
Data Binding Para Vinculo de Dados na UI AndroidData Binding Para Vinculo de Dados na UI Android
Data Binding Para Vinculo de Dados na UI Android
 
Code Smells
Code SmellsCode Smells
Code Smells
 
J Meter
J MeterJ Meter
J Meter
 
Performance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkPerformance de verdade com Phalcon Framework
Performance de verdade com Phalcon Framework
 
Certificação Zend Framework
Certificação Zend FrameworkCertificação Zend Framework
Certificação Zend Framework
 
Tipos de automação de teste
Tipos de automação de testeTipos de automação de teste
Tipos de automação de teste
 
Android Studio
Android StudioAndroid Studio
Android Studio
 
JUnit
JUnitJUnit
JUnit
 
Java Day 2011 - Reflection: Maximizando a produtividade em Java
Java Day 2011 - Reflection: Maximizando a produtividade em JavaJava Day 2011 - Reflection: Maximizando a produtividade em Java
Java Day 2011 - Reflection: Maximizando a produtividade em Java
 

Similaire à Demoiselle Behave - Parte 1

Engenharia de Software introdução
Engenharia de Software    introduçãoEngenharia de Software    introdução
Engenharia de Software introdução
miroslayer
 
Testes automatizados cp
Testes automatizados cpTestes automatizados cp
Testes automatizados cp
cesarvianna
 

Similaire à Demoiselle Behave - Parte 1 (20)

Seu Cliente no Controle! Testes ágeis
Seu Cliente no Controle! Testes ágeisSeu Cliente no Controle! Testes ágeis
Seu Cliente no Controle! Testes ágeis
 
Automação Mobile com BDD
Automação Mobile com BDDAutomação Mobile com BDD
Automação Mobile com BDD
 
Keynote Visual Studio Summit 2016
Keynote Visual Studio Summit 2016Keynote Visual Studio Summit 2016
Keynote Visual Studio Summit 2016
 
Teste de software
Teste de softwareTeste de software
Teste de software
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehave
 
Desenvolvimento ágil de software
Desenvolvimento ágil de softwareDesenvolvimento ágil de software
Desenvolvimento ágil de software
 
DevOps
DevOpsDevOps
DevOps
 
QUALIDADE DE SOFTWARE VT- Avaliação de Produto de Software
QUALIDADE DE SOFTWARE VT- Avaliação de Produto de SoftwareQUALIDADE DE SOFTWARE VT- Avaliação de Produto de Software
QUALIDADE DE SOFTWARE VT- Avaliação de Produto de Software
 
Engenharia Ágil
Engenharia ÁgilEngenharia Ágil
Engenharia Ágil
 
Arquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócioArquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócio
 
Sql01 final
Sql01 finalSql01 final
Sql01 final
 
tdc-2022-poa-quem-tem-medo-low-code.pdf
tdc-2022-poa-quem-tem-medo-low-code.pdftdc-2022-poa-quem-tem-medo-low-code.pdf
tdc-2022-poa-quem-tem-medo-low-code.pdf
 
#{GCODE}
#{GCODE}#{GCODE}
#{GCODE}
 
Engenharia de Software introdução
Engenharia de Software    introduçãoEngenharia de Software    introdução
Engenharia de Software introdução
 
Tudo são Dados - PHP Conference 2008
Tudo são Dados - PHP Conference 2008Tudo são Dados - PHP Conference 2008
Tudo são Dados - PHP Conference 2008
 
Especificação por meio de exemplos (BDD, testes de aceitação, ...)
Especificação por meio de exemplos (BDD, testes de aceitação, ...)Especificação por meio de exemplos (BDD, testes de aceitação, ...)
Especificação por meio de exemplos (BDD, testes de aceitação, ...)
 
Testes automatizados cp
Testes automatizados cpTestes automatizados cp
Testes automatizados cp
 
Apresentação TCC I - IES/SC 2013
Apresentação TCC I - IES/SC 2013Apresentação TCC I - IES/SC 2013
Apresentação TCC I - IES/SC 2013
 
Conceitos e fundamentos sobre testes de software e garantia da qualidade
Conceitos e fundamentos sobre testes de software e garantia da qualidadeConceitos e fundamentos sobre testes de software e garantia da qualidade
Conceitos e fundamentos sobre testes de software e garantia da qualidade
 
[QANinjaConference] Automação de Testes com Codeception
[QANinjaConference] Automação de Testes com Codeception[QANinjaConference] Automação de Testes com Codeception
[QANinjaConference] Automação de Testes com Codeception
 

Dernier

Dernier (8)

ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 

Demoiselle Behave - Parte 1

  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Módulo 1 – Histórias 29 HistóriasHistórias  Criando Projeto 01Criando Projeto 01  Selecione a última versão do jbehave-junit-archetype:
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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/