Demoiselle Behave - Parte 2

7.828 visualizações

Publicada em

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)

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
7.828
No SlideShare
0
A partir de incorporações
0
Número de incorporações
6.210
Ações
Compartilhamentos
0
Downloads
46
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Demoiselle Behave - Parte 2

  1. 1. Treinamento:Treinamento: AutomaçãoAutomação de Testesde Testes Módulo 02 – Automação WebMódulo 02 – Automação Web
  2. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 18. Módulo 2 – Automação Web 18 Exercício 2Exercício 2  ExecuçãoExecução  Execute pelo JUnit a classe TreinoTest
  19. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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.

×