2. 1. Contextualização
● Por que automatizar?
● Cucumber
● Glue code
● Estrutura dos testes (Cucumber, Java e Selenium)
1. Características atuais do framework
● Estrutura organizada
● Facilidade na adaptação a novos padrões de sistema
● Facilidade na adição de novos passos
● Instalação e Configuração simplificadas
● Manutenção simples de código, sem XPath
● Relatório para visualização do resultado de testes executados
1. Melhorias em desenvolvimento
● Facilidade na digitação de features (utilização de plugin no RAD)
● Integração contínua (Jenkins)
Roteiro desta apresentação
3. ● Testes manuais são uma tarefa repetitiva, propensa a erros;
● Testes automatizados possibilitam a redução do tempo gasto na fase de testes;
● Automatização do caminhamento simples pelas telas (clique em todas as opções do
menu) em geral descobre cerca de 30% dos bugs;
● Esforços podem ser concentrados em outras atividades ou outros tipos de teste
(que não possam ser automatizados), aumentando a qualidade do produto ;
● A automatização facilita a execução de Testes de Regressão;
● Em processos de metodologia ágil, com ciclos de desenvolvimento de curta
duração, pode se tornar impraticável executar testes de sistema abrangentes em
cada ciclo, sem o uso de testes automatizados.
Por que automatizar?
4. ● Ferramenta para execução de testes de automatizados (features);
● Executa código a partir de frases escritas em uma linguagem próxima à
natural (Gherkin, com tradução para vários idiomas);
● Fácil entendimento dos cenários de testes
● possibilidade de que cenários sejam escritos pelo próprio dono do produto;
● Simplicidade na reprodução manual de um cenário de teste;
● Automatização dos cenários de testes pode ser feita posteriormente;
● Facilidade no rastreamento de erros na execução dos testes
automatizados;
Cucumber
5. Funcionalidade: Teste do CRUD Gerir Cargo do Quem é Quem
Contexto: Cadastrar, Alterar, Buscar e Excluir
Dado que o usuario vini esteja logado na página Home do Quem é Quem
Quando o usuário focar o menu Cadastro
E for acionado o submenu Gerir Cargos do Quem é Quem
Cenário: Inserir Cargos - Verifica Existência Prévia
Quando o campo [Buscar] for preenchido com o valor ‘Programador${datahora atual}’
E o comando [Buscar] do tipo [Botão] for acionado
Então nenhum item deve estar retornado na pesquisa
Quando o comando [Criar Cargo] do tipo [Botão] for acionado
E o campo [Nome] for preenchido com o valor ‘Programador${datahora atual}’
E o comando [Salvar] for acionado
Então deve ser exibida a mensagem ‘Os dados foram salvos com sucesso.’
.feature
6. ● Glue code é o código fonte que possui as informações interpretadas e tratadas pelo
cucumber, que transforma os passos Gherkin em código executável.
● Em Java, o glue code é realizado através de anotações, com as 3 palavras-chave
básicas do Gherking: @Dado, @Quando e @Então.
● As anotações recebem como parâmetro uma expressão regular, e o Cucumber faz o
casamento do passo Gherkin com as expressões regulares encontradas no glue
code.
● Os grupos de captura da expressão regular são passados como parâmetros do
método, na ordem em que são encontrados na expressão.
Glue Code
8. @Quando ("^o usuário focar o menu (.+)$")
public void focarMenuCucumber(String menu) throws Throwable {
paginaBase.paginaGerais.focaMenu(driver, menu);
}
Feature e Glue code
Funcionalidade: Teste do CRUD Gerir Cargo do Quem é Quem
Contexto: Cadastrar, Alterar, Buscar e Excluir
Dado que o usuario vini esteja logado na página Home do Quem é Quem
Quando o usuário focar o menu Cadastro
E for acionado o submenu Gerir Cargos do Quem é Quem
Cenário: Inserir Cargos - Verifica Existência Prévia
Quando o campo [Buscar] for preenchido com o valor ‘Programador${datahora atual}’
E o comando [Buscar] do tipo [Botão] for acionado
Então nenhum item deve estar retornado na pesquisa
Quando o comando [Criar Cargo] do tipo [Botão] for acionado
E o campo [Nome] for preenchido com o valor ‘Programador${datahora atual}’
E o comando [Salvar] for acionado
Então deve ser exibida a mensagem ‘Os dados foram salvos com sucesso.’
9. Funcionalidade: Teste do CRUD Gerir Cargo do Quem é Quem
Contexto: Cadastrar, Alterar, Buscar e Excluir
Dado que o usuario vini esteja logado na página Home do Quem é Quem
Quando o usuário focar o menu Cadastro
E for acionado o submenu Gerir Cargos do Quem é Quem
Cenário: Inserir Cargos - Verifica Existência Prévia
Quando o campo [Buscar] for preenchido com o valor ‘Programador${datahora atual}’
E o comando [Buscar] do tipo [Botão] for acionado
Então nenhum item deve estar retornado na pesquisa
Quando o comando [Criar Cargo] do tipo [Botão] for acionado
E o campo [Nome] for preenchido com o valor ‘Programador${datahora atual}’
E o comando [Salvar] for acionado
Então deve ser exibida a mensagem ‘Os dados foram salvos com sucesso.’
Feature e Glue code
@Quando("^o campo [(.+)] for preenchido com o valor '(.+)'$")
public void preencherValorDoCampoCucumber(String rotulo, String valor) {
paginaBase.paginaPreencher.preencherValorDoCampo(driver,
rotulo, valor);
}
12. ● Estrutura organizada
● separação por tipos de interação
● uso de interfaces
● Facilidade na adição de novos padrões de sistema
● Facilidade na adição de novos passos
● Instalação e configuração simplificadas
● Manutenção simples, com indicação de elementos facilitada (sem
XPath)
● Relatório para visualização do resultado dos testes executados
● Abrangente; atende bem ao padrão atual (sistema SIGA)
Características Atuais do Framework
13. Estrutura organizada, com facilidade na adição de novos padrões de sistema
teste.paginas.reuso.passosCucumber teste.paginas.reuso.interfacesFramework
ACIONAR
PREENCHER
GERAIS
VERIFICAR
ACIONAR
PREENCHER
BUSCAR
GERAIS
VERIFICAR
teste.paginas.reuso.implementacoesFramework.ejb3
ACIONAR PREENCHERBUSCAR GERAIS VERIFICAR
implementaçõesEspecificasProjetoDeTeste.ejb3
Passo 1: Implementar novos métodos
para o novo padrão de sistema
LOGIN
14. Facilidade na adição de novos padrões de sistema
Passo 2: Estender a classe
Passo 3: Sobrescrever o método
Passo 4: Adicionar bind
15. Estrutura para adição de novos passos
Regras locais
Específicos para
cada projeto
Regras globais
(genéricos)
Utilizados em
diversos projetos
Framework
Projeto de teste
16. Facilidade na adição de novos passos globais
teste.paginas.reuso.passosCucumber teste.paginas.reuso.interfacesFramework
ACIONAR
PREENCHER
GERAIS
VERIFICAR
ACIONAR
PREENCHER
BUSCAR
GERAIS
VERIFICAR
teste.paginas.reuso.implementacoesFramework.ejb3
ACIONAR PREENCHERBUSCAR GERAIS VERIFICAR
NOVO PASSO GLOBAL
1. Criar novo passo cucumber
2. Declarar novo método
3. Implementar novo método
17. Comparação do processo de adição de novos passos
Antes
● Cada projeto de teste criado como uma
cópia do projeto do Framework.
● Definição de novos passos e funções de
forma independente e com transmissão
informal (cada desenvolvedor passando a
sua implementação para os que a
desejassem utilizar).
Depois
● Cada projeto de teste criado como um
projeto que importa o código do
Framework como uma dependência.
● Todo projeto utiliza os passos gerais do
Framework, utilizando passos específicos
para o sistema apenas quando necessário.
● Caso um passo criado seja geral o
suficiente e de uso comum em um grande
número de sistemas, ele é inserido no
Framework, para futuro reuso.
Configuração de novo projeto de testes
Definição de novos passos e métodos globais
18. ConfiguracaoSelenium
SharedDriver
RunFeature.launch
VerificaFeature.launch
PropriedadesLogin
PaginaLogin
Instalação e configuração simplificadas
Passo 1: Criar estrutura de diretórios
Passo 2: Estender classes
Passo 3: Informar dados de acesso à aplicação:
PropriedadesLogin<NomeProjeto>
PaginaLogin<NomeProjeto>
RunFeature.launch
VerificaFeature.launch
PropriedadesLogin
PaginaLogin
DATABASE
PÁGINAS
ConfiguracaoSelenium
SharedDriver
RunFeature.launch
VerificaFeature.launch
FRAMEWORK
REUSO
ConfiguracaoSelenium<NomeProjeto>
SharedDriver<NomeProjeto>
PROJETO DE TESTES
DATABASE
PÁGINAS
REUSO
WebDriverModule
CAMINHO = ”/<NomeProjeto>/home.seam”;
SENHA_PADRAO = ”♦♦♦♦♦♦”;
@Dado("^que o usuário (.+) esteja logado na página
Home do <SistemaTestado>$")
SERVIDOR=”http://<ServidorDeTeste>.ufmg.br”
Instancia ConfiguracaoSelenium<NomeProjeto>
Bind com SharedDriver<NomeProjeto>
19. Instalação e configuração simplificadas
Antes
● Configuradas como variáveis de ambiente
do workspace do eclipse.
● Para testar cada projeto de teste, era
necessário reconfigurar as variáveis do
ambiente ou utilizar workspaces
separados.
Depois
● Cada projeto de teste define tais
variáveis na classe
ConfiguracaoSelenium<NomeDoProjetoDe
Teste>.
● Dois projetos de teste podem conviver no
mesmo workspace sem necessidade de
reconfiguração.
Configuração das Variáveis SERVIDOR_APLICAÇÃO,
SERVIDOR_SELENIUM e BROWSER
21. ● Facilidade na digitação de features
● utilização de plugin no RAD
● Integração contínua
● Jenkins
Melhorias em desenvolvimento
22. ● Recursos
● Auxílio na digitação dos passos, com autocomplete de regras que
se enquadram, no momento da digitação
● Indicação de erro, em frente a passos que estão sem regras
conhecidas
● Outline View dos elementos que compõem a feature
● Ganhos esperados
● tornar a tarefa de especificação de testes mais agradável e
produtiva
Plugin
25. Integração contínua
● Prática de desenvolvimento de software onde os membros de uma
equipe integram seu trabalho frequentemente.
● Cada integração é verificada por um build automatizado (incluindo
os testes) para detectar erros de integração.
● Como o sistema é integrado continuamente, os erros são
detectados de forma rápida, não sendo acumulados e não gerando
um problema geral no sistema.
● É mais fácil encontrar erros em pequenas integrações do que em
uma integração grande.
26. Integração contínua
TIPO DE BUILD CARACTERÍSTICAS
Contínuo / Incremental
Executa quando o código é alterado no repositório, faz
uma compilação rápida e executa alguns testes unitários.
Diário / Noturno
Faz a compilação completa com todos os testes unitários
e testes adicionais, tais como testes funcionais
(Cucumber).
Release (nova versão)
Cria um pacote de instalação e, em seguida, executa e
testa todo o processo.