Post on 06-Jun-2015
description
Treinamento:Treinamento:
AutomaçãoAutomaçãode 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 desteMó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 doMódulo 2Módulo 2Alvo 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 umaInstância do navegador
(driver)
Acessa uma URL
Encontra umelemento da tela
Executa ações
Envia comandosde tecladoLimpa um
campoObtém o fonte
da página
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-bundle\bin\startup.battreino-bundle\bin\startup.bat
treino-bundle\bin\shutdown.battreino-bundle\bin\shutdown.bat
No Linux
No Windows
No Linux
No Windows
Módulo 2 – Automação Web 10
Exercício 2Exercício 2 Aplicação TreinoAplicação Treino
Acesse a aplicação pela url: http://localhost:8080/treino
Use este arquivo queprovê lista de
usuários e senhas
Usuário
Senha
Módulo 2 – Automação Web 11
Exercício 2Exercício 2 Aplicação TreinoAplicação Treino
Lista de Obras
Logout
Página com elementoscomplexos
Módulo 2 – Automação Web 12
Exercício 2Exercício 2 Aplicação TreinoAplicação Treino
Adicionar uma Obra
Reset da Base de Dados
Paginação
Edição Rápida
Envio de Lance
Atual vencedordo leilão
Hora da Atualizaçãodo registro
Módulo 2 – Automação Web 13
Exercício 2Exercício 2 Aplicação TreinoAplicação Treino
Mensagens
Valor do lançe deveser menor que o atual
Prazo deve ser menor que o atual
MensagensEnviar
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 aversã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áginade login
Aguarda carregamento da páginapor 2s. Se usássemos o driver.wait(2000);
Não funciona em todos os casos
WebDriver driver = new FirefoxDriver();
// Tela de Autenticacaodriver.get("http://localhost:8080/treino/");Thread.sleep(2000);
Módulo 2 – Automação Web 20
Exercício 2Exercício 2 Análise do CódigoAnálise do Código
// Autentica Usuariodriver.findElement(By.id("formLogin:j_idt22")).click();driver.findElement(By.xpath("(//input[contains(@id, 'formLogin')][contains(@type, 'text')])[1]")).clear();
driver.findElement(By.id("formLogin:j_idt22")).sendKeys("19296496063");
driver.findElement(By.id("formLogin:j_idt24_input")).clear();
driver.findElement(By.id("formLogin:j_idt24_input")).sendKeys("205253");
driver.findElement(By.id("formLogin:j_idt26")).click();
Thread.sleep(2000);
Informa valores
Encontra elementoPelo id
Aguarda carregamentoda página
Encontra elementoPor um xPath
Informa valores
Clica no botão“Entrar”
Módulo 2 – Automação Web 21
Exercício 2Exercício 2 Análise do CódigoAnálise do Código
// Obtem o valor do ultimo lance e decrementa um centavoDecimalFormat df = new DecimalFormat("###.0");WebElement element = driver.findElement(By.id("fmLance:j_idt77"));double value = df.parse(element.getAttribute("value")).doubleValue();value -= 0.1;driver.findElement(By.id("fmLance:j_idt77")).clear();driver.findElement(
By.id("fmLance:j_idt77")).sendKeys(df.format(value).replace(',', '.'));
Obtém a referência de um elemento da página
Obtém o valordo elemento
Aguarda carregamentoda página
Modifica o valor doelemento
Módulo 2 – Automação Web 22
Exercício 2Exercício 2 Análise do CódigoAnálise do Código
// Obtem a data da propsota e decrementa um diaSimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");Date date = dateFormat.parse(
driver.findElement(By.id("fmLance:j_idt80_input")).getAttribute("value"));
Calendar cl = GregorianCalendar.getInstance();cl.setTime(date);cl.add(Calendar.DAY_OF_MONTH, -1);String melhorDate = dateFormat.format(cl.getTime());
driver.findElement(By.id("fmLance:j_idt80_input")).clear();driver.findElement(By.id("fmLance:j_idt80_input")).sendKeys(melhorDate);
Decrementa a dataem um dia
Obtém o valor docampo data
Informa um novo valorpara o campo data
Módulo 2 – Automação Web 23
Exercício 2Exercício 2 Análise do CódigoAnálise do Código
try {// Enviar a propostadriver.findElement(By.id("fmLance:j_idt81")).click();Thread.sleep(2000);
// Verifica mensagem de proposta aceitaAssert.assertTrue(
driver.getPageSource().contains("Proposta Aceita!!!"));driver.findElement(By.linkText("Sair")).click();
} catch (Exception e) {e.printStackTrace();Assert.fail(e.getMessage());
} finally {driver.close();driver.quit();
}
Obtém o códigoFonte da página
Fechaa janela
Aguarda carregamentoda página
Asserção
Asserção
Fecha o navegador
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ível Neste processo de teste que nível
de de colaboraçãocolaboração seria possível entre seria possível entre
os membros da equipe e seus stakeholdersos membros da equipe e seus stakeholders??
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")
Identificadoramigável da tela
Localização da tela@ScreenMap(
name = "Tela de Busca", base="http://www.google.com.br", location = "/")
Atributo opcional que define o prefixodo localizador. Importante quando deseja-se
parametrizar os localizadoresNeste caso, a localização da telaé concatenada: base + location
Módulo 2 – Automação Web 30
Mapeamento de TelaMapeamento de Tela @ElementMap@ElementMap
@ElementMap(name = "Campo de Busca", locatorType = ElementLocatorType.Id, locator = "gbqfq")
Identificador amigáveldo elemento de tela
Tipos de localizador:ClassName; CssSelector
Id; LinkText; Name;TagName; XPath
Valor de localizador
@ElementMap(name = "Menu Superior", locatorType = ElementLocatorType.Id, locator = { "gbztm", "gbmm" })private Select menuLivros; Pode ser necessário
mais de um localizador
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
ScreenMapScreenMapComportamento
ElementElement+
Dados comComportamento
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 telamapeada
Execute a operaçãode click
Informa o valorde 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 elementopossui 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 telaa 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: visitanteEu quero: acessar o GoogleDe modo que: a tela inicial apareceça para mim
Cenário: Acesso ao Google
Dado que vou para a tela "Tela de Busca"Então será exibido "Google"
Módulo 2 – Automação Web 38
Mapeamento de TelaMapeamento de Tela Integração BDD - Exercício de FixaçãoIntegração BDD - Exercício de Fixação
Adicione ao final do arquivo search.story o seguinte cenário:
Inclua na classe MyPage o botão de pesquisa:
@ElementMap( name = "Pesquisar", locatorType = ElementLocatorType.Id, locator = "gbqfb")private Button botaoPesquisar;
Cenário: Utilização da funcionalidade de pesquisaDado que vou para a tela "Tela de Busca"Quando informo "Demoiselle Behave" no campo "Campo de Busca"Quando clico em "Pesquisar"Então será exibido "Demoiselle Behave"
Módulo 2 – Automação Web 39
Mapeamento de TelaMapeamento de Tela DataProviderDataProvider
Mecanismo do dbehave para armazenar valores durante o teste;
Há frases para guardar valores de campos; Útil para flexibilizar o reuso de dados dinamicamente.
Cenário: Atualizar Processo JudicialDado que obtenho "o número do processo" do campo "Numero Criado"......Quando informo "o número do processo" no campo "Processo Judicial"
Define uma variável para o DataProvider Valor obtido pelo
elemento de tela
Aplica o valor da variávelno elemento de tela
Módulo 2 – Automação Web 40
Mapeamento de TelaMapeamento de Tela DataProviderDataProvider
É possível obter e escrever programaticamente no DataProvider por meio dos métodos get, informando uma chave, e put, informando chave e valor.
public class MeuPasso extends CommonSteps {
@Given("meu passo")public void meuPasso() {
String valor = (String) dataProvider.get(chave);dataProvider.put(chave, valor);
}}
O CommonStepspossui uma referência
ao DataProvider
lendo o dataprovider
escrevendo o dataprovider
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 últimaversã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 mapeamentopara a a tela de login
Módulo 2 – Automação Web 48
Exercício 3Exercício 3 Criando Mapeamento da Tela de Criando Mapeamento da Tela de
LoginLogin No pacote config crie a classe
Config.java Aplique o snippet 03 Config.java No pacote pages crie a classe
PaginaLogin.java Aplique o snippet 04 PaginaLogin.java Execute os testes e verifique os
resultados
(br.gov.frameworkdemoiselle.behave.exception.BehaveException: [Tela Principal] não encontrada. Verifique seu mapeamento de tela)
Mais um mapeamentonecessário
Módulo 2 – Automação Web 49
Exercício 3Exercício 3 Criando Mapeamento da Tela de Criando Mapeamento da Tela de
LoginLogin No pacote pages crie a classe
PaginaPrincipal.java Aplique o snippet 05
PaginaPrincipal.java Execute os testes, agora sem erros
Módulo 2 – Automação Web 50
Exercício 3Exercício 3 Mais HistóriasMais Histórias
crie o arquivo enviar-lance.story na pasta obras
Aplique o snippet 06 enviar-lance.story Crie a classe ObrasTests no pacote
tests Aplique o snippet 07 ObrasTests.java Execute a classe ObrasTests e verifique
os erros
br.gov.frameworkdemoiselle.behave.exception.BehaveException: [Lista de Obras] não encontrada. Verifique seu mapeamento detela
Mais um mapeamentonecessário
Módulo 2 – Automação Web 51
Exercício 3Exercício 3 Mais HistóriasMais Histórias
No pacote pages crie as classes PaginaEnvioLance e PaginaListarObras
Aplique os respectivos snippets 08 PaginaEnvioLance.java e 09 PaginaListarObras.java
Execute a classe ObrasTests e verifique os erros
@Given("decremento \"500.0\" reais do \"melhor valor\"")public void givenDecremento5000ReaisDomelhorValor() { // PENDENTE }
@Given("decremento \"7\" dias do \"melhor prazo\"")public void givenDecremento7DiasDomelhorPrazo() { // PENDENTE }
Falta alguns passosFaltam alguns
passos
Módulo 2 – Automação Web 52
Exercício 3Exercício 3 Criando Passos CustomizadosCriando Passos Customizados
No pacote steps crie a classe PassosObras
Aplique o snippet 10 PassosObras.java Inclua na classe ObrasTests o
PassoObras (e seu respectivo import):
public class ObrasTests {...@Testpublic void testAllObras() throws Throwable {
eng.addSteps(new PassosObras());eng.addStories("/stories/acesso/acessar-sistema.story");eng.addStories("/stories/obras/");eng.run();
...
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 VencedorAcesso ao Sistema com usuário "06762344887" e senha "válida"Dado que vou para a tela "Lista de Obras"...
substituiçãoda 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=10000behave.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/chromedriverbehave.runner.screen.type=GoogleChrome
caminho absolutodo driver
Tipo de driver
MozillaFirefox
SafariInternetExplorer
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/chromedriverbehave.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=pt09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.commonssteps.enabled=true09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.identification.scenario.pattern.en=^(\s)*(SCENARIO|Scenario|scenario):(.*)09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.identification.scenario.pattern.pt=^(\s)*(CENÁRIO|Cenário|cenário):(.*)09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.language=pt09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.prefixes.bdd.pattern.en=^(\s)*(GIVEN |WHEN |THEN |AND |BUT |Given |When |Then |And |But |given |when |then |and |but )(.*)09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.prefixes.bdd.pattern.pt=^(\s)*(DADO |QUANDO |ENTÃO |E |MAS |Dado |Quando |Então |Mas |dado |quando |então |e |mas )(.*)09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.story.extension.converted=storyConverted09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.story.extension.original=story09:59:35,785 DEBUG (main) [BehaveConfig]: behave.parser.story.timeout=2160009:59:35,785 DEBUG (main) [BehaveConfig]: behave.runner.catchUIException=org.openqa.selenium.StaleElementReferenceException09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.proxy.enabled=false;09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.proxy.url=09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.driverPath=/home/00000000000/Downloads/chromedriver09:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.maxWait=2000009:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.minWait=10009:59:35,786 DEBUG (main) [BehaveConfig]: behave.runner.screen.type=GoogleChrome09:59:35,786 DEBUG (main) [BehaveConfig]: behave.version=1.3.2 em: 30/05/2014 15:1209:59:35,786 DEBUG (main) [BehaveConfig]: load.level=2
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.