Treinamento:Treinamento:
AutomaçãoAutomação
de Testesde Testes
Módulo 02 – Automação WebMódulo 02 – Automação Web
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 deste
Módulo
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 do
Módulo 2Módulo 2
Alvo doAlvo do
Módulo 2Módulo 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
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
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
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 uma
Instância do navegador
(driver)
Acessa uma URL
Encontra um
elemento da tela
Executa ações
Envia comandos
de tecladoLimpa um
campo
Obtém o fonte
da página
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
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-bundlebinstartup.battreino-bundlebinstartup.bat
treino-bundlebinshutdown.battreino-bundlebinshutdown.bat
No Linux
No Windows
No Linux
No Windows
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 que
provê lista de
usuários e senhas
Usuário
Senha
Módulo 2 – Automação Web 11
Exercício 2Exercício 2

Aplicação TreinoAplicação Treino
Lista de Obras
Logout
Página com elementos
complexos
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 vencedor
do leilão
Hora da
Atualização
do registro
Módulo 2 – Automação Web 13
Exercício 2Exercício 2

Aplicação TreinoAplicação Treino
Mensagens
Valor do lançe deve
ser menor que o atual
Prazo deve ser
menor que o atual
MensagensEnviar
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
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 a
versão mais atual
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
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”
Módulo 2 – Automação Web 18
Exercício 2Exercício 2

ExecuçãoExecução
 Execute pelo JUnit a classe TreinoTest
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ágina
de login
Aguarda carregamento da página
por 2s. Se usássemos o driver.wait(2000);
Não funciona em todos os casos
WebDriver driver = new FirefoxDriver();
// Tela de Autenticacao
driver.get("http://localhost:8080/treino/");
Thread.sleep(2000);
Módulo 2 – Automação Web 20
Exercício 2Exercício 2

Análise do CódigoAnálise do Código
// Autentica Usuario
driver.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 elemento
Pelo id
Aguarda carregamento
da página
Encontra elemento
Por um xPath
Informa valores
Clica no botão
“Entrar”
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 centavo
DecimalFormat 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 valor
do elemento
Aguarda carregamento
da página
Modifica o valor do
elemento
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 dia
SimpleDateFormat 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 data
em um dia
Obtém o valor do
campo data
Informa um novo valor
para o campo data
Módulo 2 – Automação Web 23
Exercício 2Exercício 2

Análise do CódigoAnálise do Código
try {
// Enviar a proposta
driver.findElement(By.id("fmLance:j_idt81")).click();
Thread.sleep(2000);
// Verifica mensagem de proposta aceita
Assert.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ódigo
Fonte da página
Fecha
a janela
Aguarda carregamento
da página
Asserção
Asserção
Fecha o
navegador
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/
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ívelNeste processo de teste que nível
dede colaboraçãocolaboração seria possível entreseria possível entre
os membros da equipe e seus stakeholdersos membros da equipe e seus stakeholders??
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
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.
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;
}
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")
Identificador
amigável da tela
Localização da tela
@ScreenMap(
name = "Tela de Busca",
base="http://www.google.com.br",
location = "/")
Atributo opcional que define o prefixo
do localizador. Importante quando deseja-se
parametrizar os localizadoresNeste caso, a localização da tela
é concatenada: base + location
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ável
do 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
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
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();
}
}
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
ScreenMapScreenMap
Comportamento
ElementElement
+
Dados com
Comportamento
Page ObjectPage Object
=
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 tela
mapeada
Execute a operação
de click
Informa o valor
de um campo de edição
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 elemento
possui um determinado valor
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 tela
a presença e um texto
Módulo 2 – Automação Web 37
Mapeamento de TelaMapeamento de Tela

Integração BDDIntegração BDD
Funcionalidade: Acesso
Como um: visitante
Eu quero: acessar o Google
De 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"
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 pesquisa
Dado 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"
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 Judicial
Dado 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ável
no elemento de tela
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 CommonSteps
possui uma referência
ao DataProvider
lendo o
dataprovider
escrevendo
o dataprovider
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
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.
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
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 última
versão
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
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
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 mapeamento
para a a tela de login
Módulo 2 – Automação Web 48
Exercício 3Exercício 3

