55
Treinamento: Treinamento: Automação Automação de Testes de Testes Módulo 01 - Histórias Módulo 01 - Histórias

Demoiselle Behave - Parte 1

Embed Size (px)

DESCRIPTION

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.

Citation preview

Page 1: Demoiselle Behave - Parte 1

Treinamento:Treinamento:

AutomaçãoAutomaçãode Testesde Testes

Módulo 01 - HistóriasMódulo 01 - Histórias

Page 2: Demoiselle Behave - Parte 1

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/).

Page 3: Demoiselle Behave - Parte 1

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 doMódulo 1Módulo 1

Page 4: Demoiselle Behave - Parte 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?

Page 5: Demoiselle Behave - Parte 1

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:

Page 6: Demoiselle Behave - Parte 1

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 interactions agile methodology. It describes a cycle of interactions with well-defined outputs, resulting in the delivery with well-defined outputs, resulting in the delivery of working, tested software that matters.of working, tested software that matters.

Page 7: Demoiselle Behave - Parte 1

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.

Page 8: Demoiselle Behave - Parte 1

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.

Page 9: Demoiselle Behave - Parte 1

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.

Page 10: Demoiselle Behave - Parte 1

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.

Page 11: Demoiselle Behave - Parte 1

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.

Page 12: Demoiselle Behave - Parte 1

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

Page 13: Demoiselle Behave - Parte 1

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[contains(@id, 'formLogin')][contains(@type, 'text')])"));login.clear();login.sendKeys("joao");WebElement senha = driver.findElement(By.xpath("(//input[contains(@id, 'formLogin')][contains(@type, 'password')])"));senha.sendKeys("123");WebElement botaoOk = driver.findElement(By.xpath("(//button[contains(@type, 'submit')])"));botaoOk.click();

Linguagem de ProgramaçãoLinguagem de Programação

transcrição

Page 14: Demoiselle Behave - Parte 1

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[contains(@id, 'formLogin')][contains(@type, 'text')])"));login.click();login.clear();login.sendKeys("joao");WebElement senha = driver.findElement(By.xpath("(//input[contains(@id, 'formLogin')][contains(@type, 'password')])"));senha.clear();senha.sendKeys("123");WebElement botaoOk = driver.findElement(By.xpath("(//button[contains(@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

CustoCustoManutençãoManutenção

AprendizagemAprendizagem

ProdutividadeProdutividade

Page 15: Demoiselle Behave - Parte 1

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[contains(@id, 'formLogin')][contains(@type, 'text')])"));login.click();login.clear();login.sendKeys("joao");WebElement senha = driver.findElement(By.xpath("(//input[contains(@id, 'formLogin')][contains(@type, 'password')])"));senha.clear();senha.sendKeys("123");WebElement botaoOk = driver.findElement(By.xpath("(//button[contains(@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

Page 16: Demoiselle Behave - Parte 1

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”

Page 17: Demoiselle Behave - Parte 1

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

Page 18: Demoiselle Behave - Parte 1

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

Page 19: Demoiselle Behave - Parte 1

Módulo 1 – Histórias 19

IntroduçãoIntrodução Arquitetura dbehaveArquitetura dbehave

Parser – Reuso de Histórias

Funcionalidade: Acesso ao SistemaComo um: operador do sistemaEu quero: ser autenticado por meio de senhaDe modo que: o acesso ao sistema seja dado apenas aos operadoresCadastrados

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 XPTOAcessar o sistema com o usuário "06762344887" e senha "188542"

Page 20: Demoiselle Behave - Parte 1

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.

Page 21: Demoiselle Behave - Parte 1

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/eclipse-standard-432/keplersr2

JBehave Eclipse Plugin

1.0.0.20140605-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/

Page 22: Demoiselle Behave - Parte 1

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!

Page 23: Demoiselle Behave - Parte 1

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 trechosde código para realizaçãodos exercícios

Aplicação de treinamentopara realizar os testessugeridos pelos exercícios

Page 24: Demoiselle Behave - Parte 1

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

Page 25: Demoiselle Behave - Parte 1

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.

Page 26: Demoiselle Behave - Parte 1

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.

Page 27: Demoiselle Behave - Parte 1

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

Page 28: Demoiselle Behave - Parte 1

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.

Page 29: Demoiselle Behave - Parte 1

Módulo 1 – Histórias 29

HistóriasHistórias Criando Projeto 01Criando Projeto 01

Selecione a última versão do jbehave-junit-archetype:

Page 30: Demoiselle Behave - Parte 1

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.

Page 31: Demoiselle Behave - Parte 1

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.

Page 32: Demoiselle Behave - Parte 1

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

Page 33: Demoiselle Behave - Parte 1

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;

...

@Overridepublic int compareTo(Produto produto) {

return nome.compareTo(produto.getNome());}

}

