66
Treinamento: Treinamento: Automação Automação de Testes de Testes Módulo 02 – Automação Web Módulo 02 – Automação Web

Demoiselle Behave - Parte 2

Embed Size (px)

DESCRIPTION

Treinamento da ferramenta de automação de testes de software Demoiselle Behave (http://demoiselle.github.io/behave/). Parte 2: Mostra como realizar testes automáticos em BDD para aplicações web O material de treinamento pode ser encontrado nas instruções a Parte 1 (www.slideshare.net/vandersonsilva9615/treinamento-demoiselle-behave-parte-01)

Citation preview

Page 1: Demoiselle Behave - Parte 2

Treinamento:Treinamento:

AutomaçãoAutomaçãode Testesde Testes

Módulo 02 – Automação WebMódulo 02 – Automação Web

Page 2: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 2

IntroduçãoIntrodução Arquitetura dbehaveArquitetura dbehave

Core

Parser Runner Integration

TECNOLOGIAS

JBehave

Concordion

Cucumber

TECNOLOGIAS

Selenium

FEST

TECNOLOGIAS

ALM - RQM

Foco desteMódulo

Page 3: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 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 2Módulo 2Alvo doAlvo do

Módulo 2Módulo 2

Page 4: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 4

DependênciasDependências Módulos RunnersMódulos Runners

Tem por finalidade executar testes sob alguma interface gráfica

<dependencies><dependency>

<groupId>br.gov.frameworkdemoiselle.component.behave</groupId><artifactId>demoiselle-behave-parser-jbehave</artifactId><version>1.x.x</version><scope>test</scope>

</dependency><dependency>

<groupId>br.gov.frameworkdemoiselle.component.behave</groupId><artifactId>demoiselle-behave-runner-webdriver</artifactId><version>1.4.0</version><scope>test</scope>

</dependency></dependencies> Como Inclusão umum

Runner DBehave

Page 5: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 5

Runner WebDriverRunner WebDriver Selenium WebDriverSelenium WebDriver

O Selenium 2.0 traz como mudança a inclusão da API do projeto WebDriver:

Apesar das duas APIs serem permitidas, o projeto Runner Webdriver do DBehave recomenda preferencialmente a API WebDriver.

Mais informações: http://docs.seleniumhq.org/projects/webdriver/

Selenium 1.0 + WebDriver =Selenium 1.0 + WebDriver = Selenium 2.0Selenium 2.0Selenium 1.0 + WebDriver =Selenium 1.0 + WebDriver = Selenium 2.0Selenium 2.0

Page 6: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 6

Runner WebDriverRunner WebDriver Selenium WebDriverSelenium WebDriver

Prover drivers para diversas plataformas: AndroidDriver, ChromeDriver, EventFiringWebDriver, FirefoxDriver,

HtmlUnitDriver, InternetExplorerDriver, IPhoneDriver, PhantomJSDriver, RemoteWebDriver, SafariDriver

Page 7: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 7

Runner WebDriverRunner WebDriver WebDriver - RevisãoWebDriver - Revisão

Alguns comandos:

WebDriver driver = new FirefoxDriver();

driver.get("http://localhost:8080/treino/");

WebElement element = driver.findElement(By.id("btOk"))element.click();

driver.findElement(By.id("txtNome")).clear();driver.findElement(By.id("txtNome")).sendKeys("Joao");

driver.getPageSource();

Obtém umaInstância do navegador

(driver)

Acessa uma URL

Encontra umelemento da tela

Executa ações

Envia comandosde tecladoLimpa um

campoObtém o fonte

da página

Page 8: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 8

Exercício 2Exercício 2 ObjetivosObjetivos

Revisar conceitos do WebDriver Conhecer a aplicação de treinamento “Treino” Implementar um script diretamente com o WebDriver Avaliar a qualidade do script de testes

Page 9: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 9

Exercício 2Exercício 2 Aplicação TreinoAplicação Treino

Descompacte o arquivo treino-bundle-1.0.2.zip localizado no seu material de treinamento.

Para iniciar a aplicação execute:

Para finalizar a aplicação execute:

sh ./treino-bundle/bin/shutdown.shsh ./treino-bundle/bin/shutdown.sh

sh ./treino-bundle/bin/startup.shsh ./treino-bundle/bin/startup.sh

treino-bundle\bin\startup.battreino-bundle\bin\startup.bat

treino-bundle\bin\shutdown.battreino-bundle\bin\shutdown.bat

No Linux

No Windows

No Linux

No Windows

Page 10: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 10

Exercício 2Exercício 2 Aplicação TreinoAplicação Treino

Acesse a aplicação pela url: http://localhost:8080/treino

Use este arquivo queprovê lista de

usuários e senhas

Usuário

Senha

Page 11: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 11

Exercício 2Exercício 2 Aplicação TreinoAplicação Treino

Lista de Obras

Logout

Página com elementoscomplexos

Page 12: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 12

Exercício 2Exercício 2 Aplicação TreinoAplicação Treino

Adicionar uma Obra

Reset da Base de Dados

Paginação

Edição Rápida

Envio de Lance

Atual vencedordo leilão

Hora da Atualizaçãodo registro

Page 13: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 13

Exercício 2Exercício 2 Aplicação TreinoAplicação Treino

Mensagens

Valor do lançe deveser menor que o atual

Prazo deve ser menor que o atual

MensagensEnviar

Page 14: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 14

Exercício 2Exercício 2 Aplicação TreinoAplicação Treino

Registro Atualizado

Atual vencedor

Proposta registrada

Hora do lance

Page 15: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 15

Exercício 2Exercício 2 Criando Projeto 02Criando Projeto 02

Menu: File : New : Maven Project Vá para a próxima tela (next) Selecione o Catálogo: Demoiselle Behave Escolha a última versão do jbehave-selenium-archetype

Selecione aversão mais atual

Page 16: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 16

Exercício 2Exercício 2 Criando Projeto 02Criando Projeto 02

Informe o Group Id: br.gov.serpro.behave Informe o Artifact Id: projeto02

Page 17: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 17

Exercício 2Exercício 2 Criando Projeto 02Criando Projeto 02

Crie uma classe chamada TreinoTest No pacote br.gov.serpro.behave.projeto02

Substitua o conteúdo da classe criada pelo snippet “01 classe TreinoTest”

Page 18: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 18

Exercício 2Exercício 2 ExecuçãoExecução

Execute pelo JUnit a classe TreinoTest

Page 19: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 19

Exercício 2Exercício 2 Análise do CódigoAnálise do Código Cria instância do

Firefox

Acesso à páginade login

Aguarda carregamento da páginapor 2s. Se usássemos o driver.wait(2000);

Não funciona em todos os casos

WebDriver driver = new FirefoxDriver();

// Tela de Autenticacaodriver.get("http://localhost:8080/treino/");Thread.sleep(2000);

Page 20: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 20

Exercício 2Exercício 2 Análise do CódigoAnálise do Código

// Autentica Usuariodriver.findElement(By.id("formLogin:j_idt22")).click();driver.findElement(By.xpath("(//input[contains(@id, 'formLogin')][contains(@type, 'text')])[1]")).clear();

driver.findElement(By.id("formLogin:j_idt22")).sendKeys("19296496063");

driver.findElement(By.id("formLogin:j_idt24_input")).clear();

driver.findElement(By.id("formLogin:j_idt24_input")).sendKeys("205253");

driver.findElement(By.id("formLogin:j_idt26")).click();

Thread.sleep(2000);

Informa valores

Encontra elementoPelo id

Aguarda carregamentoda página

Encontra elementoPor um xPath

Informa valores

Clica no botão“Entrar”

Page 21: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 21

Exercício 2Exercício 2 Análise do CódigoAnálise do Código

// Obtem o valor do ultimo lance e decrementa um centavoDecimalFormat df = new DecimalFormat("###.0");WebElement element = driver.findElement(By.id("fmLance:j_idt77"));double value = df.parse(element.getAttribute("value")).doubleValue();value -= 0.1;driver.findElement(By.id("fmLance:j_idt77")).clear();driver.findElement(

By.id("fmLance:j_idt77")).sendKeys(df.format(value).replace(',', '.'));

