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