Atributos

Necessário paraordenação

Page 34: Demoiselle Behave - Parte 1

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 aoobjeto estoque

Remove todos osprodutos do estoque

Adiciona um produtoao estoque

Remove itens do estoque

Adiciona itensno estoque

Busca um produtodo estoque pelo nome

Executa a ação selecionada

Lista todos osprodutos do estoque

Seleciona uma ação

Page 35: Demoiselle Behave - Parte 1

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

Page 36: Demoiselle Behave - Parte 1

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 EstoqueDe modo que: Os produtos sejam armazenados do Controle de Estoque

Cenário: Adicionar um produto

Dado que a lista de produtos está vaziaQuando aciono a função "Incluir Produto"Quando informo o nome "computador"Quando informo a quantidade "300"Quando submeto o formulárioEntão o sistema apresentará a mensagem "Produto Incluído"

Cenário

Funcionalidade

Descrição

Passos

Page 37: Demoiselle Behave - Parte 1

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();

}

@Testpublic void testAllStories() throws Throwable {

eng.run("/estoque");}

}

Obtém o contextodo dbehave

Informa ao contextoas pastas ou arquivos de

histórias que serão executados

Page 38: Demoiselle Behave - Parte 1

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

Page 39: Demoiselle Behave - Parte 1

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

Page 40: Demoiselle Behave - Parte 1

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

Page 41: Demoiselle Behave - Parte 1

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

Page 42: Demoiselle Behave - Parte 1

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 doJUnit

Uso de parâmetros

Abrindo conexãocom o Estoque

Dado... uma situação

Quando... acesso a recursos

Então... consequênciasesperadas

Page 43: Demoiselle Behave - Parte 1

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:

@Testpublic void testAllStories() throws Throwable {

eng.addSteps(new EstoquePassos());eng.run("/estoque");

}

Page 44: Demoiselle Behave - Parte 1

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 executadascom sucesso

Falha

Ações executadascom sucesso

Ações executadascom sucesso

Page 45: Demoiselle Behave - Parte 1

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árioEntão o sistema apresentará a mensagem "Produto Incluído"

Cenário: Adicionar vários ProdutosDado que a lista de produtos está vaziaAdicionar produto "mesa" com "20" unidadesAdicionar produto "cadeira" com "30" unidadesAdicionar produto "computador" com "100" unidadesEntão o estoque terá "3" produtos cadastrados

ParâmetrosParâmetros

Chamada ao cenário

Chamada ao cenário

Chamadasao cenário

Page 46: Demoiselle Behave - Parte 1

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();

}

Page 47: Demoiselle Behave - Parte 1

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

Page 48: Demoiselle Behave - Parte 1

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.

Page 49: Demoiselle Behave - Parte 1

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

Page 50: Demoiselle Behave - Parte 1

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.

Page 51: Demoiselle Behave - Parte 1

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)

Page 52: Demoiselle Behave - Parte 1

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ínguaPadrão das histórias Extensão dos

arquivosde histórias

Extensão dos arquivosde histórias convertidos

Habilita os passoscomuns do DBehave

Page 53: Demoiselle Behave - Parte 1

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

Page 54: Demoiselle Behave - Parte 1

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.

Page 55: Demoiselle Behave - Parte 1

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/