Obtém a referência de um elemento da página

Obtém o valordo elemento

Aguarda carregamentoda página

Modifica o valor doelemento

Page 22: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 22

Exercício 2Exercício 2 Análise do CódigoAnálise do Código

// Obtem a data da propsota e decrementa um diaSimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");Date date = dateFormat.parse(

driver.findElement(By.id("fmLance:j_idt80_input")).getAttribute("value"));

Calendar cl = GregorianCalendar.getInstance();cl.setTime(date);cl.add(Calendar.DAY_OF_MONTH, -1);String melhorDate = dateFormat.format(cl.getTime());

driver.findElement(By.id("fmLance:j_idt80_input")).clear();driver.findElement(By.id("fmLance:j_idt80_input")).sendKeys(melhorDate);

Decrementa a dataem um dia

Obtém o valor docampo data

Informa um novo valorpara o campo data

Page 23: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 23

Exercício 2Exercício 2 Análise do CódigoAnálise do Código

try {// Enviar a propostadriver.findElement(By.id("fmLance:j_idt81")).click();Thread.sleep(2000);

// Verifica mensagem de proposta aceitaAssert.assertTrue(

driver.getPageSource().contains("Proposta Aceita!!!"));driver.findElement(By.linkText("Sair")).click();

} catch (Exception e) {e.printStackTrace();Assert.fail(e.getMessage());

} finally {driver.close();driver.quit();

}

