Transcript
Page 1: Demoiselle Behave - Parte 3

Treinamento:Treinamento:

AutomaçãoAutomaçãode Testesde Testes

Módulo 03 – Automação DesktopMódulo 03 – Automação Desktop

Page 2: Demoiselle Behave - Parte 3

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

Page 3: Demoiselle Behave - Parte 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 doMódulo 2Módulo 2Alvo doAlvo do

Módulo 3Módulo 3

Page 4: Demoiselle Behave - Parte 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

Page 5: Demoiselle Behave - Parte 3

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/

Page 6: Demoiselle Behave - Parte 3

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 {...

Page 7: Demoiselle Behave - Parte 3

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...)

Page 8: Demoiselle Behave - Parte 3

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

Page 9: Demoiselle Behave - Parte 3

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.

Page 10: Demoiselle Behave - Parte 3

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

Page 11: Demoiselle Behave - Parte 3

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

Page 12: Demoiselle Behave - Parte 3

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.

Page 13: Demoiselle Behave - Parte 3

Módulo 3 – Automação Desktop 13

Exercício 4Exercício 4 ExecuçãoExecução

Execute a classe MyTest pelo JUnit

Page 14: Demoiselle Behave - Parte 3

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

Page 15: Demoiselle Behave - Parte 3

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

Page 16: Demoiselle Behave - Parte 3

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

Page 17: Demoiselle Behave - Parte 3

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

Page 18: Demoiselle Behave - Parte 3

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

Page 19: Demoiselle Behave - Parte 3

Módulo 3 – Automação Desktop 19

Exercício 5Exercício 5 ObjetivosObjetivos

Criação de passos personalizados Utilização do ElementMap

Page 20: Demoiselle Behave - Parte 3

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

Page 21: Demoiselle Behave - Parte 3

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

Page 22: Demoiselle Behave - Parte 3

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

Page 23: Demoiselle Behave - Parte 3

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

Page 24: Demoiselle Behave - Parte 3

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

Page 25: Demoiselle Behave - Parte 3

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

Page 26: Demoiselle Behave - Parte 3

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

Page 27: Demoiselle Behave - Parte 3

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

Page 28: Demoiselle Behave - Parte 3

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

Page 29: Demoiselle Behave - Parte 3

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

Page 30: Demoiselle Behave - Parte 3

Módulo 3 – Automação Desktop 30

Exercício 6Exercício 6 ObjetivoObjetivo

Explorar os localizadores de elementos de tela desktop

Page 31: Demoiselle Behave - Parte 3

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:

Page 32: Demoiselle Behave - Parte 3

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])

Page 33: Demoiselle Behave - Parte 3

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

Page 34: Demoiselle Behave - Parte 3

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

Page 35: Demoiselle Behave - Parte 3

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

Page 36: Demoiselle Behave - Parte 3

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

Page 37: Demoiselle Behave - Parte 3

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.