Upload
lyhanh
View
213
Download
0
Embed Size (px)
Citation preview
UNIVERSIDADE FEDERAL DE MATO GROSSO
COORDENAÇÃO DE ENSINO DE GRADUAÇÃO EM
SISTEMAS DE INFORMAÇÃO
RELATÓRIO DE ESTÁGIO SUPERVISIONADO
TESTES AUTOMATIZADOS DE UM SISTEMA WEB
USANDO PROTRACTOR EM AMBIENTE ÁGIL COM
SCRUM
PAULO VINÍCIUS DE OLIVEIRA TÁRCIO
CUIABÁ – MT
2016
UNIVERSIDADE FEDERAL DE MATO GROSSO
COORDENAÇÃO DE ENSINO DE GRADUAÇÃO EM
SISTEMAS DE INFORMAÇÃO
RELÁTORIO DE ESTÁGIO SUPERVISIONADO
TESTES AUTOMATIZADOS DE UM SISTEMA WEB
USANDO PROTRACTOR EM AMBIENTE ÁGIL COM
SCRUM
PAULO VINÍCIUS DE OLIVEIRA TÁRCIO
Relatório apresentado Instituto de
Computação da Universidade Federal de
Mato Grosso, para obtenção do título de
Bacharel em Sistemas de Informação.
CUIABÁ – MT
2016
UNIVERSIDADE FEDERAL DE MATO GROSSO
COORDENAÇÃO DE ENSINO DE GRADUAÇÃO EM
SISTEMAS DE INFORMAÇÃO
PAULO VINÍCIUS DE OLIVEIRA TÁRCIO
Relatório de Estágio Supervisionado apresentado à Coordenação do Curso de
Sistemas de Informação como uma das exigências para obtenção do título de
Bacharel em Sistemas de Informação da Universidade Federal de Mato Grosso
Aprovado por:
Prof.
Instituto de Computação
(Coordenador de Estágios)
Prof. Dr. ou MSc.
Instituto de Computação
(ORIENTADOR)
Prof. Dr. ou MSc. ou Esp.
(SUPERVISOR)
AGRADECIMENTOS
AGRADEÇO AO MEU ORIENTADOR, DANIEL VECCHIATO, QUE DISPONIBILIZOU
PARTE DO SEU TEMPO PARA ME ORIENTAR NO DESENVOLVIMENTO DESSE TRABALHO,
ME DANDO DICAS VALIOSAS. E AGRADEÇO AOS COLEGAS DE TRABALHO QUE, JUNTO A
SUAS EXPERIÊNCIAS, ME AUXILIARAM E CONTINUAM ME AUXILIANDO NA MINHA
CARREIRA PROFISSIONAL.
6
Sumário
LISTA DE FIGURAS .......................................................................................................................... 7
LISTA DE TABELAS .......................................................................................................................... 8
LISTA DE SIGLAS E ABREVIATURAS ......................................................................................... 9
RESUMO ............................................................................................................................................ 10
1. REVISÃO DE LITERATURA ................................................................................................ 13
1.1. TESTE DE SOFTWARE .................................................................................................... 13
1.1.1. TESTES ESTRUTURAIS ................................................................................................... 14
1.1.2. TESTES FUNCIONAIS ...................................................................................................... 14
1.1.3. CASOS DE TESTES............................................................................................................ 15
1.2. AUTOMAÇÃO DE TESTES .............................................................................................. 16
1.2.1. TÉCNICAS DE AUTOMAÇÃO DE TESTES .................................................................. 16
1.3. SISTEMA A SER TESTADO ............................................................................................. 17
1.4. MANIFESTO DE DESENVOLVIMENTO ÁGIL ........................................................... 19
1.4.1. FRAMEWORK SCRUM .................................................................................................... 20
2. MATERIAS, TÉCNICAS E MÉTODOS ............................................................................... 21
2.1. METODOLOGIA DE DESENVOLVIMENTO ............................................................... 21
2.2. FRAMEWORK PROTRACTOR ...................................................................................... 23
2.3. SELENIUM .......................................................................................................................... 24
2.3.1. PROCESSO DE COMUNICAÇÃO ................................................................................... 26
2.4. CONFIGURAÇÃO DO PROTRACTOR .......................................................................... 26
2.5. FRAMEWORK JASMINE ................................................................................................. 27
2.6. MICROSOFT TEAM FOUNDATION SERVER (TFS) .................................................. 28
3. RESULTADOS ......................................................................................................................... 29
3.1. PLANEJAMENTO DE TESTES ....................................................................................... 29
3.2. CONFIGURAÇÃO PARA INÍCIO DOS TESTES .......................................................... 30
3.3. FUNCIONALIDADES TESTADAS .................................................................................. 31
3.4. CRIAÇÃO DE CASOS DE TESTES ................................................................................. 35
4. DIFICULDADES ENCONTRADAS ...................................................................................... 39
5. CONCLUSÕES ......................................................................................................................... 41
6. REFERÊNCIAS BIBLIOGRÁFICAS .................................................................................... 42
APÊNDICES ....................................................................................................................................... 44
7
LISTA DE FIGURAS
FIGURA 1 - DEFEITO X ERRO X FALHA ................................................................................................. 13 FIGURA 2 - CASO DE USO DO SGPWEB ................................................................................................ 18 FIGURA 3 - MÉTODO DO DESENVOLVIMENTO (ADAPTADO DE QUICKSCRUM) ....................................... 22 FIGURA 4 – SINTAXE DE LOCALIZADORES( ADAPTADO DO SITE OFICIAL DO PROTRACTOR).................. 23 FIGURA 5 – AÇÕES DO PROTRACTOR (ADAPTADO DO SITE OFICIAL DO PROTRACTOR). ........................ 24 FIGURA 6 – INFRAESTRUTURA PROVIDA PELO SELENIUM E PROTRACTOR (PROTRACTOR, HOW IT WORKS)
.................................................................................................................................................... 25 FIGURA 7 – PROCESSO DE COMUNICAÇÃO ENTRE O BROWSER, TESTE E SELENIUM ((PROTRACTOR, HOW IT
WORKS) ....................................................................................................................................... 26 FIGURA 8 PROCESSO DE AUTOMAÇÃO UTILIZADO NO ESTÁGIO ............................................................. 30 FIGURA 9 - AUTOMAÇÃO DO LOGIN DO SISTEMA .................................................................................. 30 FIGURA 10 - TELA DE PESQUISA DE NORMAS ........................................................................................ 31 FIGURA 11 - APRESENTAÇÃO DA FUNCIONALIDADE DE CADASTRO DE NORMA ................................... 32 FIGURA 12 - PARTE DO TESTE DE VALIDAÇÃO DE CAMPO DA FUNCIONALIDADE CADASTRO DE NORMA35 FIGURA 13 - RESULTADO DO TESTE DE VERIFICAÇÃO DE CAMPOS OBRIGATÓRIOS ................................ 35 FIGURA 14 - PARTE DO TESTE DE VALIDAÇÃO DE VIGÊNCIA DE NORMA. .............................................. 36 FIGURA 15 - RESULTADO DOS TESTES DE VERIFICAÇÃO DE VIGÊNCIA. .................................................. 37 FIGURA 16 - AUTOMAÇÃO DE CADASTRO DE NORMA ........................................................................... 38 FIGURA 17 - RESULTADO DO TESTE DE CADASTRO DE NORMA. ............................................................. 39
8
LISTA DE TABELAS
TABELA 1 – TABELA DE STATUS DE VIGÊNCIA ...................................................................................... 36
9
LISTA DE SIGLAS E ABREVIATURAS
SGP Sistema de Gestão de Pessoas
IEEE Institute of Eletrecial and Eletronics Engineers
TFS Team Foundation Server
DOM Document Object Model
JSON JavaScript Objection Notation
BDD Behavior Driven Development
API Application Programming Interface
ISTQB International Software Testing Qualifications Board
BSTQB Brazilian software testing Qualification Board
10
RESUMO
Este documento apresenta, em detalhes, o trabalho desenvolvido durante o estágio
supervisionado no departamento de desenvolvimento do Tribunal de Justiça do Mato
Grosso como etapa para a conclusão do curso de Sistema de Informação da
Universidade Federal do Mato Grosso. O principal resultado do estágio é a
implementação de testes automatizados em um ambiente que segue uma metodologia
ágil de gestão e planejamentos de projetos de software. O ambiente ágil de
desenvolvimento foi guiado pelo framework Scrum. As tecnologias usadas para a
realização dos testes foram: o framework de automação de testes, Protractor; o
framework de desenvolvimento de testes, o Jasmine; e para o registro de falhas
encontradas no produto foi utilizado a ferramenta da Microsolf, o Team Foundation
Server. Pode-se concluir que os testes automatizados facilitam e agilizam o trabalho
de um testador, contudo, a implementação da automação de testes em um ambiente
requer muito cuidado e principalmente planejamento e análise para ser possibilitar a
geração de um produto de qualidade.
11
INTRODUÇÃO
Sistemas computacionais têm se tornado um dos pilares mais importante no
suporte de processos e projetos de instituições ou companhias. Elas - instituições e
companhias - tendem a necessitar cada vez mais de automatização de tarefas e para
isso os softwares suportes estão se tornando gradativamente mais complexos. As
chamadas fábricas de softwares, empresas que utilizam processos para criar
ferramentas que diminuem a presença do fator humano, estão pouco a pouco se
tornando bastante preocupadas na entrega de seus produtos com qualidade e a
execução de testes de software está fortemente relacionada com a qualidade final do
produto desenvolvido.
Embora importante, a atividade de testes pode se tornar muitas vezes
repetitiva e custosa, principalmente em projetos que estão em fase de
desenvolvimento, em que os testes necessários aumentam gradualmente com a vida
útil dos projetos.
O presente relatório tem como objetivo relatar as principais atividades
desenvolvidas em um estágio supervisionado dentro do ambiente de
desenvolvimento de softwares do tribunal de justiça de Mato Grosso, no qual junto a
um time de desenvolvimento composto por desenvolvedores, analista de sistema,
analista de qualidade, controlador de projetos, entre outros, foram implementados
testes automatizados em um projeto de desenvolvimento de software de gestão de
pessoas.
A necessidade da automação dos testes se deu por uma tentativa de
aumentar a agilidade de processos e cumprimentos de prazos, diminuindo e até
evitando erros humanos, entregando produtos com maior qualidade ao usuário final.
A organização desse documento está disposta da seguinte forma: a seção 1
apresenta a revisão de literatura, na qual serão abordados aspectos de fundamentação,
teórica e prática, básica, necessários para dar continuidade no entendimento desse
documento; A seção 2 apresenta detalhamento de atividades realizadas e tecnologias
usadas no processo do estágio; A seção 3 apresenta os resultados obtidos nesse
período de estágio supervisionado; A seção 4 apresenta as dificuldades e como elas
foram resolvidas pelo estudante; A seção de número 5 apresenta a conclusão do
12
trabalho e a última seção, de número 6, apresenta as referências bibliográficas que
serviram de suporte para a realização do documento.
13
1. REVISÃO DE LITERATURA
1.1. TESTE DE SOFTWARE
Sistemas de software tornam-se gradativamente parte do nosso dia-a-dia,
desde aplicações comerciais (ex: bancos) até produtos de consumo (ex: carros).
Softwares que não funcionam corretamente podem levar a muitos problemas,
incluindo financeiros, tempo e reputação das empresas. Podendo, inclusive, chegar a
influenciar na integridade das pessoas (BSTQB, 2011).
Teste de software envolve executar uma implementação de software com
dados de testes. Após isso, examina-se as saídas dos dados do software e seu
comportamento operacional para verificar se seu desempenho está conforme
necessário. (SOMMERVILLE, 2007).
Alguns conceitos básicos sobre os testes de software são bastante
relevantes, como, por exemplo, os diferentes conceitos de Defeitos, Erros e Falhas.
Erro, ou engano, são cometidos por seres humanos e gera um defeito (ou
bug, em inglês), no código do software, sistema ou documento. Se esse defeito de
código for executado, o sistema apresenta uma falha ao usuário. Defeitos geram
falhas, mas nem todos os defeitos causam falhas. (Certified Tester Foundation Level
Syllabus, versão 2011, ISTQB).
Figura 1 - Defeito x Erro x Falha
Erro
Defeito
Falha
14
Bastos (BASTOS et al., 2012) explica que os testes de software podem ser
classificados em testes funcionais (também chamados de caixa preta) ou estruturais
(também chamados de caixa branca).
1.1.1. TESTES ESTRUTURAIS
Testes estruturais garantem que os softwares e os programas sejam
estruturalmente sólidos e que funcionem no contexto técnico instalado. Esse tipo de
teste busca determinar se a tecnologia usada funciona de forma correta. Esses testes
não garantem a funcionalidade correta do sistema, mas sim que o sistema esteja
estruturalmente robusto (BASTOS et al., 2012).
Alguns tipos de testes estruturais são: Testes de estresse, teste de execução,
testes unitários, entre outros.
Testes estruturais tem como objetivo avaliar o comportamento do software
sob condições críticas como, por exemplo, pouca memória, objetivando simular
ambientes de produção que há restrições (BASTOS et al., 2012).
Testes de execução são aqueles que verificam o tempo resposta do sistema,
se esse não está demorando para retornar um resultado ou de processar operações
(BASTOS et al., 2012).
Testes unitários são os testes realizados na parte mais baixa da escala de
testes, normalmente realizados pelos próprios desenvolvedores, são aplicados em
pequenos componentes de código criado, visando garantir os componentes atendam
características da funcionalidade (BASTOS et al., 2012).
1.1.2. TESTES FUNCIONAIS
Testes funcionais garantem que os requisitos do usuário, ou seja, requisitos
do sistema perante a sua funcionalidade, estejam corretamente codificado e se o
sistema está se comportando de forma correta como o usuário espera (BASTOS et
al., 2012). Alguns exemplos desse tipo de testes são: Teste de sistema, teste de
regressão e teste fumaça.
15
Os testes de sistema (também chamados de ponta-a-ponta) verificam se o
software está realizando o que foi descrito nos requisitos. Esse tipo de teste costuma
envolver mais de um programa ou um conjunto lógico de casos de testes, que muitas
vezes estão ligados a um determinado caso de uso (BASTOS et al., 2012)
Os testes de regressão voltam a testar segmentos já testados após a mudança
em outra parte do software. Ou seja, testar novamente os mesmos testes realizados
anteriormente para garantir que os resultados não tenham sido afetados pelas
mudanças realizadas não só na parte alterada, como também em outras partes do
sistema (BASTOS et al., 2012).
Teste fumaça ou smoke test é: Um subconjunto de todos os casos de testes
definido ou planejados que cobrem as principais funcionalidades de um componente
ou sistema, preocupando com detalhes mais superficiais do que superficiais (ISTQB,
Glossário Padrão de Termos Utilizados em Testes de softwares, 2014).
1.1.3. CASOS DE TESTES
Um caso de teste pode ser entendido como um conjunto de valores de
entrada, precondições de execução, resultados esperados e condições posteriores a
execução, desenvolvida para um objetivo particular ou condição de teste. (ISTQB,
versão 3.1, 2016). A definição de casos de testes é importante para que possa ser
determinado o que será testado, objetivando um maior número de cenários e
variações a serem testadas.
Um bom caso de testes deve conter basicamente (BASTOS et al., 2012).
Pré-condições;
Pós-condições;
Critério de Aceitação;
Identificação dos casos de testes (o que testar);
Detalhamento da massa de entrada e de saída;
Critérios especiais, quando houver;
Especificação especiais das configurações do ambiente de teste;
Definição se o teste será manual ou automático;
16
Para (BASTOS et al., 2012) um caso de teste deve seguir algumas
características para que seja válido, ou seja, para que garanta que o software esteja
fazendo a coisa certa de acordo com os requisitos. Essas características são: O caso
de teste tem que ser efetivo, ou seja, testar o que se planejou testar; tem que ser
econômico, não possuir passos desnecessários; tem que ser reutilizável, que possa ser
repetido; rastreável, que possa identificar o requisito a ser testado e tem que ser
autoexplicativo, que possa ser testado por qualquer outra pessoa.
1.2. AUTOMAÇÃO DE TESTES
Automação de testes significa fazer o uso de software que controlem a
execução dos casos de teste. O uso desta prática pode reduzir significativamente o
esforço necessário para os testes em um projeto de software, ou seja, executar
maiores quantidades de testes em tempo reduzido testes manuais que levariam horas
para serem totalmente executados poderiam levar minutos caso fossem
automatizados. (TUSCHLING, 2008).
1.2.1. TÉCNICAS DE AUTOMAÇÃO DE TESTES
Existe algumas técnicas de automação de testes, a mais conhecidas delas são
a record & playback e a programação de script. A técnica record & playback
consiste em utilizar uma ferramenta de automação de testes e gravar as ações
executadas por um usuário sobre a interface de uma aplicação. Após a gravação, o
teste é transformado em script de testes que podem ser executados várias vezes. Toda
vez que o script já gravado é executado, as ações gravadas são realizadas novamente.
A vantagem da técnica de record & playback é que ela é bastante simples e prática,
sendo uma boa abordagem para testes executados poucas vezes. Porém há várias
desvantagens como: custo e dificuldade de manutenção, baixa taxa de reutilização,
curto tempo de vida e alta sensibilidade (FANTINATO, et al, 2005).
A técnica de programação de script de teste é uma extensão da técnica record
& playback. Por meio da programação, os scripts de testes são gravados e alterados
17
para que desempenhem um comportamento diferente dos scripts originais da sua
execução (FANTINATO, et al, 2005).
Segundo (FANTINATO, et al, 2005) “a programação de script de teste é uma
técnica de automação que permite, em comparação com a record & playback, maior
taxa de reutilização, maior tempo de vida, melhor manutenção e maior robustez dos
scripts de teste”.
1.3. SISTEMA A SER TESTADO
Nesse estágio, o sistema a ser testado encontra-se em fase de
desenvolvimento e se chamará SGPWeb - Sistema de Gestão de Pessoas Web. O seu
primeiro marco de entrega está para o final do ano de 2016.
O SGPWeb é um projeto de substituição de um sistema legado, o SGP -
Sistema de Gestão de Pessoas, que tem como objetivo controlar as informações de
recursos humanos do Poder Judiciário de Mato Grosso, assim como: férias, ponto
eletrônico, nomeação, exoneração, desligamento, cadastro de feriados, relatórios,
entre outros.
A primeira versão do sistema SGP foi implementada em 2004 e começou
com uma plataforma web, porém, por causa mudanças constantes para atender as
demandas dos usuários, o sistema passou gradativamente para a plataforma atual
(Windows Forms). Após mais de dez anos de uso do SGP, o mesmo retornará a
plataforma web.
A permuta de um sistema legado para um novo sistema demanda um
esforço muito grande, tanto financeiro, quanto temporal. E a mudança do SGP para o
SGPWEB não podia ser diferente, por isso, em seu primeiro planejamento, o
SGPWEB não possuirá todas as funcionalidades do Sistema de Gestão de Pessoas
(Windows Forms).
O SGPWEB contará nessa primeira fase de implementação apenas as
funcionalidades referentes a cadastro de pessoas, convites de candidatos,
movimentação de pessoas, nomeação, exoneração, cadastro de localidade, normas e
cargos. Na Figura 2, foi desenvolvido um diagrama de casos de uso para melhor
visualização do que constará no novo sistema SGP.
18
Figura 2 - Caso de Uso do SGPWEB
Conforme ilustrado na Figura 2, existem 4 pacotes: Localidade, Pessoa,
Convite e Movimentação. O pacote Localidade representa os cadastros de local de
trabalho dos servidores do poder judiciário do tribunal de justiça. Para se cadastrar
um local é necessário primeiro o cadastro de uma norma, que são documentos (leis,
súmulas, portarias...) que regem regras dentro do poder judiciário. Ainda nesse
pacote são regidos a criação e vinculação de cargos, seus requisitos e as quantidades
disponibilizada para cada local de trabalho. O pacote de Pessoa, representa um
cadastro de uma pessoa que fará ou já faz parte integrante da organização. Esse
cadastro poderá ser preenchido manualmente, contudo, esse não é o objetivo
principal dessa funcionalidade. Essa funcionalidade será automaticamente
preenchida após a nomeação do candidato após um convite. O pacote Convite,
representa a configuração dos envios de e-mail e requisitos para os candidatos à vaga
de cargos. Esse pacote compreende também a aprovação desse convite, por meio de
um checklist; o último pacote, movimentação, é responsável pelas funcionalidades de
nomeação, exoneração ou demissão de pessoas que integram o serviço do poder
judiciário.
Existe uma grande necessidade de desenvolver testes automatizados para o
SGPWEB, pois o sistema está em fase de desenvolvimento e é um projeto
completamente novo, sendo assim, são necessários bastantes testes para garantir a
qualidade do produto, principalmente os testes de regressão. Outro motivo bastante
19
importante é iniciar a cultura do desenvolvimento de automação dos testes no
departamento de desenvolvimento, que ainda não é adepto a prática, sendo assim, o
projeto servirá como um caso pioneiro para a introdução da técnica em um
departamento que utiliza os princípios do manifesto de desenvolvimento ágil como
pilar da rotina de trabalho.
1.4. MANIFESTO DE DESENVOLVIMENTO ÁGIL
O Agile Alliance, organização sem fim lucrativo, dita que o desenvolvimento
ágil de software se baseia nos métodos e princípios do manifesto ágil. Esse manifesto
surgiu em 2001, e são um grupo de pessoas que estão descobrindo maneiras
melhores de desenvolver softwares, valorizando os seguintes pontos (Manifest for
Agile Software Development. Agile Alliance, 2001):
Indivíduos e interação entre eles ao invés de processos e ferramentas;
Software em funcionamento mais que documentação;
Colaboração com cliente mais que a negociação de contratos;
Responder as mudanças mais que seguir um plano.
O manifesto ágil possui 12 princípios e eles são listado abaixo (12 Principles
Behind the Agile Manifesto, Agile Alliance, 2015):
1. Maior prioridade em satisfazer o cliente, entregando o software de forma
continua e adiantada.
2. Aceitar mudanças de requisitos, mesmo no fim do desenvolvimento.
Processos ágeis se adequam a mudança.
3. Entregar software funcionando com frequência, na escala de semanas até
meses, com preferência aos períodos mais curtos;
4. Pessoas relacionadas à negócios e desenvolvedores devem trabalhar em
conjunto e diariamente;
5. Construir projetos ao redor de indivíduos motivados. Dando a eles o ambiente
e suporte necessário, e confiar que farão seu trabalho;
20
6. O método mais eficiente e eficaz de transmitir informações é por conversação
cara-a-cara;
7. Software funcional é a medida primária de progresso;
8. Processos ágeis promovem um ambiente sustentável. Os patrocinadores,
desenvolvedores e usuários, devem ser capazes de manter indefinidamente
passos constantes;
9. Contínua atenção à excelência técnica e bom design;
10. Simplicidade: a arte de maximizar a quantidade de trabalho que não precisou
ser feito;
11. Times auto organizáveis possuem melhores arquiteturas, requisitos e design;
12. Em intervalos regulares, o time reflete em como ficar mais efetivo, então, se
ajustam e otimizam seu comportamento de acordo.
1.4.1. FRAMEWORK SCRUM
Scrum é um framework dentro do qual pessoas podem tratar e resolver
problemas complexos e adaptativos, enquanto produtiva e criativamente entregam
produtos com o mais alto valor possível (Guia do Scrum, Scrum.Org, 2013). O
Scrum.org completa dizendo que o framework consiste nos times do Scrum
associadas a papéis, eventos, artefatos e regras. Cada componente dentro do
framework serve a um propósito especifico e é essencial para o uso e sucesso do
Scrum (Guia do Scrum, Scrum.org, 2013).
O time de trabalho Scrum é composto pelo Product Owner, o time de
desenvolvimento e o Scrum Master, cada entidade dessas com suas devidas
atribuições.
O Scrum.org apresenta a Sprint, como o núcleo do framework, definindo
como “é um time-boxed de um mês ou menos, durante o qual um “pronto”, versão
incremental potencialmente utilizável do produto, é criado. ” (Guia do Scrum,
Scrum.org, 2013) As Sprints são compostas por uma reunião de planejamento da
Sprint, reuniões diárias, o trabalho de desenvolvimento, uma revisão da Sprint e a
retrospectiva da Sprint”.
21
2. MATERIAS, TÉCNICAS E MÉTODOS
Durante o período de estágio, as atividades foram realizadas com o auxílio
de várias tecnologias e utilizando alguns métodos. Essa seção mostrará
detalhadamente como se deu o processo de realização das atividades, suas
tecnologias e métodos.
2.1. METODOLOGIA DE DESENVOLVIMENTO
O departamento de desenvolvimento do Tribunal de Justiça conta em sua
maioria com profissionais terceirizados que utilizam de métodos ágeis para entrega
de seus produtos. O projeto SGPWeb, em seu estágio de desenvolvimento, utilizou
de conceitos da metodologia Scrum para o cronograma do projeto.
Nesse estágio, as Sprints foram determinadas em um tempo de uma
semana, ou seja, cinco dias úteis, iniciando todas as segundas feiras e terminando as
sextas.
É dentro da Sprint que o time de desenvolvimento realiza suas tarefas,
como análise, prototipação, desenvolvimento, testes, deploys e reuniões, resultando
em uma parte do produto, chamado de produto incremental. As reuniões diárias
desse projeto foram estimadas em 15 minutos, já as de planejamento e retrospectivas
foram estimadas 3 horas e 30 minutos, respectivamente, toda as segundas-feiras.
A Figura 3 exemplifica como método é usado:
22
Figura 3 - Método do desenvolvimento (Adaptado de QuickScrum)
O time de desenvolvimento foi composto por um controlador de projeto,
responsável por gerenciar o time e o projeto; um analista de sistemas, responsável
por analisar, documentar e criar protótipos da aplicação; cinco desenvolvedores,
responsáveis pela codificação da aplicação; dois arquitetos de software, responsável
por decisões de tecnologias e auxílios destas ; um estagiário, que auxilia no
desenvolvimento e um técnico de qualidade, o autor desse documento, responsável
por testes, automatização de testes, documentos de apoios e treinamentos.
Inicialmente foi tentado realizar os testes automatizados junto com o
desenvolvimento, contudo, essa ação foi logo modificada, pois o projeto está em fase
de desenvolvimento e os requisitos ou layout eram frequentemente modificados.
Sendo assim, a automação passou a ser realizada sempre que uma funcionalidade
atingisse o nível de maturidade para tal.
Os testes manuais eram realizados em todas as sprints com o objetivo de
encontrar defeitos que poderiam passar despercebidos pelos testes automatizados.
23
2.2. FRAMEWORK PROTRACTOR
Segundo o site oficial da tecnologia, protractortest.org, Protractor é um
framework de teste ponta-a-ponta para aplicações desenvolvidas em AngularJS.
Protractor executa testes em cima de aplicações que estão sendo executadas em
navegadores reais, interagindo como se fosse um usuário final.
A parte principal de um teste ponta-a-ponta de páginas webs é procurar um
elemento DOM, interagir com eles, e obter informação sobre o atual estado da
aplicação.
Protractor exporta uma função chamada “element”, que recebe uma
localização e retorna um ElementFinder, que por sua vez retorna um único elemento.
Para múltiplos elementos pode-se usar a função “element.all”. (Protractor, Using
Locators).
O ElementFinder possui algumas ações, como “click()”, “getText()” e
“sendKeys”. Esses são alguns jeitos de interagir com elementos e obter informações
deles.
As Figuras 4 e 5, ilustradas abaixo, mostram alguns exemplos.
Figura 4 – Sintaxe de localizadores( Adaptado do site oficial do Protractor)
24
Figura 5 – Ações do Protractor (Adaptado do site oficial do Protractor).
Protractor é um programa Node.Js. Para executar Protractor, é necessário
primeiro ter o Node.Js instalado na máquina.
NodeJS, segundo o site nodebr.com, é uma plataforma construída sobre o
motor JavaScript dos navegadores para facilmente construir aplicações de redes
rápidas e escaláveis. Node.Js usa um modelo de I/O direcionada a evento que não
bloqueante que o torna leve e eficiente, ideal par aplicações em tempo real com troca
intensa de dados através de dispositivos distribuídos.
2.3. SELENIUM
Selenium é um conjunto de diferentes ferramentas com diferentes objetivos
que suportam teste automatizados de aplicações web. Selenium pode ser executado
em vários navegadores e sistema operacionais, e também pode ser controlado por
várias linguagens de programação e por vários frameworks. Esta ferramenta tem
suporte para as maiores empresas de navegadores de internet que já estão
trabalhando para deixar que Selenium seja uma parte nativa do próprio navegador
(Selenium, 2016).
Protractor trabalha junto com o Selenium para prover uma infraestrutura de
teste que pode simular a ação dos usuários (Figura 6). (Protractor, How it Works).
Para isso:
1. Protractor empacota WebDriverJS, que são ligações JavaScript
para o API do SeleniumWebDriver;
25
2. Comandos Webdriver são assíncronos, ou seja, eles são
programados no fluxo de controle e retornam um resultado
prometido, e não valores primitivos;
3. Os scripts de testes são enviados para o Selenium Server, que se
comunica com o driver dos navegadores.
Figura 6 – Infraestrutura provida pelo Selenium e Protractor (Protractor, How it Works)
26
2.3.1. PROCESSO DE COMUNICAÇÃO
Um teste utilizando Selenium Webdriver envolve três processos - o script
de teste, o servidor e o navegador. A comunicação entre esses três processos é
mostrada na Figura 7, logo abaixo:
Figura 7 – Processo de comunicação entre o browser, teste e Selenium ((Protractor, How it
Works)
O Selenium Server se responsabiliza para interpretar os comandos dos testes
e transmitir para um ou mais navegadores. A comunicação entre o servidor e os
navegadores utiliza o WebDriver Wire Protocol, um protocolo JSON. O Comando é
interpretado pelo driver do browser (Protactor, How it Works, 2016).
2.4. CONFIGURAÇÃO DO PROTRACTOR
Protractor necessita de dois arquivos para poder ser executado, o arquivo
de configuração, que diz ao Protractor como configurar o servidor do Selenium, qual
27
teste executar, qual browser executar e quais frameworks utilizar; e o arquivo de
especificação de testes, ou seja, aonde os testes serão escritos.
2.5. FRAMEWORK JASMINE
Jasmine é um framework independente, e de sintaxe de fácil compreensão
para o desenvolvimento de testes em código JavaScript. Jasmine não precisa de
DOM e encontra-se atualmente, na data desse relatório, na versão 2.4.1(Jasmine,
Introduction, 2016).
Jasmine possui uma sintaxe simples que conta com os seguintes itens:
Describe:
Início do suíte de testes que possui dois parâmetros, uma string
e uma função. A string representa o nome ou título para um suíte de
teste; a função é um bloco de código que implementa o suíte.
(Jasmine, Introduction,2016).
Its:
São blocos de funções, eles podem conter qualquer código
executável que seja necessário para programar testes. Regras do
JavaScript podem ser aplicadas aqui (Jasmine, Introduction, 2016).
Expectation:
Expectativas são criadas com a função “expect” que recebe um
valor. É encadeado a função “matcher”, que recebe o retorno de um
valor (Jasmine, Introduction, 2016).
Matcher:
Cada “matcher” programa uma comparação booleana entre o
atual valor e um valor esperado. Isso é responsável de dizer ao
Jasmine se a expectativa é falsa ou verdade (Jasmine, Introduction,
2016).
28
2.6. MICROSOFT TEAM FOUNDATION SERVER
(TFS)
O Team Foundation Server oferece um conjunto de ferramentas que
funcionam com qualquer IDE proporcionando a equipe uma forma de trabalhar
efetiva em projetos de todos os tamanhos ou formatos.
O TFS proporciona ferramentas como lista de pendências, kanban, e toda
uma estrutura para time que utilizam o Scrum como metodologia. (O que é o Team
Foundation Server, Microsoft, 2016.)
29
3. RESULTADOS
Nessa seção serão apresentados os resultados no período de estágio o qual o
aluno foi submetido. Em um primeiro momento, houve a necessidade de estudos
sobre os conceitos básicos de testes de software e suas especializações. Feito isso,
como o projeto já se encontrava em desenvolvimento, foi necessário também os
estudos sobre o ambiente ágil, seus artefatos e métodos e a ferramenta Team
Foudation Server. Esses conhecimentos foram necessários para que o aluno, em suas
atribuições de técnico de qualidade, pudesse manusear e reportar os defeitos
encontrados de forma manual no sistema a ser testado.
Feito esse estudo, houve a necessidade de compreender o funcionamento
das ferramentas para dar continuidade ao processo de trabalho, estudando então
Protactor, Jasmine e a linguagem de programação, JavaScript.
As subseções mostrarão como as seções após a fase de estudo foram
desenvolvidas.
3.1. PLANEJAMENTO DE TESTES
O primeiro passo para a implantação da automação dos testes foi a
elaboração de um processo que fosse viável para o ambiente de trabalho. Esse
processo inicia-se com o estudo, junto ao time de desenvolvimento, do cenário que
eram descritos pelo analista do sistema em forma de User Storys. Em um segundo
passo, se deu a especificação das tarefas de testes, descrevendo “o que” e “como” e
por quê?” será testado tal cenário. O terceiro passo contempla a execução manual dos
testes e o último passo, após verificar que a funcionalidade estava testável, a
automação. O processo pode ser visualizado na Figura 8, logo abaixo:
30
Figura 8 Processo de automação utilizado no estágio
3.2. CONFIGURAÇÃO PARA INÍCIO DOS TESTES
A configuração do Protactor é simples, sendo necessário apenas a
instalação do NodeJs e do Protractor que já possui o Jasmine como framework
padrão de escrita de código.
A automação do login foi realizada no arquivo de configuração em uma
função chamada “onPrepare”, que realiza tarefas antes mesmo do início dos testes.
Na figura abaixo é demonstrado a automação do login.
Figura 9 - Automação do Login do sistema
O código completo usado para a configuração do Protractor usado está
disponibilizado nos anexos desse relatório juntos com os demais códigos de testes.
Todos os testes foram realizados em um ambiente de teste com as seguintes
configurações: Sistema Operacional cliente Windows 10 Pro, 64 bits, Browser
Google Chrome, RAM 16GB, IntelCore i5-4460.
Estudo de Cenário
Descrição de Tarefa
Testes Manuais
Automação
31
3.3. FUNCIONALIDADES TESTADAS
Foram desenvolvidos testes automatizados para as seguintes
funcionalidades: Gerenciamento de norma, cargo e de local, cada uma com cadastro,
edição e exclusão.
Para demonstrar a criação dos testes, foi selecionado uma funcionalidade
simples, porém de grande valor para o sistema: O gerenciamento de norma. O
gerenciamento de norma é o primeiro passo para o pacote de Localização do sistema.
Essa funcionalidade é de bastante importância, pois as outras funcionalidades do
sistema estão vinculadas a alguma Norma. As Figuras 10 e 11, logo abaixo,
apresentam a tela de cadastro de Norma:
Figura 10 - Tela de Pesquisa de Normas
32
Figura 11 - Apresentação da Funcionalidade de Cadastro de Norma
Objetivando demonstrar o comportamento do sistema na funcionalidade de
cadastro de norma, a especificação desse caso de uso – Cadastrar Norma – pode ser
verificada abaixo:
Atores
Usuário do RH
Pré-Condições
O usuário deve estar autenticado no sistema.
Pós-Condições
Ter os registros alterados ou alterar os status de ativos para inativos no banco
de dados.
Fluxo Principal
Passo Descrição
1. O fluxo principal inicia-se quando o usuário realiza login no sistema e
clica na opção Principal - >Norma
2. O sistema apresenta uma tela de consulta de normas aonde apenas as
normas ativas são apresentadas.
3. O usuário possui as seguintes opções:
Cadastro de Nova Norma
Editar Norma
Desativação de Norma
Pesquisa Especifica de Norma
Pesquisa Avançada de Norma
Fluxo Alternativos
33
(A 01) Alterar Registro de Norma
Passo Descrição
1. Ao clicar em “Editar norma” encontramos os campos já preenchidos e
podendo ser alterados:
Tag (não obrigatório)
Norma (obrigatório)
Ano (obrigatório)
Data de Publicação (obrigatório)
Início Vigência (obrigatório)
Fim Vigência (não obrigatório)
Descrição/Ementa (obrigatório)
Referência (obrigatório)
2. Fim do Fluxo Alternativo A 01
(A 02) Desativar registro de Norma
Passo Descrição
1 Ao clicar na última coluna da listagem de registros, o sistema deve
apresentar o botão de desativação de norma.
2. Caso o botão seja selecionado, o sistema deve abrir a tela de motivo para
exclusão de dados.
3. Ao preencher o motivo e clicar em sim, o sistema deve alterar o status da
norma para “inativo” e retirar da lista de normas ativas.
4. Ao preencher e clicar em não, o sistema não modifica o status da norma e
retorna a tela de pesquisa.
(A 03) Pesquisa Especifica de Norma
Passo Descrição
1 Ao digitar qualquer item que esteja na listagem de normas ativas, ou seja,
Tipo de Norma, Número, Ano, Descrição, Status, Data de Publicação ou
Situação; o sistema deve apresentar os registros referentes à pesquisa
feita.
2 Caso não encontre resultado, o sistema deve apresentar a lista de
registros com um único registro indicando que não houve resultado
encontrado.
(A 04) Pesquisa Avançada de Norma
Passo Descrição
1 Ao clicar em “Mais Opções” o sistema habilita a pesquisa avançada para
o usuário com os seguintes campos: Norma, Descrição, Data de
Publicação, Inicio vigência, Fim Vigência, Status, Tags.
2 Ao preencher um ou mais campos da pesquisa, o sistema deve apresentar
os resultados de acordo com as junções de filtros.
3 Caso não encontre resultado, o sistema deve apresentar a lista de
registros com um único registro indicando que não houve resultado
encontrado.
Fluxos de Exceções
34
(E 01) Norma já cadastrada
Passo Descrição
1. Caso o usuário tente adicionar uma Norma com o mesmo número,
mesmo ano e mesma vigência, o sistema deve apresentar a mensagem de
validação de normas iguais.
(E 02) Campos obrigatórios não preenchidos.
Passo Descrição
1. Todos os campos da tela são obrigatórios. Caso algum campo não seja
preenchido, o sistema deve exibir a mensagem de validação de
obrigatoriedade de campo.
35
3.4. CRIAÇÃO DE CASOS DE TESTES
O primeiro conjunto de testes consta com os casos de testes referentes ao
preenchimento obrigatório dos campos. O teste se baseia em adicionar valores de
forma sequencial aos campos da tela de cadastro de norma, e clicar no botão de
“salvar e fechar”. A cada inserção de dado e click botão salvar, o teste verificava se a
mensagem de validação dos outros campos não preenchidos está sendo apresentada.
Quase todos os campos da tela de Cadastro de Norma são obrigatórios,
salvo os campos “tag” e “Fim vigência”. Parte do código e o resultado do teste
automatizado podem ser verificados abaixo:
Figura 12 - Parte do teste de validação de campo da funcionalidade Cadastro de Norma
Figura 13 - Resultado do teste de verificação de campos obrigatórios
O segundo suíte consta com os casos de testes de verificação do status da
vigência de acordo com a data informada nos campos “Inicio Vigência” e “Fim
36
Vigência” preenchidos no cadastro de norma. A tabela abaixo demonstra os valores
possíveis para vigência de normas.
Datas Vigência
Ao abrir a tela Sem vigência
Fim vigência > Data
Atual
Vigente
Início Vigência > Fim
Vigência
Vigência invalida
Início e Fim Vigência <
Data Atual
Vigente
Fim Vigência = nulo Vigente
Fim Vigência = Data
Atual
Vigente
Fim Vigência < Data
Atual
Revogada
Tabela 1 – Tabela de status de Vigência
Parte da automação do teste e o resultado estão apresentados abaixo:
Figura 14 - Parte do teste de validação de vigência de Norma.
37
Figura 15 - Resultado dos testes de verificação de vigência.
O último suíte de teste consta com os casos de testes referentes ao cadastro de
norma ativa, verificando, se após o cadastro, o sistema apresenta um registro a mais
na lista de normas ativas. Para isso, foi automatizada a contagem de registros ao abrir
a tela de pesquisa de norma e a paginação, a inserção de dados do cadastro de norma
e contagem após o click de no botão de “salvar e fechar”. O fator de aceitação é que
o sistema não deve duplicar registros e ao fazer a segunda contagem, apenas um
registro a mais deve ser identificado. Abaixo é possível visualizar parte do código
que está sendo automatizado o cadastro de norma e o resultado do teste.
38
Figura 16 - Automação de cadastro de Norma
Nessa parte do código, após a contagem dos registros em uma lista, foi
clicado no botão “Novo” que apresenta a tela de cadastro de norma (Figura 11), após
esperar um pouco para que todos os elementos sejam apresentados, o teste realiza a
inserção de dez tags na norma com um intervalo de um segundo entre elas pois
Protractor insere os dados muitos rápidos e algumas vezes acaba “comendo” dados
que deveriam ser inseridos. Posteriormente a inserção de tags, os elementos foram
selecionados pelos seus ids, inseridos no front-end. Para a inserção de dados de
dropdown list, número, ou data, usou-se de funções que gerassem valores
aleatoriamente para que nenhum teste ficasse igual ao outro. Perceba que os valores
do campo de “fim vigência” não foi inserido pois não é um campo obrigatório e o
teste de vigência de norma foi realizado em outro grupo de testes.
Após a inserção de datas e dropdown list, a automação se deu nos campos
textuais da funcionalidade, seguido do botão salvar, finalizando a parte de cadastro
39
de norma mostrado na figura. Como resultado do teste, o sistema então faz a
contagem novamente de registros e verifica se só um único registro foi adicional a
lista de resultados.
Figura 17 - Resultado do teste de cadastro de norma.
Após os resultados dos testes, caso alguma falha fosse apresentada, o
defeito era cadastrado em forma de artefato de Bug na ferramenta Team Foudation
Server, descrevendo os passos para a reprodução, perfil de acesso e outras
informações importantes; também era realizada a classificação perante prioridade e
gravidade do artefato. Na reunião de planejamento de Sprint, esse artefato bug era
discutido com o time de desenvolvimento, que tomava a decisão de quando tal
inconsciência iria ser corrigida.
4. DIFICULDADES ENCONTRADAS
Durante o período de estágio, o autor desse documento se deparou com
várias dificuldades. A primeira dela foi o desconhecimento prévio das tecnologias
40
usadas para a realização do trabalho. Necessitando então de tempo para estudo
prévio.
O Protractor, tecnologia usada para automatizar os testes, é uma tecnologia
relativamente nova no mercado (março de 2014) e que possui pouca documentação e
alguns bugs em suas versões. A documentação, em sua grande maioria, é encontrada
apenas no idioma americano, o que não impediu os estudos do estagiário, porém
demandou uma maior quantidade de tempo e concentração. A soma desses fatores
concretiza a segunda dificuldade.
A terceira dificuldade encontrada foi em relação às constantes mudanças do
projeto, característica comum em projetos em desenvolvimento. Quase sempre que
havia mudança de escopo ou de layout, os testes automatizados apresentavam
alguma irregularidade e precisavam passar por manutenção.
A quarta dificuldade a ser citada é o não conhecimento da linguagem de
teste, JavaScript, que não foi lecionada durante o período escolar do estagiário. Essa
dificuldade foi sanada com estudos da tecnologia, uso de redes sociais de
programação e auxilio dos desenvolvedores, colegas de trabalho.
Como dificuldade pode-se citar também que o projeto estava passando por
uma experiência de tecnologia nova para os desenvolvedores, o Angular 2. Os
desenvolvedores também precisaram de tempo para estudo de tecnologia e muitas
vezes, no meio do projeto, era necessário refatorar alguma funcionalidade,
consequentemente a dificuldade de testes automatizados, pois algumas
funcionalidades demoraram a ser finalizadas, estourando o planejamento geral do
projeto, e também a manutenção dos testes que eram realizadas constantemente e que
muitas vezes foi preferível a execução de testes manuais.
41
5. CONCLUSÕES
A atividade de teste torna-se cada vez mais bem vista no mercado de
software, isso porque as empresas estão preocupadas na entrega não só da
funcionalidade do produto, mas também na qualidade do produto.
Assim como um projeto de desenvolvimento, a atividade de teste deve ser
tratada como um projeto, sendo necessário planejamento, análise e execução
(BASTOS et al, 2012), deixando claro que é uma ação que demanda tempo e mão de
obra.
A automação de testes é uma técnica que visa agilizar e deixar menos
onerosa os testes de software. Para a realização dessa técnica é necessário bastantes
estudos e dedicação.
Nesse estágio, a grande falha do estagiário foi a tentar automatizar tudo,
esquecendo-se da fase de planejamento. Essa falha não impediu a realização do
trabalho, contudo dificultou a realização das atividades que já passavam por
bastantes desafios no caminho.
Como trabalho futuros, o aluno se dedicará a prestar mais atenção no
planejamento das atividades para amadurecer o processo já implantado e estenderá os
testes automatizados as outras funcionalidades do sistema, sabendo agora que nem
tudo deve ser automatizado. Dedicará também aos estudos as boas práticas de escrita
de testes como, por exemplo, o padrão de projeto Page Object, e ao processo da
implementação dos testes nas builds de versões do sistema.
42
6. REFERÊNCIAS BIBLIOGRÁFICAS
Agile Alliance, 12 Principles Behind the Agile Manifesto, disponível em
https://www.agilealliance.org/agile101/12-principles-behind-the-agile-manifesto
(acessado em 05/09/2016)
Agile Alliance, Manifesto for Agile Software Development, disponível em
https://www.agilealliance.org/agile101/the-agile-manifesto/ acessado em
(05/09/2016)
BASTOS, Aderson; RIOS, Emerson; CRISTALLI, Ricardo, MORREIRA,
Trayahú; 2012. Base de conhecimento em teste de software. 3. ed. São Paulo :
Martins
Certified Tester Foundation Level Syllabus, BSTQB, disponível em
http://www.bstqb.org.br/uploads/docs/syllabus_ctfl_2011br.pdf (acessado em 10 de
agosto de 2016).
FANTINATO, Marcelo; 2005. AutoTest - Um framework reutilizável para
automação de teste funcional de software. Campinas
Glossário padrão de termos utilizados em Testes de Software versão 2.4br, ITSQB, r
disponível em
http://www.bstqb.org.br/uploads/docs/glossario_istqb_2.4br.pdf(acessado em
02/10/2016)
IEEE Standard Glossary of Software Engineering Terminology. IEEE Std 610.12-
1990, p. 1– 84, dez. 1990.
Jasmine Introduction, disponível em http://jasmine.github.io/edge/introduction.html
(acessado em 10/07/2016)
Ken Schwaber e Jeff Sutherland. Guia do Scrum. Disponível em
http://scrumguides.org/docs/scrumguide/v2016/2016-Scrum-Guide-Portuguese-
Brazilian.pdf (acessado em 28/07/2016)
43
Manifesto Ágil, disponível em http://www.manifestoagil.com.br/ (acessado em
11/08/2016).
Manifesto for Agile Software Development, disponível em
http://www.agilemanifesto.org/ (acessado em 27/07/2016).
NODEJS, disponível em https://nodejs.org/en/ (acessado em 11/08/2016).
Protractor, disponível em http://www.protractortest.org/#/(acessado em 10/07/2016).
Protractor, How It Works, disponível em
http://www.protractortest.org/#/infrastructure (acessado em 05/09/2016)
Revista Engenharia de Software, edição especial Qualidade de Software, disponível
em http://www.devmedia.com.br/revista-engenharia-de-software/8028
Revista Engenharia de Software, edição especial, disponível em
http://www.devmedia.com.br/revista-engenharia-de-software/8028 (acesso em 10 de
agosto de 2016).
Scrum Framework and Sprint, disponível em
https://dmquickscrum.wordpress.com/2014/11/07/in-scrum-can-a-sprint-be-
cancelled-if-so-when/ (acessado em 27/07/2016).
Selenium Documentation, disponível em http://www.seleniumhq.org/docs/, (acesso
em 07/09/2016)
SOMMERVILLE, IAN; 2007, Engenharia de Software 8. Ed. São Paulo. Pearson
Education.
Standard Glossary of Terms used in Software Testing Version 3.1, ISTQB,
disponível em http://www.istqb.org/downloads/send/20-istqb-glossary/186-glossary-
all-terms.html (acessado em 09 de agosto de 2016).
Team Foundation Server, disponível em https://www.visualstudio.com/pt-
br/products/tfs-overview-vs.aspx (acesso em 07/09/2016)
TUSCHLING, Oliver, 2008, disponível em
https://www.agileconnection.com/sites/default/files/article/file/2013/XDD14908fileli
stfilename1_0.pdf (acesso em 10/08/2016)
44
APÊNDICES
APÊNDICE 1
const config = { baseUrl: 'http://localhost:5555/', // Url de acesso padrão. Toda chamada feita para um browser será para essa url specs: [ // Array de arquivos de testes './testes/ValidacaoDeNormas.js' ], framework: 'jasmine', //Identificando o framework escolhido para escrita de testes. jasmineNodeOpts: { // opções passada para o Jasmine - Node showColors: true, //Utiliza colores na linha de comando para reportar defaultTimeoutInterval: 400000 //Tempo de espera antes do sistema apontar TimeOut }, directConnect: true, capabilities: { // Capacidades passada para o instância do webdriver browserName: 'chrome' // Qual o browser deverá ser utilizado }, onPrepare: function() { //função antes da realizaçãos arquivos de teste browser.ignoreSynchronization = true; //A página de login não é desenvolvida em angular, então é necessário para a sicronização para o protracotr não ficar procurando as tags do Angular browser.get('http://localhost:5555/#'); var EC = protractor.ExpectedConditions; browser.wait(EC.presenceOf(element(by.id('Username'))));//espera até o elemento de login aparecer para poder continuar var login = browser.driver.findElement(by.id('Username')); // localiza input com ID de Login var senha = browser.driver.findElement(by.id('Password')); // Localizando input de ID Password var btnEntrar = element(by.buttonText('ENTRAR')); // localização botão com texto de Entrar login.sendKeys('27331'); // login de acesso senha.sendKeys('sgpweb69'); // senha do sistema btnEntrar.click().then(function(){ browser.wait(EC.presenceOf(element(by.css('h1')))); // espera o h1 da outra página aparecer}, useAllAngular2AppRoots: true //Para o protractor indentifcar os comandos do Angular 2
45
}; if (process.env.TRAVIS) { // Configuração de Build config.capabilities = { browserName: 'firefox' }; } exports.config = config;
APÊNDICE 2
describe('Teste de Validação de Campos obrigatórios na tela de Normas', function(){ //função para retornar a data anual no formato dd/mm/aaaa function RetornaDataAtual(){ var hoje = new Date(); var dd = hoje.getDate(); var mm = hoje.getMonth()+1; var yyyy = hoje.getFullYear(); if(dd<10){ dd='0'+dd } if(mm<10){ mm='0'+mm } var hoje = dd+'/'+mm+'/'+yyyy; return hoje; }; it('Deve clicar no botão ', function(){ browser.get('http://localhost:5555/#/normas/cadastro'); browser.actions().click().perform(); browser.actions().click().perform(); var btnSalvar =element(by.partialButtonText('Salvar & Fechar')); btnSalvar.click().then(function(){ expect(element(by.css('.ui-growl-message p')).getText()).toBe('Selecione um tipo de norma. Número é obrigatório. Selecione o ano. Data de publicação é obrigatório. Inicio Vigência é obrigatório. Descrição / Ementa é obrigatório. Referência para local de publicação da norma é obrigatório.'); }); }); it('Deve inserir norma e validar Campos', function(){ //Localiza elemento com Id Tipo Norma e seleciona o item da terceira option. Após isso, clicar. var tipoDeNorma = element(by.id('tipoNorma')).all(by.tagName('option')).get(3); tipoDeNorma.click();
46
//Localiza elemento botão com texto de Salvar e Fechar e clica var btnSalvar =element(by.partialButtonText('Salvar & Fechar')); btnSalvar.click().then(function(){ //Espera que um tostar com class ui-gorwl-message apareça com o texto de validação expect(element(by.css('.ui-growl-message p')).getText()).toBe('Número é obrigatório. Selecione o ano. Data de publicação é obrigatório. Inicio Vigência é obrigatório. Descrição / Ementa é obrigatório. Referência para local de publicação da norma é obrigatório.'); }); }); it('Deve inserir um número de norma e não validar o campo de norma e não validar o campo de número', function(){ var numero = element(by.id('numero')); var aux2 = Math.floor(Math.random() * 9999); numero.sendKeys(aux2); //Localiza elemento botão com texto de Salvar e Fechar e clica var btnSalvar =element(by.partialButtonText('Salvar & Fechar')); btnSalvar.click().then(function(){ //Espera que um tostar com class ui-gorwl-message apareça com o texto de validação expect(element(by.css('.ui-growl-message p')).getText()).toBe('Selecione o ano. Data de publicação é obrigatório. Inicio Vigência é obrigatório. Descrição / Ementa é obrigatório. Referência para local de publicação da norma é obrigatório.'); }); }); it('Deve inserir uma data e validar os campos que não foram preenchidos', function(){ var ano = element(by.id('anoSelect')).all(by.tagName('option')).get(3); ano.click(); //Localiza elemento botão com texto de Salvar e Fechar e clica var btnSalvar =element(by.partialButtonText('Salvar & Fechar')); btnSalvar.click().then(function(){ //Espera que um tostar com class ui-gorwl-message apareça com o texto de validação expect(element(by.css('.ui-growl-message p')).getText()).toBe('Data de publicação é obrigatório. Inicio Vigência é obrigatório. Descrição / Ementa é obrigatório. Referência para local de publicação da norma é obrigatório.'); }); }); it('Deve inserir data de publicação e validar os outros campos não preenchidos', function(){ var dataPublicacao = element(by.id('dataPublicacaoInput')); dataPublicacao.sendKeys(RetornaDataAtual()); //Localiza elemento botão com texto de Salvar e Fechar e clica var btnSalvar =element(by.partialButtonText('Salvar & Fechar')); btnSalvar.click().then(function(){
47
expect(element(by.css('.ui-growl-message p')).getText()).toBe('Inicio Vigência é obrigatório. Descrição / Ementa é obrigatório. Referência para local de publicação da norma é obrigatório.'); }); }); it('Deve inserir data de Inicio de Vigência e validar outros campos não preenchidos', function(){ var dataInicio = element(by.id('dataVigenciaInicioInput')); dataInicio.sendKeys(RetornaDataAtual()); //Localiza elemento botão com texto de Salvar e Fechar e clica var btnSalvar =element(by.partialButtonText('Salvar & Fechar')); btnSalvar.click().then(function(){ //Espera que um tostar com class ui-gorwl-message apareça com o texto de validação expect(element(by.css('.ui-growl-message p')).getText()).toBe('Descrição / Ementa é obrigatório. Referência para local de publicação da norma é obrigatório.'); }); }); it('Deve inserir descrição e validar os outros registros ainda não preenchidos', function(){ element(by.id('descricaoEmenta')).sendKeys('TESTE AUTOMATIZADO DE VALIDAÇÃO'); //Localiza elemento botão com texto de Salvar e Fechar e clica var btnSalvar =element(by.partialButtonText('Salvar & Fechar')); btnSalvar.click().then(function(){ //Espera que um tostar com class ui-gorwl-message apareça com o texto de validação expect(element(by.css('.ui-growl-message p')).getText()).toBe('Referência para local de publicação da norma é obrigatório.'); }); }); });
APÊNDICE 3
describe('Teste de Verificação de Vigência --', function(){ //Função para gerar Dia Mes e Ano aleatorios function RetornaDataAleatoria(){ return (Math.floor(Math.random() * 31) +1) + '/' + (Math.floor(Math.random() * 12) +1 ) + '/' + (Math.floor(Math.random() * (2016-1990) + 1990)); } //função para gerar a Data atual function dataAtualFormatada(){ var data = new Date();
48
var dia = data.getDate(); if (dia.toString().length == 1) dia = "0"+dia; var mes = data.getMonth()+1; if (mes.toString().length == 1) mes = "0"+mes; var ano = data.getFullYear(); return dia+"/"+mes+"/"+ano; } //Função para gerar Data de ontem function ontemFormatada(){ var data = new Date(); var ontem = data.getDate() -1 ; if (ontem.toString().length == 1) ontem = "0"+ ontem; var mes = data.getMonth()+1; if (mes.toString().length == 1) mes = "0"+mes; var ano = data.getFullYear(); return ontem +"/"+mes+"/"+ano; } //Função executada antes de cada caso de teste, ou seja, cada 'It' beforeEach(function(){ browser.get('http://localhost:5555/#/normas/cadastro');//Antes do teste o sistema deve abrir a página de cadastro browser.sleep(3000);//Espera o carregamento da página browser.actions().click().perform(); }); it('Deve verificar o status default da pagina seja Sem vigência e os campos data em branco', function(){ //Verifica se o texto da vigência ao abrir a tela é Sem Vigência expect(element(by.partialButtonText("Sem vigência")).isPresent()).toBe(true); }); it('Deve Verificar Vigência Inválida - Data Fim maior que Data Inicio', function(){ //Seta a data no campo de Inicio Vigência var dataInicio = element(by.id('dataVigenciaInicioInput')); dataInicio.sendKeys('04/08/2060'); // Seta data no campo Fim Vigência var fimVigencia = element(by.id('dataVigenciaFimInput')); fimVigencia.sendKeys('01/08/2000'); // Verifica o texto do botão que indicia a vigência
49
expect(element(by.partialButtonText(" Vigência invalida")).isPresent()).toBe(true); });
it('Deve verificar Vigência Revogada', function(){ //Seta a data no campo de Inicio Vigência var dataInicio = element(by.id('dataVigenciaInicioInput')); dataInicio.sendKeys('07/08/2015'); // Seta data no campo Fim Vigência var fimVigencia = element(by.id('dataVigenciaFimInput')); fimVigencia.sendKeys('01/07/2016'); // Verifica o texto do botão que representa a Vigência expect(element(by.partialButtonText("Revogada")).isPresent()).toBe(true); });
it('Deve verificar vigência Valida - Cadastrada corretamente', function(){ //Seta a data no campo de Inicio Vigência var dataInicio = element(by.id('dataVigenciaInicioInput')); dataInicio.sendKeys('01/08/2000'); // Seta data no campo Fim Vigência var fimVigencia = element(by.id('dataVigenciaFimInput')); fimVigencia.sendKeys('02/08/3000'); // Verifica o texto do botão que representa a Vigência expect(element(by.partialButtonText("Vigente")).isPresent()).toBe(true); });
it('Deve verificar data fim em branco e vigência Valida', function(){ //Seta a data no campo de Inicio Vigência var dataInicio = element(by.id('dataVigenciaInicioInput')); dataInicio.sendKeys('01/08/2015'); // Verifica o texto do botão que representa a Vigência expect(element(by.partialButtonText("Vigente")).isPresent()).toBe(true); }); it('Deve verificar vigência Valida para data fim igual a data Atual', function(){ //Seta a data no campo de Inicio Vigência var dataInicio = element(by.id('dataVigenciaInicioInput')); dataInicio.sendKeys('01/08/1990'); // Seta data atual no campo Fim Vigência var fimVigencia = element(by.id('dataVigenciaFimInput')); fimVigencia.sendKeys(dataAtualFormatada()); // Verifica o texto do botão que representa a Vigência expect(element(by.partialButtonText("Vigente")).isPresent()).toBe(true); }); it('Deve verificar se a vigência esta revogada com uma data anterior que a data atual', function(){ //Seta a data no campo de Inicio Vigência
50
var dataInicio = element(by.id('dataVigenciaInicioInput')); dataInicio.sendKeys('01/08/1999'); // Seta data atual no campo Fim Vigência var fimVigencia = element(by.id('dataVigenciaFimInput')); fimVigencia.sendKeys(ontemFormatada()); // Verifica o texto do botão que representa a Vigência expect(element(by.partialButtonText("Revogada")).isPresent()).toBe(true); }); });
APÊNDICE 4
describe('Cadastro de Normas --', function(){ function RetornaDataAleatoria(){ return (Math.floor(Math.random() * 31) +1) + '/' + (Math.floor(Math.random() * 12) +1 ) + '/' + (Math.floor(Math.random() * (2016-1990) + 1990)); } var contadorInicial = 0; var contadorFinal = 0;
it('Abrir tela de grid', function(){ browser.get('http://localhost:5555/#/normas'); browser.sleep(5000); browser.actions().click().perform(); browser.actions().click().perform(); });
it('contabiliza registros', function(){ function getPrimeiraCedula() { var registros = element(by.className('ui-datatable-data ui-widget-content')).all(by.tagName('tr')); var primeiralinha = registros.first(); var coluna = primeiralinha.all(by.tagName('td')).first(); var primeiroTexto = coluna.getText(); return primeiroTexto; }; var promiseWhile = function(condition, action) { return new Promise(function(resolve, reject) { var inner = function(condition, action) { condition().then(function(result) { if (result) {
51
action().then(inner.bind(null, condition, action)); } else { resolve(); } }); }; inner(condition, action); }); }; promiseWhile( function() { return new Promise( function(resolve, reject) { getPrimeiraCedula().then(function(conteudo) { var areNotEquals = (conteudo !== 'No records found'); resolve(areNotEquals); browser.sleep(1000); }); }); }, function() { return new Promise(function(resolve, reject) { var registros = element(by.className('ui-datatable-data ui-widget-content')).all(by.tagName('tr')); var prom = registros.count().then(function(resultado){ contadorInicial += resultado; element(by.className('zmdi zmdi-caret-right')).click().then(function() { resolve(); return; }); }); }); }).then(function() { }); }); it('Cadastrando norma Vigente', function(){ element(by.linkText('Novo')).click(); browser.sleep(8000); browser.actions().click().perform(); browser.actions().click().perform(); //Gera loop para incluri 10 tags no cadastro de nroma for (var i = 0; i < 11; i++) { element(by.id('tagInput')).sendKeys('tag ' + i); browser.sleep(100);
52
element(by.id('tagInput')).sendKeys(protractor.Key.TAB); } browser.sleep(100); //localiza o droplist com id TipoNorma e verifica todos os options var tipoDeNorma = element(by.id('tipoNorma')).all(by.tagName('option')); //Seleciona uma norma aleatoria do droplist tipoDeNorma.count().then(function (opcao){ return Math.floor(Math.random() * opcao); }).then(function (escolhaopcao){ tipoDeNorma.get(escolhaopcao).click(); }); //Localiza elemento com Id numero e seta valor inteiro aleatorio até 9999 var numero = element(by.id('numero')); var aux2 = Math.floor(Math.random() * 9999); numero.sendKeys(aux2); //localiza element com id AnoSelect e seleciona todos os options, seleciona randomicamente valor de array de 218 e clica var aux3 = Math.floor(Math.random() * 218); var ano =element(by.id('anoSelect')).all(by.tagName('option')).get(aux3); ano.click(); browser.sleep(200); //localiza elemento com id data publicação e seta data Aleatoria var dataPublicacao = element(by.id('dataPublicacaoInput')); dataPublicacao.sendKeys(RetornaDataAleatoria()); browser.sleep(200) //localiza elemento com id data inicio e seta data Aleatoria var dataInicio = element(by.id('dataVigenciaInicioInput')); dataInicio.sendKeys(RetornaDataAleatoria()); browser.sleep(300); expect(dataInicio).not.toBe(null); //localiza elemento com id Descrição e seta valor de teste automatização element(by.id('descricaoEmenta')).sendKeys('TESTE AUTOMATIZADO'); //localiza elemento botao com text de Referência e clica, seleciona opção DOE. element(by.buttonText('Referência')).click(); element(by.linkText('DOE')).click(); var doe = element(by.tagName('link-externo')).element(by.tagName('input')); doe.sendKeys('http://wikicti.tjmt.jus.br/index.php?title=P%C3%A1gina_principal'); element(by.partialButtonText('Salvar')).click();
53
}); it('Deve contabilizar os registros novamente após adicionar e verificar se foi adicionado um único registros na grid', function(){ browser.sleep(10000); function getPrimeiraCedula() { var registros = element(by.className('ui-datatable-data ui-widget-content')).all(by.tagName('tr')); var primeiralinha = registros.first(); var coluna = primeiralinha.all(by.tagName('td')).first(); var primeiroTexto = coluna.getText(); return primeiroTexto; } var promiseWhile = function(condition, action) { return new Promise(function(resolve, reject) { var inner = function(condition, action) { condition().then(function(result) { if (result) { action().then(inner.bind(null, condition, action)); } else { resolve(); } }); }; inner(condition, action); }); }; promiseWhile( function() { return new Promise( function(resolve, reject) { getPrimeiraCedula().then(function(conteudo) { var areNotEquals = (conteudo !== 'No records found'); resolve(areNotEquals); browser.sleep(1000); }); }); }, function() { return new Promise(function(resolve, reject) { var registros = element(by.className('ui-datatable-data ui-widget-content')).all(by.tagName('tr')); var prom = registros.count().then(function(resultado){ contadorFinal += resultado;