Obtém o códigoFonte da página

Fechaa janela

Aguarda carregamentoda página

Asserção

Asserção

Fecha o navegador

Page 24: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 24

Exercício 2Exercício 2 Exercício ComplementarExercício Complementar

Objetivo: Melhorar seus conhecimentos em xpath Refatore seu script de modo a torná-lo mais flexível quanto

aos ids auto gerenciados pelo JSF Substitua os localizadores de ids por xpath Sugestão:

Instale o plugin firefox XPath Checker e Firebug https://addons.mozilla.org/pt-br/firefox/addon/xpath-checker/ http://getfirebug.com/

Page 25: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 25

Exercício 2Exercício 2 Análise do CódigoAnálise do Código

Flexibilidade Legibilidade Manutenibilidade Dependência direta do WebDriver Refatoramentos Qualidade do gravador de código Log/Evidências

Neste processo de teste que nível Neste processo de teste que nível

de de colaboraçãocolaboração seria possível entre seria possível entre

os membros da equipe e seus stakeholdersos membros da equipe e seus stakeholders??

Page 26: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 26

Mapeamento de TelaMapeamento de Tela ObjetivoObjetivo

Visa desacoplar os elementos de tela do script. BenefíciosBenefícios

Redução de duplicação de código; Mais simples de manter: se houver mudanças na tela a

correção deverá ser aplicada em um único lugar. ReferênciasReferências

http://chon.techliminal.com/page_object/#/intro http://code.google.com/p/selenium/wiki/PageObjects http://docs.seleniumhq.org/docs/06_test_design_consideration

s.jsp

Page 27: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 27

Mapeamento de TelaMapeamento de Tela Diferenças para um Page ObjectDiferenças para um Page Object

Os mapeamentos não possuem comportamento; Os comportamentos são implementados nos steps; Podemos reusar comportamentos para vários objetos

e vice-e-versa; Melhor manutenção, devido a redução de código.

Page 28: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 28

Mapeamento de TelaMapeamento de Tela ExemploExemplo

Veja a classe MyPage do projeto02

@ScreenMap(name = "Tela de Busca", location = "http://www.google.com.br")public class MyPage {

@ElementMap(name = "Campo de Busca", locatorType = ElementLocatorType.Id, locator = "gbqfq")

private TextField searchField;

@ElementMap(name = "Estou com sorte", locatorType = ElementLocatorType.Id, locator = "gbqfbb")

private Button buttonLuckSearch;

}

Page 29: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 29

Mapeamento de TelaMapeamento de Tela @ScreenMap@ScreenMap

@ScreenMap(name = "Tela de Busca", location = "http://www.google.com.br")

Identificadoramigável da tela

Localização da tela@ScreenMap(

name = "Tela de Busca", base="http://www.google.com.br", location = "/")

Atributo opcional que define o prefixodo localizador. Importante quando deseja-se

parametrizar os localizadoresNeste caso, a localização da telaé concatenada: base + location

Page 30: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 30

Mapeamento de TelaMapeamento de Tela @ElementMap@ElementMap

@ElementMap(name = "Campo de Busca", locatorType = ElementLocatorType.Id, locator = "gbqfq")

Identificador amigáveldo elemento de tela

Tipos de localizador:ClassName; CssSelector

Id; LinkText; Name;TagName; XPath

Valor de localizador

@ElementMap(name = "Menu Superior", locatorType = ElementLocatorType.Id, locator = { "gbztm", "gbmm" })private Select menuLivros; Pode ser necessário

