SlideShare uma empresa Scribd logo
1 de 66
Baixar para ler offline
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.

Mais conteúdo relacionado

Mais procurados

Curso treinamento automação de testes com selenium
Curso treinamento automação de testes com seleniumCurso treinamento automação de testes com selenium
Curso treinamento automação de testes com seleniumCristiano Caetano
 
13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver
13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver
13º É dia de Java: Automação de Testes Funcionais com Selenium Web driverJúlio de Lima
 
Introdução à Programação em Java - Aula 1 (PT-PT)
Introdução à Programação em Java - Aula 1 (PT-PT)Introdução à Programação em Java - Aula 1 (PT-PT)
Introdução à Programação em Java - Aula 1 (PT-PT)Manoel Campos da Silva Filho
 
O que esperar do Zend Framework 2
O que esperar do Zend Framework 2O que esperar do Zend Framework 2
O que esperar do Zend Framework 2Flávio Lisboa
 
Tipos de automação de teste
Tipos de automação de testeTipos de automação de teste
Tipos de automação de testeMarcos Pessoa
 
98796699 selenium-framework
98796699 selenium-framework98796699 selenium-framework
98796699 selenium-frameworkAndré Caldas
 
Introdução a testes de software utilizando selenium
Introdução a testes de software utilizando seleniumIntrodução a testes de software utilizando selenium
Introdução a testes de software utilizando seleniumSandy Maciel
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingVinícius Thiengo
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de softwarericardophp
 
Automatização de testes funcionais com selenium etapa 1
Automatização de testes funcionais com selenium  etapa 1Automatização de testes funcionais com selenium  etapa 1
Automatização de testes funcionais com selenium etapa 1Cintia Armesto
 
Java Fx Guia De IntroduçãO
Java Fx Guia De IntroduçãOJava Fx Guia De IntroduçãO
Java Fx Guia De IntroduçãOdanielfc
 
Selenium
SeleniumSelenium
Seleniumfatec
 
Lottie API Para Animações no Android
Lottie API Para Animações no AndroidLottie API Para Animações no Android
Lottie API Para Animações no AndroidVinícius Thiengo
 
Automação de testes funcionais com selenium webdriver
Automação de testes funcionais com selenium webdriverAutomação de testes funcionais com selenium webdriver
Automação de testes funcionais com selenium webdriverQualister
 
Selenium Workshop
Selenium Workshop Selenium Workshop
Selenium Workshop Thoughtworks
 
Baixando, instalando e testando o android sdk
Baixando, instalando e testando o android sdkBaixando, instalando e testando o android sdk
Baixando, instalando e testando o android sdkReuel Lopes
 

Mais procurados (20)

Curso treinamento automação de testes com selenium
Curso treinamento automação de testes com seleniumCurso treinamento automação de testes com selenium
Curso treinamento automação de testes com selenium
 
13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver
13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver
13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver
 
Teste Driven Development
Teste Driven DevelopmentTeste Driven Development
Teste Driven Development
 
Hands On Selenium
Hands On SeleniumHands On Selenium
Hands On Selenium
 
Introdução à Programação em Java - Aula 1 (PT-PT)
Introdução à Programação em Java - Aula 1 (PT-PT)Introdução à Programação em Java - Aula 1 (PT-PT)
Introdução à Programação em Java - Aula 1 (PT-PT)
 
O que esperar do Zend Framework 2
O que esperar do Zend Framework 2O que esperar do Zend Framework 2
O que esperar do Zend Framework 2
 
Tipos de automação de teste
Tipos de automação de testeTipos de automação de teste
Tipos de automação de teste
 
98796699 selenium-framework
98796699 selenium-framework98796699 selenium-framework
98796699 selenium-framework
 
Introdução a testes de software utilizando selenium
Introdução a testes de software utilizando seleniumIntrodução a testes de software utilizando selenium
Introdução a testes de software utilizando selenium
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXing
 
Selenium: visão geral
Selenium: visão geralSelenium: visão geral
Selenium: visão geral
 
Manual
ManualManual
Manual
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de software
 
Automatização de testes funcionais com selenium etapa 1
Automatização de testes funcionais com selenium  etapa 1Automatização de testes funcionais com selenium  etapa 1
Automatização de testes funcionais com selenium etapa 1
 
Java Fx Guia De IntroduçãO
Java Fx Guia De IntroduçãOJava Fx Guia De IntroduçãO
Java Fx Guia De IntroduçãO
 
