Treinamento da ferramenta de automação de testes de software Demoiselle Behave (http://demoiselle.github.io/behave/).
Parte 3: Mostra como realizar testes automáticos em BDD para aplicações Java Desktop
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 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 do
Módulo 2Módulo 2
Alvo doAlvo do
Módulo 3Módulo 3
4. 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
5. 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/
6. 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 {
...
7. 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...)
8. 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 classe
a ser localizadaÍndice utilizado quando
houvermais de um
elemento
9. 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.
10. 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 última
versão
Escolha a última
versão
11. 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
12. 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.
13. Módulo 3 – Automação Desktop 13
Exercício 4Exercício 4
ExecuçãoExecução
Execute a classe MyTest pelo JUnit
14. 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
15. 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 seu
FestStartup
public class MeuFestStartup implements FestStartup {
public JFrame getFrame() {
//meus procedimentos
//retorno do JFrame principal da aplicação
return null;
}
}
behave.runner.app.startupFrame=demoisellebehave.treino.MeuFestStartup
16. 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
17. 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();
@Test
public void testAllObras() throws Throwable {
eng.addStories("/stories");
eng.run();
}
Instância o contexto
do DBehave
Teste JUnit padrão
Adiciona a pasta que
contém as histórias a
serem executadas.
Inicia o teste
18. 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
19. Módulo 3 – Automação Desktop 19
Exercício 5Exercício 5
ObjetivosObjetivos
Criação de passos personalizados
Utilização do ElementMap
20. 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
21. 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
22. 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 passo
Obtem o runner
desktop
Executa a ação de clica
oor meio do robo do FEST
Obtem o elemento
Faz o Cast do objeto para um
elemento de UI desktop
23. 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)
@Test
public 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 a
história que rodarenis,
que será criada na sequência
Executa o teste
24. 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
25. 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 mensagem
a ser verificada
Clica no botão OK
26. 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 a
tela de mensagem
27. Módulo 3 – Automação Desktop 27
Exercício 5Exercício 5
Criando Nova TelaCriando Nova Tela
Cria a classe
MyInfoScreenRightClick
Aplique o snippet 05
MyInfoScreenRightClick.java
Execute pelo JUnit a classe MyTest
28. 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
29. 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
30. Módulo 3 – Automação Desktop 30
Exercício 6Exercício 6
ObjetivoObjetivo
Explorar os localizadores de elementos de tela desktop
31. 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:
32. 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])
33. 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
34. 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
35. 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
36. 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
37. 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.