mais de um localizador

Page 31: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 31

Mapeamento de TelaMapeamento de Tela Interface ElementInterface Element

Especificação que provê abstrações para elementos de tela: CheckBox.java Button.java Grid.java Label.java Link.java ListBox.java Loading.java Menu.java MenuItem.java PickList.java Radio.java Screen.java Select.java TextField.java

@ElementMap(name = "Pesquisar", locatorType = ElementLocatorType.Id, locator = "gbqfb")

private Button botaoPesquiar

Page 32: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 32

Mapeamento de TelaMapeamento de Tela Interface ElementInterface Element

Projetos do tipo Runner devem implementar um conjunto de interfaces

public class WebButton extends WebBase implements Button {

public void click() {waitElement(0);getElements().get(0).click();

}}

public class WebButton extends WebBase implements Button {

public void click() {waitElement(0);getElements().get(0).click();

}}

Page 33: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 33

Mapeamento de TelaMapeamento de Tela Design dbehaveDesign dbehave

O coneito de Page Object é atentido pela composição do ScreenMap com os seus Elements:

Vantagens: Vantagens: Reuso de comportamentos; Polimorfismo para tipos de telas (Web, Desktop, Mobile, ...)

Dados

ScreenMapScreenMapComportamento

ElementElement+

Dados comComportamento

Page ObjectPage Object=

Page 34: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 34

Mapeamento de TelaMapeamento de Tela Integração BDDIntegração BDD

O dbehave implementa passos comunspassos comuns para interação com aplicações Web

Cenário: Procurando uma Alma Gemea

Dado que vou para a tela "Alma Gemea"Quando clico em "Pesquisar"Quando informo "36" no campo "idade"Quando seleciono a opção "Solteiro"Então será exibido na "Caixa ao lado" o valor "Você está com sorte"Dado que estou na tela "Buscar Alma Gemea"Quando clico em "Procurar"Então será exibido "Ricardão"

Vai para a telamapeada

Execute a operaçãode click

Informa o valorde um campo de edição

Page 35: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 35

Mapeamento de TelaMapeamento de Tela Integração BDDIntegração BDD

O dbehave implementa passos comunspassos comuns para interação com aplicações Web

Cenário: Procurando uma Alma Gemea

Dado que vou para a tela "Alma Gemea"Quando clico em "Pesquisar"Quando informo "36" no campo "idade"Quando seleciono a opção "Solteiro"Então será exibido na "Caixa ao lado" o valor "Você está com sorte"Dado que estou na tela "Buscar Alma Gemea"Quando clico em "Procurar"Então será exibido "Ricardão"

Selecione um campo de escolha (radio, check ou link)

Verifica se um elementopossui um determinado valor

Page 36: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 36

Mapeamento de TelaMapeamento de Tela Integração BDDIntegração BDD

O dbehave implementa passos comunspassos comuns para interação com aplicações Web

Cenário: Procurando uma Alma Gemea

Dado que vou para a tela "Alma Gemea"Quando clico em "Pesquisar"Quando informo "36" no campo "idade"Quando seleciono a opção "Solteiro"Então será exibido na "Caixa ao lado" o valor "Você está com sorte"Dado que estou na tela "Buscar Alma Gemea"Quando clico em "Procurar"Então será exibido "Ricardão" Informa qual a página

atual sem executar ação de navegação

Verifica em toda a telaa presença e um texto

Page 37: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 37

Mapeamento de TelaMapeamento de Tela Integração BDDIntegração BDD

Funcionalidade: Acesso

Como um: visitanteEu quero: acessar o GoogleDe modo que: a tela inicial apareceça para mim

Cenário: Acesso ao Google

Dado que vou para a tela "Tela de Busca"Então será exibido "Google"

Page 38: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 38

Mapeamento de TelaMapeamento de Tela Integração BDD - Exercício de FixaçãoIntegração BDD - Exercício de Fixação

Adicione ao final do arquivo search.story o seguinte cenário:

Inclua na classe MyPage o botão de pesquisa:

@ElementMap( name = "Pesquisar", locatorType = ElementLocatorType.Id, locator = "gbqfb")private Button botaoPesquisar;

Cenário: Utilização da funcionalidade de pesquisaDado que vou para a tela "Tela de Busca"Quando informo "Demoiselle Behave" no campo "Campo de Busca"Quando clico em "Pesquisar"Então será exibido "Demoiselle Behave"