Criando Mapeamento da Tela deCriando 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 mapeamento
necessário
Módulo 2 – Automação Web 49
Exercício 3Exercício 3

Criando Mapeamento da Tela deCriando 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
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 de
tela
Mais um mapeamento
necessário
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 passos
Faltam alguns
passos
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 {
...
@Test
public void testAllObras() throws Throwable {
eng.addSteps(new PassosObras());
eng.addStories("/stories/acesso/acessar-sistema.story");
eng.addStories("/stories/obras/");
eng.run();
...
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.
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”, ...
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 Vencedor
Acesso ao Sistema com usuário "06762344887" e senha "válida"
Dado que vou para a tela "Lista de Obras"
...
substituição
da senha
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=10000
behave.runner.screen.minWait=100
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.
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
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
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/
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/chromedriver
behave.runner.screen.type=GoogleChrome
caminho absoluto
do driver
Tipo de driver
MozillaFirefox
Safari
InternetExplorer
GoogleChrome
HtmlUnit
RemoteWeb
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/chromedriver
behave.runner.screen.type=GoogleChrome
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.
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>
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=pt
09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.commonssteps.enabled=true
09: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=pt
09: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=storyConverted
09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.story.extension.original=story
09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.story.timeout=21600
09:59:35,785 DEBUG (main) [BehaveConfig]: behave.runner.catchUIException=
org.openqa.selenium.StaleElementReferenceException
09: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/chromedriver
09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.maxWait=20000
09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.minWait=100
09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.type=GoogleChrome
09:59:35,786 DEBUG (main) [BehaveConfig]: behave.version=1.3.2 em: 30/05/2014 15:12
09:59:35,786 DEBUG (main) [BehaveConfig]: load.level=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.

Demoiselle Behave - Parte 2

  • 1.
    Treinamento:Treinamento: AutomaçãoAutomação de Testesde Testes Módulo02 – Automação WebMódulo 02 – Automação Web
  • 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 deste Módulo
  • 3.
    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 do Módulo 2Módulo 2 Alvo doAlvo do Módulo 2Módulo 2
  • 4.
    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
  • 5.
    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
  • 6.
    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
  • 7.
    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 uma Instância do navegador (driver) Acessa uma URL Encontra um elemento da tela Executa ações Envia comandos de tecladoLimpa um campo Obtém o fonte da página
  • 8.
    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
  • 9.
    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-bundlebinstartup.battreino-bundlebinstartup.bat treino-bundlebinshutdown.battreino-bundlebinshutdown.bat No Linux No Windows No Linux No Windows
  • 10.
    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 que provê lista de usuários e senhas Usuário Senha
  • 11.
    Módulo 2 –Automação Web 11 Exercício 2Exercício 2  Aplicação TreinoAplicação Treino Lista de Obras Logout Página com elementos complexos
  • 12.
    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 vencedor do leilão Hora da Atualização do registro
  • 13.
    Módulo 2 –Automação Web 13 Exercício 2Exercício 2  Aplicação TreinoAplicação Treino Mensagens Valor do lançe deve ser menor que o atual Prazo deve ser menor que o atual MensagensEnviar
  • 14.
    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
  • 15.
    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 a versão mais atual
  • 16.
    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
  • 17.
    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”
  • 18.
    Módulo 2 –Automação Web 18 Exercício 2Exercício 2  ExecuçãoExecução  Execute pelo JUnit a classe TreinoTest
  • 19.
    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ágina de login Aguarda carregamento da página por 2s. Se usássemos o driver.wait(2000); Não funciona em todos os casos WebDriver driver = new FirefoxDriver(); // Tela de Autenticacao driver.get("http://localhost:8080/treino/"); Thread.sleep(2000);
  • 20.
    Módulo 2 –Automação Web 20 Exercício 2Exercício 2  Análise do CódigoAnálise do Código // Autentica Usuario driver.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 elemento Pelo id Aguarda carregamento da página Encontra elemento Por um xPath Informa valores Clica no botão “Entrar”
  • 21.
    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 centavo DecimalFormat 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 valor do elemento Aguarda carregamento da página Modifica o valor do elemento
  • 22.
    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 dia SimpleDateFormat 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 data em um dia Obtém o valor do campo data Informa um novo valor para o campo data
  • 23.
    Módulo 2 –Automação Web 23 Exercício 2Exercício 2  Análise do CódigoAnálise do Código try { // Enviar a proposta driver.findElement(By.id("fmLance:j_idt81")).click(); Thread.sleep(2000); // Verifica mensagem de proposta aceita Assert.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ódigo Fonte da página Fecha a janela Aguarda carregamento da página Asserção Asserção Fecha o navegador
  • 24.
    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/
  • 25.
    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ívelNeste processo de teste que nível dede colaboraçãocolaboração seria possível entreseria possível entre os membros da equipe e seus stakeholdersos membros da equipe e seus stakeholders??
  • 26.
    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
  • 27.
    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.
  • 28.
    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; }
  • 29.
    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") Identificador amigável da tela Localização da tela @ScreenMap( name = "Tela de Busca", base="http://www.google.com.br", location = "/") Atributo opcional que define o prefixo do localizador. Importante quando deseja-se parametrizar os localizadoresNeste caso, a localização da tela é concatenada: base + location
  • 30.
    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ável do 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
  • 31.
    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
  • 32.
    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(); } }
  • 33.
    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 ScreenMapScreenMap Comportamento ElementElement + Dados com Comportamento Page ObjectPage Object =
  • 34.
    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 tela mapeada Execute a operação de click Informa o valor de um campo de edição
  • 35.
    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 elemento possui um determinado valor
  • 36.
    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 tela a presença e um texto
  • 37.
    Módulo 2 –Automação Web 37 Mapeamento de TelaMapeamento de Tela  Integração BDDIntegração BDD Funcionalidade: Acesso Como um: visitante Eu quero: acessar o Google De 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"
  • 38.
    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 pesquisa Dado 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"
  • 39.
    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 Judicial Dado 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ável no elemento de tela
  • 40.
    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 CommonSteps possui uma referência ao DataProvider lendo o dataprovider escrevendo o dataprovider
  • 41.
    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
  • 42.
    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.
  • 43.
    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
  • 44.
    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 última versão
  • 45.
    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
  • 46.
    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
  • 47.
    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 mapeamento para a a tela de login
  • 48.
    Módulo 2 –Automação Web 48 Exercício 3Exercício 3  Criando Mapeamento da Tela deCriando 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 mapeamento necessário
  • 49.
    Módulo 2 –Automação Web 49 Exercício 3Exercício 3  Criando Mapeamento da Tela deCriando 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
  • 50.
    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 de tela Mais um mapeamento necessário
  • 51.
    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 passos Faltam alguns passos
  • 52.
    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 { ... @Test public void testAllObras() throws Throwable { eng.addSteps(new PassosObras()); eng.addStories("/stories/acesso/acessar-sistema.story"); eng.addStories("/stories/obras/"); eng.run(); ...
  • 53.
    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.
  • 54.
    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”, ...
  • 55.
    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 Vencedor Acesso ao Sistema com usuário "06762344887" e senha "válida" Dado que vou para a tela "Lista de Obras" ... substituição da senha
  • 56.
    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=10000 behave.runner.screen.minWait=100
  • 57.
    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.
  • 58.
    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
  • 59.
    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
  • 60.
    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/
  • 61.
    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/chromedriver behave.runner.screen.type=GoogleChrome caminho absoluto do driver Tipo de driver MozillaFirefox Safari InternetExplorer GoogleChrome HtmlUnit RemoteWeb
  • 62.
    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/chromedriver behave.runner.screen.type=GoogleChrome
  • 63.
    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.
  • 64.
    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>
  • 65.
    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=pt 09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.commonssteps.enabled=true 09: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=pt 09: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=storyConverted 09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.story.extension.original=story 09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.story.timeout=21600 09:59:35,785 DEBUG (main) [BehaveConfig]: behave.runner.catchUIException= org.openqa.selenium.StaleElementReferenceException 09: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/chromedriver 09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.maxWait=20000 09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.minWait=100 09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.type=GoogleChrome 09:59:35,786 DEBUG (main) [BehaveConfig]: behave.version=1.3.2 em: 30/05/2014 15:12 09:59:35,786 DEBUG (main) [BehaveConfig]: load.level=2
  • 66.
    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.