Treinamento:Treinamento:
AutomaçãoAutomaçãode Testesde Testes
Módulo 03 – Automação DesktopMódulo 03 – Automação Desktop
Módulo 3 – Automação Desktop 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 3 – Automação Desktop 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 3Módulo 3
Módulo 3 – Automação Desktop 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-fest</artifactId><version>1.4.0</version><scope>test</scope>
</dependency></dependencies>
Incluindo o Runner Fest
Módulo 3 – Automação Desktop 5
Runner FESTRunner FEST FESTFEST
É uma coleção de bibliotecas, lançada sob a licença Apache 2.0, cuja missão é simplificar os testes automatizados de softwares para Java Desktop.
É composto por vários módulos, que podem ser usados tanto no TestNG como no JUnit.
Site: http://fest.easytesting.org/
Módulo 3 – Automação Desktop 6
Runner FESTRunner FEST Localizadores de TelaLocalizadores de Tela
No FEST os localizadores de tela utilizam o atributo title da janela como forma de encontrá-los.
@ScreenMap(name = "Tela de Login", location = "Autenticação")public class MinhaTelaDeLogin {...
Módulo 3 – Automação Desktop 7
Runner FESTRunner FEST Localizadores de elementos de telaLocalizadores de elementos de tela
No FEST os localizadores implemetados são: Label: Seleciona o objeto de tela que possua o text visível. Name: Seleciona o objeto de tela que tenha o identificador selecionado
pelo desenvolvedor. ClassName: Seleciona o objeto de tela que tenha a classe definida
(JPanel, JButton...)
Módulo 3 – Automação Desktop 8
Runner FESTRunner FEST Localizadores de Elementos de TelaLocalizadores de Elementos de Tela
Caso haja mais de um elemento com os mesmos atributos, será possível identificá-los pelo índice. O índice é calculado na sequencia em que os elementos são exibidos.
Neste caso utilizar o @ElementIndex, conforme exemplo:
@ElementMap(name = "Nome do Campo", locatorType = ElementLocatorType.ClassName, locator = "JTextField")@ElementIndex(index = 1)private TextField atributo;
Nome do elemento
Busca por Classe
Nome da classea ser localizadaÍndice utilizado quando
houvermais de um elemento
Módulo 3 – Automação Desktop 9
Exercício 4Exercício 4 ObjetivoObjetivo
Criar um projeto de testes para Java Desktop; Entender a aplicação de exemplo; Conhecer o mapeamento de tela para Java Desktop.
Módulo 3 – Automação Desktop 10
Exercício 2Exercício 2 Criando Projeto 04Criando Projeto 04
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-fest-archetype
Escolha a últimaversão
Escolha a últimaversão
Módulo 3 – Automação Desktop 11
Exercício 2Exercício 2 Criando Projeto 02Criando Projeto 02
Informe o Group Id: br.gov.serpro.behave Informe o Artifact Id: projeto04
Módulo 3 – Automação Desktop 12
Exercício 4Exercício 4 Criando Projeto 04Criando Projeto 04
A classe MyFrame é um exemplo de aplicação Java Swing.
Na pasta src/test/java encontra-se os testes e mapeamentos de tela da aplicação exemplo.
Na pasta src/test/resources encontram-se as histórias semelhante ao demais projetos DBehave.
Módulo 3 – Automação Desktop 13
Exercício 4Exercício 4 ExecuçãoExecução
Execute a classe MyTest pelo JUnit
Módulo 3 – Automação Desktop 14
Exercício 4Exercício 4 InicializaçãoInicialização
A aplicação a ser testada precisar estar no classpath do projeto de testes para que se possa manipular seus elementos.
A forma mais simples para inicializar a aplicação é informando a classe que possui o método main por meio da propriedade:
behave.runner.app.mainClass=br.gov.serpro.behave.projeto04.MyFrame
Módulo 3 – Automação Desktop 15
Exercício 4Exercício 4 InicializaçãoInicialização
Alguns sistemas possuem uma inicialização mais complexa e por isso não é possível chamar apenas seu main.
Neste caso, crie uma classe do tipo FestStartup para realizar os procedimento necessários de inicialização do seu sistema e Informe esta classe no behave.properties.
Interface a ser implemetada
Informando seuFestStartup
public class MeuFestStartup implements FestStartup {public JFrame getFrame() {
//meus procedimentos//retorno do JFrame principal da aplicaçãoreturn null;
}}
behave.runner.app.startupFrame=demoisellebehave.treino.MeuFestStartup
Módulo 3 – Automação Desktop 16
Exercício 4Exercício 4 Análise da HistóriaAnálise da História
Cenário: Acesso ao Sistema Com Usuário Inválido
Dado que vou para a tela "Tela de Login"Então será exibido no "Rótulo Usuário" o valor "Usuário:"Então será exibido no "Rótulo Senha" o valor "Senha:"Quando informo "demoiselleX" no campo "Campo Usuário"E informo "behave" no campo "Campo Senha"Quando clico em "Entrar"Então vou para a tela "Mensagem de Erro"Então será exibido "Usuário ou senha Inválida"Então clico em "OK"
Título do cenário
Preenchimento dos campos
Clica em Entrar
A mensagem de erro é exibida
Módulo 3 – Automação Desktop 17
Exercício 4Exercício 4 Análise do Código (Análise do Código (MyTest.java))
private BehaveContext eng = BehaveContext.getInstance();
@Testpublic void testAllObras() throws Throwable {
eng.addStories("/stories");eng.run();
}
Instância o contexto do DBehave
Teste JUnit padrão
Adiciona a pasta quecontém as histórias aserem executadas.
Inicia o teste
Módulo 3 – Automação Desktop 18
Exercício 4Exercício 4 Análise do Código (MyScreen.java)Análise do Código (MyScreen.java)
@ScreenMap(name = "Tela de Login", location = "Autenticação")public class MyScreen {
@ElementMap(name = "Rótulo Usuário", locatorType = ElementLocatorType.Label, locator = "Usuário:")
private Label labelUsuario;
@ElementMap(name = "Campo Usuário", locatorType = ElementLocatorType.Name, locator = "user")
private TextField campoUsuario; ...
Title da janela Swing
Procura o Elemento pelo Label
Procura o Elemento pelo Name
Módulo 3 – Automação Desktop 19
Exercício 5Exercício 5 ObjetivosObjetivos
Criação de passos personalizados Utilização do ElementMap
Módulo 3 – Automação Desktop 20
Exercício 5Exercício 5 Atualizando o Aplicativo DemoAtualizando o Aplicativo Demo
Iremos adicionar um novo comportamento ao campo de usuário da aplicação de exemplo.
Ao clique do botão direito o sistema exibirá uma mensagem
Módulo 3 – Automação Desktop 21
Exercício 5Exercício 5 Criando Passos CustomizadosCriando Passos Customizados
Substitua o código da classe MyFrame pelo snippet “01 MyFrame.java”
Crie a classe MySteps no pacote br.gov.serpro.behave.projeto04.
Aplique o snippet 02 MySteps.java Inclua o passo customizado aplicando
o snippet 03 MyTest.java na classe MyTest
Módulo 3 – Automação Desktop 22
Exercício 5Exercício 5 Análise do Código (MySteps.java)Análise do Código (MySteps.java)
@When("clico com botão direito no campo \"$local\"")public void rightClick(String local) {
FestRunner festRunner = (FestRunner) runner;Element e = runner.getElement(currentPageName, local);DesktopTextField dTF = (DesktopTextField) e;festRunner.robot.click(dTF.getElement(), MouseButton.RIGHT_BUTTON);
}
Novo passoObtem o runner
desktop
Executa a ação de clicaoor meio do robo do FEST
Obtem o elemento
Faz o Cast do objeto para um elemento de UI desktop
Módulo 3 – Automação Desktop 23
Exercício 5Exercício 5 Análise do Código (MyTest.java)Análise do Código (MyTest.java)
@Testpublic void testAllObras() throws Throwable {
eng.addSteps(new MySteps());eng.addStories("/stories/botaoDireito.story");eng.run();
}
Adiciona a nova classe de passos no contexto
Adicionamos apenas ahistória que rodarenis,
que será criada na sequência
Executa o teste
Módulo 3 – Automação Desktop 24
Exercício 5Exercício 5 Criando HistóriaCriando História
Crie um novo arquivo de história chamado botaoDireito.story
Aplique ao arquivo o snippet 04 botaoDireito.story
Módulo 3 – Automação Desktop 25
Exercício 5Exercício 5 Análise da HistóriaAnálise da História
Cenário: Clique com botão direito do mouse
Dado que vou para a tela "Tela de Login"Quando clico com botão direito no campo "Campo Usuário"Então vou para a tela "Mensagem de Alerta de Botão Direito"Então será exibido "Você clicou com o botão direito do mouse no campo"Então clico em "OK"
Título do cenário
Novo passo
A mensagema ser verificada
Clica no botão OK
Módulo 3 – Automação Desktop 26
Exercício 5Exercício 5 ExecuçãoExecução
Execute a classe MyTest pelo JUnit e analise a falha gerada.
Dado que vou para a tela "Tela de Login"Quando clico com botão direito no campo "Campo Usuário"Então vou para a tela "Mensagem de Alerta de Botão Direito" (FAILED)(br.gov.frameworkdemoiselle.behave.exception.BehaveException: [Mensagem de Alerta de Botão Direito] não encontrada. Verifique seu mapeamento de tela)11:00:03,969 INFO (pool-1-thread-1) [ScreenShootingMaker]:
Precisamos criar o mapeamento para atela de mensagem
Módulo 3 – Automação Desktop 27
Exercício 5Exercício 5 Criando Nova Tela Criando Nova Tela
Cria a classe MyInfoScreenRightClick
Aplique o snippet 05 MyInfoScreenRightClick.java
Execute pelo JUnit a classe MyTest
Módulo 3 – Automação Desktop 28
br.gov.serpro.behave.projeto04.MyFrame[name='frame0', title='Autenticação',... javax.swing.JRootPane[] javax.swing.JPanel[name='null.glassPane'] javax.swing.JLayeredPane[] javax.swing.JPanel[name='null.contentPane'] javax.swing.JButton[name=null, text='Entrar', enabled=true, ... javax.swing.JLabel[name=null, text='Usuário:', enabled=true, ... javax.swing.JLabel[name=null, text='Senha:', enabled=true, ... javax.swing.JPasswordField[name='password', enabled=true, ... javax.swing.JTextField[name='user', text='', enabled=true, ... javax.swing.JButton[name=null, text='Sair', enabled=true, ...
Localização de Elementos de TelaLocalização de Elementos de Tela Árvore de ComponentesÁrvore de Componentes
Para facilitar a localização dos objetos de tela, o Fest fornece uma visualização completa da árvore de componentes da janela atual no console dos testes
Este elemento pode ser encontrado utilizando o localizador ClassName
Este elemento pode ser encontrado utilizando o localizador Label
Este elemento pode ser encontrado utilizando o localizador Name
Janela Atual
Módulo 3 – Automação Desktop 29
Localização de Elementos de TelaLocalização de Elementos de Tela Árvore de ComponentesÁrvore de Componentes
Visualização no console quando um elemento não é encontrado na janela e a árvore de objetos é mostrada
Módulo 3 – Automação Desktop 30
Exercício 6Exercício 6 ObjetivoObjetivo
Explorar os localizadores de elementos de tela desktop
Módulo 3 – Automação Desktop 31
Exercício 6Exercício 6 Atualizando a HistóriaAtualizando a História
Aplique o snippet 01 botaoDireito.story no arquivo de história botaoDireito.story
Execute pelo JUnit a classe MyTest e um erro será exibido:
Módulo 3 – Automação Desktop 32
Exercício 6Exercício 6 ExecuçãoExecução
Verifique os detalhes do erro no console:
E clico em "Sair" (FAILED)(br.gov.frameworkdemoiselle.behave.exception.BehaveException: Elemento [Sair] não encontrado na tela [Tela de Login])
Módulo 3 – Automação Desktop 33
Exercício 6Exercício 6 Criando Mapeamento do Botão SairCriando Mapeamento do Botão Sair
Aplique o snippet 02 MyScreen.java no arquivo MyScreen.java dentro do pacote br.gov.serpro.behave.projeto04
As seguintes linhas serão adicionadas ao arquivo
@ElementMap(name = "Sair", locatorType = ElementLocatorType.ClassName, locator = "NOME_DA_CLASSE_DO_OBJETO")private Button botaoSair;
Nome do objeto na história Buscará o objeto pelo nome da classe
Nome da classe que será busca
Módulo 3 – Automação Desktop 34
Exercício 6Exercício 6 ExecuçãoExecução
Verifique os detalhes do erro no console
E clico em "Sair" (FAILED)(br.gov.frameworkdemoiselle.behave.exception.BehaveException: Elemento não encontrado. Container: br.gov.serpro.behave.projeto04.MyFrame[frame0,550,370,331x158,layout=java.awt....----------------------------------------------Árvore de objetos: br.gov.serpro.behave.projeto04.MyFrame[name='frame0', title='Autenticação', ... javax.swing.JRootPane[] javax.swing.JPanel[name='null.glassPane'] javax.swing.JLayeredPane[] javax.swing.JPanel[name='null.contentPane'] javax.swing.JButton[name=null, text='Entrar', enabled=true, ... javax.swing.JLabel[name=null, text='Usuário:', enabled=true, ... javax.swing.JLabel[name=null, text='Senha:', enabled=true, ... javax.swing.JPasswordField[name='password', enabled=true, ... javax.swing.JTextField[name='user', text='', enabled=true, ... javax.swing.JButton[name=null, text='Sair', enabled=true, ...
Mensagem de alerta
Objeto que devemos mapear
Módulo 3 – Automação Desktop 35
Exercício 6Exercício 6 Melhorando o Mapeamento do Botão SairMelhorando o Mapeamento do Botão Sair
Antes
Depois
@ElementMap(name = "Sair", locatorType = ElementLocatorType.ClassName, locator = "NOME_DA_CLASSE_DO_OBJETO")private Button botaoSair;
@ElementMap(name = "Sair", locatorType = ElementLocatorType.ClassName, locator = "JButton")@ElementIndex(index = 1)private Button botaoSair;
Buscaremos pela classe JButton
Pegaremos a segunda ocorrência
Módulo 3 – Automação Desktop 36
Exercício 6Exercício 6 ExecuçãoExecução
Execute pelo JUnit a classe MyTest Seu teste deve passar com sucesso
Módulo 3 – Automação Desktop 37
Conclusão do MóduloConclusão do Módulo ResumoResumo
Vimos como funciona o Runner do Demoiselle Behave para aplicações Java Desktop;
Experimentamos o uso da API Fest; Verificamos que a construção de histórias no DBehave é um
processo que independe da interface gráfica a ser testada.