Page 39: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 39

Mapeamento de TelaMapeamento de Tela DataProviderDataProvider

Mecanismo do dbehave para armazenar valores durante o teste;

Há frases para guardar valores de campos; Útil para flexibilizar o reuso de dados dinamicamente.

Cenário: Atualizar Processo JudicialDado que obtenho "o número do processo" do campo "Numero Criado"......Quando informo "o número do processo" no campo "Processo Judicial"

Define uma variável para o DataProvider Valor obtido pelo

elemento de tela

Aplica o valor da variávelno elemento de tela

Page 40: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 40

Mapeamento de TelaMapeamento de Tela DataProviderDataProvider

É possível obter e escrever programaticamente no DataProvider por meio dos métodos get, informando uma chave, e put, informando chave e valor.

public class MeuPasso extends CommonSteps {

@Given("meu passo")public void meuPasso() {

String valor = (String) dataProvider.get(chave);dataProvider.put(chave, valor);

}}

O CommonStepspossui uma referência

ao DataProvider

lendo o dataprovider

escrevendo o dataprovider

Page 41: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 41

Mapeamento de TelaMapeamento de Tela DataProviderDataProvider

Útil para ocultar dados de uma história sem perder legibilidade :

Chave

public class PassosObras extends CommonSteps {public PassosObras(){

dataProvider.put("uma senha válida", "188542");}

}

Dado que vou para a tela "Tela de Login"Quando informo "06762344887" no campo "Campo Usuário"E informo "uma senha válida" no campo "Campo Senha"Quando clico em "Entrar"

chave do data provider

Page 42: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 42

Mapeamento de TelaMapeamento de Tela DataProviderDataProvider

Desafio Experimente utilizar o recurso DataProvider no exemplo anterior da tela

de pesquisa do Google.

Page 43: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 43

Exercício 3Exercício 3 ObjetivosObjetivos

Uso do Behave Runner WebDriver Uso do Mapeamento de Telas Uso dos Elementos de Telas Criação de Passos Customizados Utilização do DataProvider

Page 44: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 44

Exercício 3Exercício 3 Criando Projeto 03Criando Projeto 03

Menu: File : New : Maven Project Vá para a próxima tela (next) Selecione o Catálogo: Demoiselle Behave Escolha a última versão do jbehave-selenium-archetype

Escolha a últimaversão

Page 45: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 45

Exercício 3Exercício 3 Criando Projeto 03Criando Projeto 03

Informe o Group Id: br.gov.serpro.behave

Informe o Artifact Id: projeto03 Exclua todas as classes e

histórias criadas: Crie os pacotes config, pages,

steps e tests abaixo do pacote br.gov.behave.projeto03

Crie pastas acesso e obras abaixo da pasta stories

Page 46: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 46

Exercício 3Exercício 3 HistóriasHistórias

Na pasta acesso crie um arquivo chamado acessar-sistema.story

Aplique ao arquivo o snippet 01 acessar-sistema.story

No pacote tests crie a classe AcessoTests.java

Aplique na classe criada o snippet 02 AcessoTests.java

Page 47: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 47

Exercício 3Exercício 3 HistóriasHistórias

Execute a classe AcessoTests e verifique os erros

(br.gov.frameworkdemoiselle.behave.exception.BehaveException: [Tela de Login] não encontrada. Verifique seu mapeamento de tela)

É necessário criar um mapeamentopara a a tela de login

Page 48: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 48

Exercício 3Exercício 3 Criando Mapeamento da Tela de Criando Mapeamento da Tela de

LoginLogin No pacote config crie a classe

Config.java Aplique o snippet 03 Config.java No pacote pages crie a classe

PaginaLogin.java Aplique o snippet 04 PaginaLogin.java Execute os testes e verifique os

resultados

(br.gov.frameworkdemoiselle.behave.exception.BehaveException: [Tela Principal] não encontrada. Verifique seu mapeamento de tela)

Mais um mapeamentonecessário

Page 49: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 49

Exercício 3Exercício 3 Criando Mapeamento da Tela de Criando Mapeamento da Tela de

LoginLogin No pacote pages crie a classe

PaginaPrincipal.java Aplique o snippet 05

PaginaPrincipal.java Execute os testes, agora sem erros

Page 50: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 50