Selenium
SeleniumSelenium
Selenium
 
Lottie API Para Animações no Android
Lottie API Para Animações no AndroidLottie API Para Animações no Android
Lottie API Para Animações no Android
 
Automação de testes funcionais com selenium webdriver
Automação de testes funcionais com selenium webdriverAutomação de testes funcionais com selenium webdriver
Automação de testes funcionais com selenium webdriver
 
Selenium Workshop
Selenium Workshop Selenium Workshop
Selenium Workshop
 
Baixando, instalando e testando o android sdk
Baixando, instalando e testando o android sdkBaixando, instalando e testando o android sdk
Baixando, instalando e testando o android sdk
 

Semelhante a Automação Web com Selenium e BDD

Testes Funcionais com Selenium
Testes Funcionais com Selenium Testes Funcionais com Selenium
Testes Funcionais com Selenium Mayron Cachina
 
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosParalelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosElias Nogueira
 
Performance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkPerformance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkJaime Neto
 
JSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaJSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaDr. Spock
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2Cezar Souza
 
[TDC2015] De unitário a aceitação: Automação de testes com Codeception
[TDC2015] De unitário a aceitação: Automação de testes com Codeception[TDC2015] De unitário a aceitação: Automação de testes com Codeception
[TDC2015] De unitário a aceitação: Automação de testes com CodeceptionQualister
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...Bruno Tanoue
 
Aplicações Profissionais para Internet com Zend Framework
Aplicações Profissionais para Internet com Zend FrameworkAplicações Profissionais para Internet com Zend Framework
Aplicações Profissionais para Internet com Zend FrameworkFlávio Lisboa
 
Desenvolvimento web ágil com Python e web2py #qconsp #qcon
Desenvolvimento web ágil com Python e web2py #qconsp #qconDesenvolvimento web ágil com Python e web2py #qconsp #qcon
Desenvolvimento web ágil com Python e web2py #qconsp #qconBruno Rocha
 
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Tchelinux
 
Testes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosTestes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosDiego Santos
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlDiego Tremper
 
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Daniel Makiyama
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 
Construção e provisionamento de ambientes de desenvolvimento virtualizados
Construção e provisionamento de ambientes  de desenvolvimento virtualizadosConstrução e provisionamento de ambientes  de desenvolvimento virtualizados
Construção e provisionamento de ambientes de desenvolvimento virtualizadosThiago Rodrigues
 

Semelhante a Automação Web com Selenium e BDD (20)

Windows Server 2008: Gerenciamento
Windows Server 2008: GerenciamentoWindows Server 2008: Gerenciamento
Windows Server 2008: Gerenciamento
 
Testes Funcionais com Selenium
Testes Funcionais com Selenium Testes Funcionais com Selenium
Testes Funcionais com Selenium
 
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosParalelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
 
Performance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkPerformance de verdade com Phalcon Framework
Performance de verdade com Phalcon Framework
 
JSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaJSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com Java
 
W2py pyconpe
W2py pyconpeW2py pyconpe
W2py pyconpe
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Java Seminar
Java SeminarJava Seminar
Java Seminar
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
 
[TDC2015] De unitário a aceitação: Automação de testes com Codeception
[TDC2015] De unitário a aceitação: Automação de testes com Codeception[TDC2015] De unitário a aceitação: Automação de testes com Codeception
[TDC2015] De unitário a aceitação: Automação de testes com Codeception
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
 
Aplicações Profissionais para Internet com Zend Framework
Aplicações Profissionais para Internet com Zend FrameworkAplicações Profissionais para Internet com Zend Framework
Aplicações Profissionais para Internet com Zend Framework
 
Desenvolvimento web ágil com Python e web2py #qconsp #qcon
Desenvolvimento web ágil com Python e web2py #qconsp #qconDesenvolvimento web ágil com Python e web2py #qconsp #qcon
Desenvolvimento web ágil com Python e web2py #qconsp #qcon
 
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
 
Testes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosTestes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizados
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControl
 
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Construção e provisionamento de ambientes de desenvolvimento virtualizados
Construção e provisionamento de ambientes  de desenvolvimento virtualizadosConstrução e provisionamento de ambientes  de desenvolvimento virtualizados
Construção e provisionamento de ambientes de desenvolvimento virtualizados
 

Automação Web com Selenium e BDD

  • 1. Treinamento:Treinamento: AutomaçãoAutomação de Testesde Testes Módulo 02 – 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.