Exercício 3Exercício 3 Mais HistóriasMais Histórias

crie o arquivo enviar-lance.story na pasta obras

Aplique o snippet 06 enviar-lance.story Crie a classe ObrasTests no pacote

tests Aplique o snippet 07 ObrasTests.java Execute a classe ObrasTests e verifique

os erros

br.gov.frameworkdemoiselle.behave.exception.BehaveException: [Lista de Obras] não encontrada. Verifique seu mapeamento detela

Mais um mapeamentonecessário

Page 51: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 51

Exercício 3Exercício 3 Mais HistóriasMais Histórias

No pacote pages crie as classes PaginaEnvioLance e PaginaListarObras

Aplique os respectivos snippets 08 PaginaEnvioLance.java e 09 PaginaListarObras.java

Execute a classe ObrasTests e verifique os erros

@Given("decremento \"500.0\" reais do \"melhor valor\"")public void givenDecremento5000ReaisDomelhorValor() { // PENDENTE }

@Given("decremento \"7\" dias do \"melhor prazo\"")public void givenDecremento7DiasDomelhorPrazo() { // PENDENTE }

Falta alguns passosFaltam alguns

passos

Page 52: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 52

Exercício 3Exercício 3 Criando Passos CustomizadosCriando Passos Customizados

No pacote steps crie a classe PassosObras

Aplique o snippet 10 PassosObras.java Inclua na classe ObrasTests o

PassoObras (e seu respectivo import):

public class ObrasTests {...@Testpublic void testAllObras() throws Throwable {

eng.addSteps(new PassosObras());eng.addStories("/stories/acesso/acessar-sistema.story");eng.addStories("/stories/obras/");eng.run();

...

Page 53: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 53

Exercício 3Exercício 3 Criando Passos CustomizadosCriando Passos Customizados

Execute novamente todos os testes. Neste momento não deve haver a ocorrência de erros.

Page 54: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 54

Exercício 3Exercício 3 Criando Passos CustomizadosCriando Passos Customizados

Desafio: Crie o cenário “Enviar Lance Perdedor por Valor” Crie novos cenários “Criar Obra”, “Excluir Obras”, ...

Page 55: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 55

Exercício 3Exercício 3 Uso do DataProviderUso do DataProvider

Utilize o recurso de DataProvider para não exibir a senha do usuário nas histórias.

Adicione a linha abaixo no construtor da classe PassosObras

Ajuste os cenários da história: enviar-lance.story

Rode novamente os testes

public PassosObras(){dataProvider.put("válida", "188542");

}

Cenário: Enviar Lance VencedorAcesso ao Sistema com usuário "06762344887" e senha "válida"Dado que vou para a tela "Lista de Obras"...

substituiçãoda senha

Page 56: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 56

ConfiguraçõesConfigurações Aplicações lentasAplicações lentas

Um problema recorrente na automação de testes é a espera de elementos de tela que por lentidão do sistema podem quebrar o script de teste.

O Demoiselle Behave torna transparente o tratamento de espera dos elementos.

Associado a este recurso é possível configurar o tempo máximo e mínimo de espera dos elementos. Estes valores podem ser configurados no arquivo behave.properties

behave.runner.screen.maxWait=10000behave.runner.screen.minWait=100

Page 57: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 57

ConfiguraçõesConfigurações Aplicações lentasAplicações lentas

A aplicação Treino foi projetada para simular lentidão. Acesse o menu “Obras - Testes Demoiselle Behave” Informe 10 segundos de Delay do Sistema e salve.

Page 58: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 58

ConfiguraçõesConfigurações Aplicações lentasAplicações lentas

Inclua a propridade de espera do DBehave para 5 segundos no arquivo behave.properties

Rode os testes e verifique os comportamentos dos testes

Dado que vou para a tela "Tela Principal" (FAILED)(org.openqa.selenium.TimeoutException:Timed out waiting for page load.

behave.runner.screen.maxWait=5000

Page 59: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 59

ConfiguraçõesConfigurações Aplicações lentasAplicações lentas

Suba o tempo máximo de espera para 20 segundos

Rode os testes que agora deverão ser executados com sucesso.

Após o experimento volte a aplicação para o delay “0”.

behave.runner.screen.maxWait=20000

Page 60: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 60

ConfiguraçõesConfigurações Multiplos NavegoresMultiplos Navegores

O Firefox é o único navegador com API nativa para uso do WebDriver

Para os demais navegadores é preciso obter os respectivos drivers referentes a versão do sistema operacional

Exemplo Google Chrome Versões antigas em:

http://code.google.com/p/chromedriver/downloads/list Versões atuais em:

http://chromedriver.storage.googleapis.com/index.html?path=2.9/

Page 61: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 61

ConfiguraçõesConfigurações Multiplos NavegoresMultiplos Navegores

Obtido o driver para o seu navegador, basta configurar as seguintes propriedades no behave.properties:

Atualmente o dbehave suporta os seguintes drivers:

behave.runner.screen.driverPath=/caminho/chromedriverbehave.runner.screen.type=GoogleChrome

caminho absolutodo driver

Tipo de driver

MozillaFirefox

SafariInternetExplorer

GoogleChrome

HtmlUnit

RemoteWeb

Page 62: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 62

ConfiguraçõesConfigurações Multiplos NavegoresMultiplos Navegores

Baixe o driver correspondente ao seu navegador do Google Chrome:

http://chromedriver.storage.googleapis.com/index.html?path=2.9/

Configure o behave.properties e rode novamente seus testes para o navegador Google Chrome:

behave.runner.screen.driverPath=../seucaminho/chromedriverbehave.runner.screen.type=GoogleChrome

Page 63: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 63

ConfiguraçõesConfigurações log4jlog4j

O Demoiselle Behave utiliza o componente log4j para registrar seus logs que podem ser realizados nos seguintes níveis:

Info Warn Error Debug

O nível debug é aquele que apresenta mais informações e pode ajudar na detecção de algum bug mais sutil ou ajudar no entendimento da execução dos testes.

Page 64: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 64

ConfiguraçõesConfigurações log4jlog4j

Por exemplo, é possível ver o valor de todas as variáveis do framework no nível debug

Experimente: Abra o arquivo log4j.xml e modifique a

categoria “br.gov.frameworkdemoiselle.behave” para “debug”

<category name="br.gov.frameworkdemoiselle.behave"><priority value="debug" /><appender-ref ref="LOG-FILE" /><appender-ref ref="LOG-CONSOLE" />

</category>

Page 65: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 65

ConfiguraçõesConfigurações log4jlog4j

Rode qualquer teste e verifique a saída do log

09:59:35,785 DEBUG (main) [BehaveConfig]: ------- Propriedades ----------09:59:35,785 DEBUG (main) [BehaveConfig]: behave.message.locale=pt09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.commonssteps.enabled=true09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.identification.scenario.pattern.en=^(\s)*(SCENARIO|Scenario|scenario):(.*)09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.identification.scenario.pattern.pt=^(\s)*(CENÁRIO|Cenário|cenário):(.*)09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.language=pt09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.prefixes.bdd.pattern.en=^(\s)*(GIVEN |WHEN |THEN |AND |BUT |Given |When |Then |And |But |given |when |then |and |but )(.*)09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.prefixes.bdd.pattern.pt=^(\s)*(DADO |QUANDO |ENTÃO |E |MAS |Dado |Quando |Então |Mas |dado |quando |então |e |mas )(.*)09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.story.extension.converted=storyConverted09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.story.extension.original=story09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.story.timeout=2160009:59:35,785 DEBUG (main) [BehaveConfig]: behave.runner.catchUIException=org.openqa.selenium.StaleElementReferenceException09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.proxy.enabled=false;09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.proxy.url=09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.driverPath=/home/00000000000/Downloads/chromedriver09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.maxWait=2000009:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.minWait=10009:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.type=GoogleChrome09:59:35,786 DEBUG (main) [BehaveConfig]: behave.version=1.3.2 em: 30/05/2014 15:1209:59:35,786 DEBUG (main) [BehaveConfig]: load.level=2

Page 66: Demoiselle Behave - Parte 2

Módulo 2 – Automação Web 66

Conclusão do MóduloConclusão do Módulo ResumoResumo

Vimos como funciona o Runner do Demoiselle Behave para aplicações Web;

Experimentamos o uso da API Selenium para automação; Identificamos que esta abordagem de testes não incentiva a

colaboração proposta pelo BDD; Apresentamos a estratégia de Mapeamento de Tela que reduz

substancialmente a geração de código Selenium; Conhecemos as configurações adicionais do DBehave que

permitem flexibilizar ainda mais seu projeto de testes.