Escolar Documentos
Profissional Documentos
Cultura Documentos
Boa Vista, RR
2017
LILIANE DE MATOS SOARES
Boa Vista, RR
2017
LILIANE DE MATOS SOARES
______________________________________
Profa. MSc. Delfa Mercedes Huatuco Zuasnábar
Orientadora / Curso de Ciência da Computação – UFRR
______________________________________
Profº. MSc. Miguel Raymundo Flores Santibanez
Curso de Ciência da Computação - UFRR
______________________________________
Profº. MSc. Acauan Cardoso Ribeiro
Curso de Ciência da Computação - UFRR
AGRADECIMENTOS
Agradeço imensamente a minha mãe, que com todo amor, exemplo de vida e força,
mostrou-me o caminho para chegar até aqui, e sem o qual nada disso seria possível. Dedico à
minha família a concretização desse sonho, aos meus irmãos que sempre estiveram me
apoiando na longa trajetória da graduação.
Por fim, agradeço aos meus amigos, que na simplicidade da luz de nossa amizade me
trouxeram felizes momentos e lembranças de uma época de estudos que com muito carinho ei
de lembrar.
Algumas pessoas acham que foco
significa dizer sim para a coisa em que
você vai se focar. Mas não é nada disso.
Significa dizer não às centenas de outras
boas ideias que existem.
(Steve Jobs)
RESUMO
With the advancement of the Internet and Cloud Computing, the paradigm of software
development has also changed, there is a tendency to migrate applications or develop them in
the cloud environment where there is no need to install programs locally, everything can be
accessed by the Internet browser, this is the Software as a Service feature. Agile methods have
also been much discussed and used for their results in software development. In this sense, the
present work aimed to apply the agile XP (Extreme Programming) and BDD (Behavior
Driven Development) methods for the development of a digital bibliographic repository with
the objective of supporting academic research, to function as a service accessed by the
Internet. The reach that the software as a service has is far superior to traditional software,
since it is quickly available to millions of users, making its evolution also greater. We can
highlight that the best benefit of software as a service is continuous improvement. Because
there is no final version, it is always possible to improve.
1 INTRODUÇÃO ...................................................................................................... 14
1.1 MOTIVAÇÃO ......................................................................................................... 14
1.2 OBJETIVOS ............................................................................................................ 15
1.2.1 Objetivo Geral ........................................................................................................ 15
1.2.2 Objetivos Específicos ............................................................................................. 15
1.3 ORGANIZAÇÃO DO DOCUMENTO ................................................................... 15
2 FUNDAMENTOS TEÓRICOS ............................................................................ 16
2.1 COMPUTAÇÃO EM NUVEM ............................................................................... 16
2.1.1 Modelos de serviços em nuvem ............................................................................. 18
2.1.2 Modelos de implantação em nuvem ..................................................................... 24
2.2 ENGENHARIA DE SOFTWARE........................................................................... 25
2.2.1 Métodos Tradicionais ............................................................................................ 25
2.2.2 Métodos Ágeis ......................................................................................................... 28
2.2.3 Extreme Programming (XP) ................................................................................. 30
2.2.4 Requisitos ................................................................................................................ 33
2.2.5 Testes ....................................................................................................................... 34
2.2.6 Behavior-Driven Development (BDD) ................................................................. 35
2.2.7 Interface .................................................................................................................. 38
2.3 RUBY E RUBY ON RAILS .................................................................................... 38
3 TRABALHOS CORRELATOS ........................................................................... 41
3.1 ISSUES IN ADOPTING AGILE DEVELOPMENT PRINCIPLES FOR
MOBILE CLOUD COMPUTING APPLICATIONS ............................................. 41
3.2 BIBLIOTECAS NA NUVEM: O USO DA COMPUTAÇÃO EM
NUVEM EM BILIOTECAS.................................................................................... 42
3.3 IMPACT OF WEB 2.0 AND CLOUD COMPUTING PLATFORM ON
SOFTWARE ENGINEERING ................................................................................ 45
4 PROTÓTIPO DE UM REPOSITÓRIO DIGITAL DE APOIO À
PESQUISA USANDO XP EM SOFTWARE COMO SERVIÇO ..................... 47
4.1 APLICAÇÃO DO XP .............................................................................................. 47
4.2 REQUISITOS E TESTES DE ACEITAÇÃO ......................................................... 48
4.3 INTERFACE DE USUÁRIO .................................................................................. 69
4.4 CLOUD9 .................................................................................................................. 73
5 CONCLUSÃO ........................................................................................................ 76
5.1 CONSIDERAÇÕES FINAIS ................................................................................... 76
5.2 TRABALHOS FUTUROS ...................................................................................... 77
REFERÊNCIAS ..................................................................................................................... 79
14
1 INTRODUÇÃO
1.1 MOTIVAÇÃO
bibliográfico digital que funcionará como um serviço. O repositório visa agregar as diversas
bibliografias utilizadas por pesquisadores de forma organizada e centralizada.
1.2 OBJETIVOS
1. Pesquisar o estado da arte sobre os Métodos Ágeis, com foco nos métodos XP e
BDD;
2. Pesquisar o estado da arte sobre Computação em Nuvem, com foco em Software
como Serviço;
3. Automatizar os requisitos e testes de aceitação usando a ferramenta Cucumber;
4. Desenvolver um protótipo de repositório bibliográfico digital para apoio à pesquisa;
2 FUNDAMENTOS TEÓRICOS
Neste capítulo abordaremos sobre a fundamentação teórica deste trabalho que inclui os
tópicos de computação em nuvem, seus modelos de serviço e implantação; sobre a engenharia
de software e suas metodologias, tradicional e ágil, especificando o método XP e os métodos
para teste BDD.
pesquisas realizadas nas diversas áreas da computação, como a computação utilitária, clusters
e grids, etc, tornando-a no que é hoje. O sucesso que obteve em aplicações comerciais de
grande escala são indicadores do seu potencial nas aplicações científicas de alto desempenho
(ALKMIN, CORDEIRO, 2014).
Um dos grandes motivos do avanço da computação em nuvem foi a virtualização. Em
computação, virtualização é um termo genérico, que se refere à abstração dos recursos do
computador, mascarando as características físicas deles de forma que outros sistemas,
aplicações ou usuários finais possam interagir com tais recursos (MARTINS, 2010). Ela
melhora a utilização de recursos e eficiência energética - ajudando a reduzir substancialmente
a sobrecarga de manutenção do servidor e proporcionando rápida recuperação de desastres e
alta disponibilidade (GORELIK, 2013).
Além dos motivos anteriormente citados, a virtualização tem sido muito importante
para a computação em nuvem porque isola software de hardware e assim fornece um
mecanismo para redistribuir rapidamente aplicações em servidores com base nas demandas
computacionais (GORELIK, 2013).
O funcionamento da computação em nuvem segue um modelo de negócio onde o
usuário paga apenas pelo que consome de recursos e o provedor do serviço mantém uma
infraestrutura física, amortiza os custos de manutenção e investimentos compartilhando e
alugando seus recursos a diferentes usuários (CARISSIMI, 2015). Provedores como a
Amazon e a Microsoft permitem que as empresas evitem grandes investimentos em
infraestrutura e adquiram novos recursos de computação de forma dinâmica, conforme o
necessário. Este modelo é particularmente viável para pequenas empresas e star-tups1, que
muitas vezes não tem condições de gastar grandes somas de dinheiro no início de sua jornada
de negócios (GORELIK, 2013).
Na prática, ela é um modelo de negócio baseado no conceito de elasticidade. A
elasticidade é a capacidade de alocar recursos conforme a demanda. Se durante a execução de
uma aplicação for atingido um pico de utilização, provocando gargalos ou a degradação de
desempenho, o cliente pode solicitar mais máquinas virtuais para auxiliar o processamento
durante esse pico de demanda. Após a normalização da situação, essas máquinas virtuais
podem ser liberadas (CARISSIMI, 2015). Dessa maneira, cada cliente paga apenas pela
utilização efetiva dos recursos.
1
Startup é uma empresa de base tecnológica, com modelo de negócio repetível e escalável, que possui elementos
de inovação...(Associação Brasileira de Startups, 2017).
18
Porém existem barreiras para a adoção da mesma. A segurança dos dados é, de longe,
a mais desafiadora. A segurança dos dados é um requisito essencial para as empresas.
Portanto, elas se sentem confiantes quando armazenam dados internamente porque têm total
controle sobre eles. Embora não haja garantia de que os dados são melhor protegidos
internamente comparando com a nuvem pública. Na verdade, há uma possibilidade de que os
dados podem estar ainda mais seguros na nuvem pública, porque os provedores de nuvem
pública podem colocar o mais elevado nível de especialização em segurança de dados em
comparação com os seus clientes (GORELIK, 2013).
software arbitrário, incluindo sistemas operacionais e aplicativos, onde o consumidor não irá
gerenciar ou controlar essa infraestrutura, apenas ter o controle sobre sistemas operacionais,
armazenamento e aplicativos implantados. Além disso, o consumidor pode ser capaz de
selecionar os componentes de rede, por exemplo, hospedar firewalls e balanceadores de carga
(JAKONEN, 2011).
Beta”, sem nunca precisar chegar em uma versão terminada para entrar em produção (PINHO,
2009).
Pinho (2009) explica que o SaaS é um modelo baseado em aplicações Multi-tenant,
onde uma única instância da aplicação serve vários clientes do sistema. Porém, existem
variantes nos quais o software fica instalado na máquina do cliente e a informação é
sincronizada entre o cliente e os serviços alojados remotamente.
A hospedagem multi-tenant e a automação de serviços permite que os fornecedores de
SaaS mantenham os custos baixos. Dependendo do provedor de SaaS e do tipo de aplicação,
algumas aplicações personalizadas são disponíveis frequentemente, mas esta é tipicamente
mais limitada do que com as soluções de computação em nuvem, PaaS e IaaS (GORELIK,
2013).
Na computação em nuvem, a ideia fundamental é reutilizar diferentes tipos de serviços
baseados na Internet. Em SaaS, o software em si é alvo de reutilização e é implantado para os
consumidores de serviços através da Internet. Normalmente, relacionamentos um-para-muitos
são usados em serviços de entrega em SaaS. Por exemplo, o Google Maps é um serviço que
fornece um conjunto de operações que utiliza informações compartilhadas em um mapa, e o
serviço pode ser usado por vários clientes (JAKONEN, 2011).
Segundo Cheun (2009) o SaaS apresenta seis recursos principais:
SaaS reduz os custos para os provedores, uma vez que é o único a lidar com as
1 necessidades de todos os clientes a partir de sua localização, incluindo
atualização e personalização de sistemas.
SaaS é completamente gerenciado por provedores; portanto, eles podem
2
atualizar e corrigir o sistema sem visitar pessoalmente os sites dos clientes.
SaaS ajuda os provedores a agilizar a atualização do software para melhorar a
sua competitividade no mercado. Devido ao fato do SaaS ser oferecido aos
clientes através de uma plataforma baseada na Web, os provedores podem
3 atualizar constantemente uma nova versão. Portanto, eles podem oferecer uma
nova versão para os clientes mais rápido que o software tradicional, que
precisam enviar uma nova versão em um disco de aplicação a todos os clientes
para atualizações.
Fonte: Adaptado de (RUCHUTRAKOOL; ZHU, 2009).
Já na tabela 2 estão reunidos os principais benefícios que ele traz para o cliente:
para o número de usuários de imediato, porque seus processos não afetam outros
processos quando expande.
Clientes de SaaS adquirem facilmente recursos personalizados. Uma das vantagens
4
do software orientado a serviço é a facilidade de ajuste.
SaaS ajuda os clientes a se concentrarem mais em suas competências principais de
5 negócio, porque eles não têm preocupação com qualquer infraestrutura de TI, ela é
de responsabilidade dos prestadores de serviços de SaaS.
SaaS ajuda os clientes a se concentrarem mais em suas competências principais de
6 negócio, porque eles não têm preocupação com qualquer infraestrutura de TI, ela é
de responsabilidade dos prestadores de serviços de SaaS.
SaaS auxilia os clientes para acessar os dados do aplicativo e de atualização,
independentemente de onde estiverem. Eles só precisam de Internet e um navegador,
a fim de fazer logon e usar o aplicativo. Além disso, esses recursos permitem que
7
equipes trabalhem a partir de suas localizações, como de suas casas. Portanto, não
precisa ir a sede a fim de acessar o sistema. Isso permite que trabalhe em qualquer
lugar e em qualquer hora.
Fonte: Adaptado de RUCHUTRAKOOL; ZHU (2009).
Alguns autores especificam mais modelos, porém para o entendimento deste trabalho
essas definições são suficientes.
Desenvolver software não é uma atividade trivial, pois o mesmo se trata de algo
abstrato e intangível. Existem muitos problemas que podem ocorrer no processo de criação do
software, principalmente no que se refere ao desenvolvimento profissional, como alto custo,
alta complexidade, desproporção entre o que o cliente desejava e o produto entregue, etc.
Diante desses problemas e acreditando-se que o processo utilizado era uma das causas,
a engenharia de software surgiu com o objetivo de enfatizar o quanto era preciso que o
desenvolvimento de software fosse baseado nos princípios teóricos e nas disciplinas práticas
tradicionalmente conhecidos dos diversos ramos da engenharia (SATO, 2007).
Nas seções a seguir será apresentado como a engenharia de software evoluiu ao longo
dos anos com os métodos tradicionais e os mais recentes, métodos ágeis.
por fases distintas, do levantamento de requisitos até a implantação, ou seja, todas elas eram
encadeadas. Na década seguinte surge o modelo em espiral que serviu como base para os
atuais processos iterativos e incrementais como o Rational Unified Process, o RUP, e também
os Métodos Ágeis (SATO, 2007).
A figura 5 mostra os estágios do modelo em cascata e fica evidente o porquê dele ser
chamado dessa maneira.
O RUP foi desenvolvido com o intuito de complementar a UML (do inglês Unified
Modelling Language), método para modelagem de software. Adota uma abordagem iterativa
no desenvolvimento de sistemas. As práticas enfatizadas pelo RUP são (UCHOA, 2013):
O método também possui etapas, que são especificadas na tabela abaixo (FOX;
PATTERSON, 2015):
Uchôa (2013) esclarece que o RUP pode ser usado tanto no desenvolvimento
tradicional quanto em projetos ágeis. Porém, ele não é considerado ágil, pois foi
originalmente criado para cobrir processos inteiros de desenvolvimento de software, com
orientações extensas que não são típicas de um ambiente ágil.
Para que entendesse o foco dos métodos ágeis foram disponibilizados 12 princípios
onde detalham a filosofia contida no manifesto e onde os métodos ágeis devem se adequar
(BECK et al, 2001):
Fox e Patterson (2015) explicam que métodos ágeis são modelos de desenvolvimento
que incentivam a prática de abraçar as mudanças como um fato da vida, em que os
desenvolvedores devem aperfeiçoar continuamente um protótipo incompleto, mas em
funcionamento, com o feedeback do cliente em cada iteração, até que ele esteja feliz com o
resultado.
Segundo Sommerville (2011), métodos ágeis são bem-sucedidos em duas situações:
no desenvolvimento de um produto pequeno ou médio e no desenvolvimento de um sistema
30
personalizado, em que o cliente participa ativamente, sem muitas regras e regulamentos que
afetem o software. No entanto, enfatiza que os princípios básicos dessa metodologia são,
muitas vezes, difíceis de concretizar para grandes sistemas, principalmente em sistemas
críticos, onde há a necessidade de proteção, segurança e análise de confiança, sendo que seu
uso exigiria grandes modificações nos métodos ágeis.
Sob os valores e princípios do manifesto ágil aparecem diversas abordagens mais
específicas, com diferentes ideias, comunidades e líderes, onde formam um grupo distinto,
porém seguindo os mesmos princípios (SATO, 2007).
Dentre os métodos ágeis podemos citar XP, Scrum, Família Crystal, Lean Software
Development, Feature Driven Development (FDD), Dynamic System Development Method
(DSDM), Behavior Driven Development (BDD) entre outras. O método utilizado neste
trabalho será o XP porque ela enfatiza a importância da criação de testes, além de ser uma das
mais conhecidas e usadas atualmente.
O Extreme Programming (XP) é um dos métodos ágeis que mais recebeu atenção na
virada do século. Seu objetivo é a excelência no desenvolvimento de software, visando o
baixo custo, poucos defeitos, alta produtividade e alto retorno de investimento (SATO, 2007).
Kent Beck é o criador do XP e um dos que lançaram o manifesto ágil. Beck foi
chamado para ajudar no projeto C3, ou Chrysler Comprehensive Compensation System, para a
empresa DaimlerCrysler, que após anos de fracassos ficou pronto em um ano, usando as
práticas que vieram a se tornar o XP (FAGUNDES, 2005).
Em sua segunda edição o XP segue um conjunto de valores, princípios e práticas para
serem adotados durante o processo de desenvolvimento. As práticas são as técnicas utilizadas
no dia-a-dia por membros da equipe de XP, que só fazem sentido no contexto da
programação; os valores são critérios mais amplos e universais usados para julgar uma
situação, eles dão razão às práticas, enquanto que as práticas colocam em evidência os
valores; os princípios funcionam como ferramentas para tradução dos valores em práticas
(SATO, 2007).
Os valores do XP expresso por Beck e Andres (2004) são explicitados na tabela
abaixo:
31
Tabela 5 - Valores do XP
VALORES DO XP
Em relação às práticas, Beck e Andres (2004) explicam que elas não se mantêm por si
só, o que faz elas funcionarem é a cooperação do seu conjunto. Algumas práticas são
especificadas na tabela a seguir:
Prática Definição
Consiste na decisão do que deve ser feito e no que pode ser
Jogo do planejamento adiado, já que o XP se baseia em requisitos atuais e não em
requisitos futuros.
As entregas são feitas ao término de iteração, devendo ser
tão pequena quanto possível. O foco está no monitoramento
Entregas frequentes
do progresso do software tanto pelos clientes quanto pelos
programadores.
O planejamento no XP é feito com histórias escritas em
Histórias de usuário pequenos cartões, sem a utilização de termos técnicos, com
o intuito de guiar o desenvolvimento do software.
Projeto simples Manter o projeto mais simples possível o faz permanecer
32
2.2.4 Requisitos
Somerville (2011) define requisito de software como uma especificação do que deve
ser implementado. São descrições de como o sistema deve se comportar, os serviços que deve
oferecer e as restrições a seu funcionamento. Segundo Motta (2016) essa definição destaca a
importância de estabelecer, compreender e documentar os requisitos durante todo o processo
de desenvolvimento de software, e formam o processo denominado Engenharia de Requisitos.
O processo de Engenharia de Requisitos é iterativo, porque os requisitos mudam
regularmente durante o processo de desenvolvimento. Os requisitos muitas vezes têm de ser
refinados ou adicionados durante as próximas fases do processo de desenvolvimento. Muitas
organizações de desenvolvimento de software também estão enfrentando problemas na coleta
de requisitos adequados. Os requisitos insuficientes e exigências em mudança são as
principais razões pelas quais muitos produtos de tecnologia da informação não conseguem
entregar dentro de sua programação e orçamento limite. Os requisitos são a base tanto para o
desenvolvimento de software como para as atividades de gerenciamento de projetos (KOLLA;
BANKA, 2014).
Os requisitos podem ser uma declaração abstrata, em alto nível, de um serviço que o
sistema deve oferecer ou uma restrição, ou ainda, uma descrição detalhada e formal de uma
função que ele deve oferecer. Nessas duas definições usa-se o termo “requisitos de usuário”
para os requisitos abstratos de ato nível, e “requisitos de sistema” para a descrição detalhada
do que o sistema deve fazer (SOMMERVILLE, 2011).
Os requisitos são geralmente categorizados em funcionais e não-funcionais. Na forma
mais simples os requisitos funcionais são aqueles que definem o que o sistema ou componente
do sistema deve ser capaz de executar, enquanto que o não-funcional é usado para requisitos
que especificam como o sistema deve atuar em determinada maneira, ou seja, é um requisito
que descreve não o que o software vai fazer, mas como deve fazê-lo; esses requisitos são
geralmente descritos com termos que terminam com ‘ilidade’, como disponibilidade,
enquanto que outros não seguem esse padrão, como desempenho e facilidade de uso. Embora
os requisitos não-funcionais geralmente recebam menos atenção na concepção de muitos tipos
34
2.2.5 Testes
As aplicações Web tem características que bem distintas de outros tipos de aplicações.
Segundo Pressman (2011) existe uma urgência dos grupos interessados em obtê-la online,
fazendo com que atividades técnicas como os testes aconteçam mais tarde e tenham pouco
tempo no processo.
A procura de erros se torna um desafio porque esses sistemas e aplicações residem em
uma rede e interoperam com muitos sistemas operacionais diferentes, navegadores,
plataformas de hardware, etc. Por isso os testes para aplicações Web experimentam cada
dimensão de qualidade averiguando inicialmente.
Sommerville (2011) afirma que teve um aumento considerável nos últimos anos de
testes automatizados, porém estes só verificam se um programa faz aquilo a que é proposto e
não testam os sistemas que dependem de como as coisas estão, ou se a aplicação possui
efeitos colaterais indesejados.
enquanto novos recursos são implantados para os stakeholders terem uma noção das próximas
funcionalidades a serem adicionadas e se o sistema é aquilo que eles estão querendo.
O BDD se refere a todo o comportamento, ou seja, tudo sobre o que um sistema deve
fazer. Todo comportamento está lá porque acrescenta concretamente um valor de negócio
para o sistema como um todo. Ele é impulsionado por valor de negócio, ou seja, pelo
benefício para o negócio que resulta uma vez que a aplicação está em produção (DUARTE;
FERNANDES, 2013). O BDD cria comportamentos testáveis e automatizados que gerem
valor de negócio para o cliente antes mesmo do código fonte e que evitem erros baseados em
comportamento, gerando um conjunto de testes de aceitção baseados nesses comportamentos
(RIBEIRO, 2012).
A prática faz questionamentos sobre o comportamento de uma aplicação antes e
durante o desenvolvimento. Dessa forma as partes interessadas estão menos inclinadas a
falhas de comunicação, os requisitos são continuamente aprimorados para ter certeza de que o
sistema esteja de acordo com o esperado por eles (FOX; PATTERSON, 2015). O objetivo dos
requisitos do BDD é, principalmente, construir a coisa certa. Logo, ao se concentrar no
comportamento da aplicação ao invés de se concentrar na sua implementação, fica mais fácil
reduzir mal-entendidos entre os stakeholders.
No BDD, os requisitos são chamados de histórias de usuários. Uma versão mais leve
dos requisitos e mais adequada aos métodos ágeis, que descrevem como se espera que a
aplicação seja usada. Elas ajudam os stakeholders a planejar e priorizar o desenvolvimento. O
BDD oferece uma estrutura para uma história, mas que não é obrigatória (FOX;
PATTERSON, 2015).
As histórias de usuário se referem a uma única funcionalidade com um ou mais
cenários que mostram diferentes maneiras de utilizá-la. As palavras-chave Funcionalidade e
Cenário identificam os respectivos componentes. Cada cenário é composto de sequências de
3 a 8 passos. Boloz (2014) fundamenta que os cenários por sua vez são escritos do ponto de
vista de um usuário. O esquema abaixo exemplifica o formato de um cenário:
Dado algum contexto inicial
Quando ocorre um evento
Então, descreve o resultado esperado.
E ou Mas
Essas palavras-chave ajudam os membros da equipe a decidir que tipo de
comportamento é necessário para ser implementado na sequência. Cada frase é um passo do
cenário e começa com sua própria palavra-chave. Os passos que começam com Dado
37
geralmente estabelecem condições. Passos que começam com Quando geralmente representa
um usuário apertando um botão. Já os que começam com Então irão verificar se uma
condição é verdadeira. Resumindo, Dado é usado para identificar o estado atual, Quando
para identificar a ação e Então para identificar a consequência da ação. E e Mas são para
permitir versões mais complexas das palavras anteriores.
A ferramenta que será utilizada para a prática do BDD será o Cucumber, juntamente
com o Capybara, que irá simular as ações do usuário. Fox e Patterson (2015) descreve o
Cucumber como uma admirável ferramenta que transforma histórias de usuário, que clientes
podem facilmente entender, em testes de aceitação (verifica se o programa integrado atende as
especificações) que garantem que o cliente está satisfeito, e em testes de integração (garantem
que as interfaces entre as unidades tenham objetivos consistentes e se comuniquem
corretamente), que garantem que as interfaces entre os módulos seguem o mesmo conjunto de
hipóteses e se comunicaram corretamente. Essa ferramenta atua entre o cliente e o
desenvolvedor, já que as histórias de usuário são claras para o cliente, mas ao mesmo tempo
segue um padrão bem definido.
A figura 7 abaixo mostra um exemplo de uma funcionalidade feita no Cucumber:
Não é obrigatório seguir essa estrutura, mas essa é uma forma comprovada para
trabalhar em diversos projetos, então uma boa história deve conter todos os elementos
descritos na Figura 7 acima, para os membros da equipe poderem ter um melhor entendimento
do que se pretende fazer.
38
2.2.7 Interface
Como falado no parágrafo acima Ruby é uma linguagem orientada a objetos genuína,
ou seja, quando você escreve código orientado a objeto, você está normalmente modelando
conceitos do mundo real em seu código. Em Ruby, objetos são criados chamando um
construtor, que é um método especial associada a uma classe, o construtor padrão é chamado
new (MATSUMOTO, 2001).
Como Ruby possui bibliotecas ricas em funções, mas existem poucos mecanismos, ela
é considerada uma linguagem minimalista. Existem três características implícitas a esses
mecanismos (FOX; PATTERSON, 2015):
para o usuário e abrange informações a respeito dos modelos que o usuário pode se relacionar
(DOURADO, 2009). Os controladores, por sua vez, são os mediadores da interação entre as
visões e os modelos: quando o usuário interage com uma visão (por exemplo, clicar em um
link na página), uma ação específica do controlador correspondente àquela atividade do
usuário é solicitada. Cada controlador está associado a um modelo e, no Rails, cada ação do
controlador é implementada por um método Ruby em particular daquele controlador. O
controlador pode pedir ao Modelo para recuperar ou modificar informações; dependendo do
resultado obtido, o controlador decide qual visão será apresentada a seguir ao usuário, e
repassa à visão todas as informações que podem ser necessárias (FOX; PATTERSON, 2015).
De modo geral, o funcionamento de aplicações que usam o padrão MVC funciona da
seguinte forma: um usuário pode submeter um formulário, clicar em links ou botões, etc.
Essas ações serão tratadas por alguma ação do controlador, que consultará os modelos para
obter as informações necessárias e gerar uma visão como resposta.
A razão do uso desta linguagem neste trabalho se deve ao fato de que a comunidade
Ruby já adotou a ciclo de vida ágil como parte do processo de desenvolvimento, conforme
explicam Fox e Patterson (2015) em seu livro “Construindo Software como Serviço”.
41
3 TRABALHOS CORRELATOS
A autora faz um estudo por meio de uma pesquisa bibliográfica de análise qualitativa,
em que o problema da pesquisa consiste no rumo que as bibliotecas estão seguindo quanto ao
uso da computação em nuvem na disponibilização de seus acervos, e como a instituição se
beneficia com essa tecnologia.
A autora propõe como objetivo:
mais benefícios que riscos. Mas, adverte para um bom planejamento para definir o fornecedor
e analisar os itens de segurança.
Existe um nono conceito de biblioteca, chamada biblioteca sem parede, que diferente
das convencionais facilitam a disseminação e o acesso em tempo real. Dentre os tipos de
bibliotecas temos: biblioteca eletrônica, biblioteca digital, biblioteca virtual, biblioteca híbrida
e futuramente a biblioteca na nuvem (MARTINS, 2012). A tabela 7 abaixo dá a definição de
cada uma delas:
O usuário hoje procura uma biblioteca onde possa ser atendido num ambiente virtual,
visualizar em seu equipamento eletrônico. Dessa forma as bibliotecas veem significativas
alterações em suas estruturas, como forma de armazenamento, por exemplo. Nisso a
computação em nuvem surge como uma promessa revolucionária na forma como os sistemas
45
Neste artigo Guha (2010) analisa a forma como a computação em nuvem, tendo como
plano de fundo a web 2.0, vai impactar o processo de Engenharia de Software para o
desenvolvimento de software de qualidade. O autor faz os seguintes questionamentos: Como
o provedor de nuvem é uma entidade externa ou de terceiros, o quão difícil será a interação
com eles? Como separar os papéis de engenheiros de software e provedores de nuvem? O
artigo amplia o tradicional modelo ágil Extreme Programming (XP) e integra a interação com
o provedor de nuvem para facilitar a aceitação da computação em nuvem.
Guha (2010) explica que a economia de todos os países desenvolvidos depende de
software de qualidade, e o custo do software é maior que o do hardware. Como o
desenvolvimento de software envolve muitas partes, ele é inerentemente um processo
complexo, diante disso, a tendência é que o projeto falhe devido à falta de comunicação e
coordenação entre todas as partes envolvidas.
A tese principal do trabalho de Guha (2010) é que os modelos de processo de software
prevalentes devem envolver o provedor de nuvem em cada tomada de decisão no
desenvolvimento de ciclo de vida do software para tornar o projeto um sucesso. Então, propõe
uma versão estendida do Extreme Programming (XP), um modelo de processo ágil, para a
46
Concluindo seu trabalho Guha (2010) explica que a computação em nuvem é uma
mudança de paradigma sobre a forma tradicional de desenvolvimento de software, pois é
preciso interagir com um novo elemento chamado provedor de nuvem. Mesmo a quantidade
de trabalho para o desenvolvimento de software diminua, haverá a crescente exigência de
comunicação e coordenação com o provedor de nuvem que faz o projeto de desenvolvimento
de software mais complexo. Com isso os modelos prevalentes devem adicionar esse novo
modo de interação com o provedor, e separar os papeis de engenheiros de software e
provedores. Essa interação pode atenuar todos os desafios de desenvolvimento de software na
plataforma de computação em nuvem e torná-la mais vantajosa no que se refere à implantação
e desenvolvimento de software na nuvem.
47
4.1 APLICAÇÃO DO XP
O método XP preza pela programação em pares, porém nesse trabalho apenas a autora
atuou na parte de desenvolvimento, por se tratar de um trabalho de conclusão de curso que é
feito por um único aluno.
Nessa etapa do projeto contamos com três stakeholders, que foram a professora
orientadora deste projeto, Delfa Huatuco, o professor Miguel Santibañez e o graduando
Gleysomar Ribeiro. O graduando utilizou esta aplicação como parte do seu projeto de
conclusão de curso com o objetivo de otimizar os requisitos, dar prioridade entre eles e
reduzir seu custo.
Para o levantamento de requisitos foram utilizadas as histórias de usuário baseadas no
método BDD. E para transformar essas histórias em testes de aceitação utilizou-se nesse
trabalho a ferramenta Cucumber. No domínio do Cucumber, o termo Funcionalidade é usado
para definir uma história de usuário com um ou mais cenários que mostram diferentes
maneiras de utilizá-la.
Ficou definido entre os stakeholders que o usuário deveria se cadastrar para ter acesso
ao sistema, então foi criada uma história para mostrar esse processo, conforme apresenta a
Figura 10.
1 scenario (1 undefined)
4 steps (4 undefined)
0m0.011s
You can implement step definitions for undefined steps with these snippets:
Quando(/^preencher o formulario$/) do
pending # Write code here that turns the phrase above into concrete actions
end
A partir daí começamos a substituir as palavras “pending”, dentro de cada bloco, pelo
código que realmente faz o que a frase em linguagem natural está dizendo. Essa é a fase na
qual realizamos a automação dos passos. O Cucumber colore os passos de amarelo para
51
mostrar que os passos ainda não foram implementados de verde para demonstrar que passou
no teste, e vermelho para erros. Para que cada passo fique verde é preciso escrever o código
da aplicação em si que faça ele passar. A partir daí o código da aplicação vai sendo escrito e o
teste sendo executado até que todos os passos fiquem verdes e o teste passe totalmente.
Para traduzir os passos em linguagem natural e implementa-los através de código
executável, utilizamos a ferramenta Capybara para simular as ações do usuário no sistema,
como clicar em links e botões, por exemplo. O Cucumber se adapta perfeitamente a essa
ferramenta, já que também foi implementada em Ruby.
A Figura 11 mostra o erro que ocorre quando se executa o Cucumber novamente. Esse
erro foi abordado no Capítulo 2, seção 2.2.5 falando sobre o método BDD. O método diz que
os testes devem ser feitos antes de qualquer codificação, desse modo o erro mostrado na
Figura 11 indica que não existe nenhuma aplicação para o Capybara visitar, então o próximo
passo é desenvolver o código que cria a aplicação, somente para fazer com que esse passo
fique verde.
O mesmo é feito para cada passo do cenário. Criamos o código que permite o usuário
se cadastrar baseado no passo seguinte. Na Listagem 05, temos a implementação dos passos
restantes e com Capybara é possível simular o usuário visitando a página e clicando no link
para se inscrever, logo em seguida preenchendo os campos do formulário e por fim
verificando se o usuário foi cadastrado com sucesso.
Quando(/^preencher o formulario$/) do
fill_in 'Email', :with => "lily@hotmail.com"
fill_in 'user_password', :with => "123456"
fill_in 'user_password_confirmation', :with => "123456"
click_button 'Cadastrar'
end
1 scenario (1 passed)
3 steps (3 passed)
0m0.427s
53
1 scenario (1 undefined)
4 steps (2 undefined, 1 passed)
0m0.426s
You can implement step definitions for undefined steps with these snippets:
Observa-se que o passo “Dado que estou na página” já se encontra verde (Figura 11).
Isso ocorre porque ele já foi testado anteriormente na funcionalidade de cadastro. No
Cucumber é possível escrever definições de passos que podem ser compartilhadas por todas
as funcionalidades, porque, por padrão ele vai carregar todos os arquivos que estiverem em
features/step_definitions toda vez que uma funcionalidade for executada, dessa forma, toda
vez que utilizamos o texto “Dado que estou na pagina”, o Cucumber não gera a definição de
passos porque ela já existe em outra funcionalidade.
55
Quando executamos, o Cucumber exibe todos os passos em verde, o que significa que
o teste passou (Listagem 08 e Figura 15).
1 scenario (1 passed)
4 steps (4 passed)
0m0.409s
1 scenario (1 undefined)
5 steps (5 undefined)
0m0.015s
You can implement step definitions for undefined steps with these snippets:
Quando(/^preencher os campos$/) do
pending # Write code here that turns the phrase above into concrete actions
end
58
Copiamos as definições de passo geradas para um arquivo .rb, e após isso usamos os
recursos do Capybara para simular o usuário interagindo com o sistema. Nos passos da
listagem 10, caso o usuário deseje adicionar um arquivo na sua base, deverá preencher os
campos de login, clicar no link ‘Artigos’, selecionar a opção ‘Novo’ para inserir um novo
artigo, onde irá aparecer a página em que ele deverá adicionar o título do arquivo, escolher
alguma pasta onde ele ficará armazenado, escolher o arquivo a ser inserido, e marcar se ele
deve ser privado ou não, salvar as alterações, e por fim deverá ver o novo artigo na lista de
artigos da página inicial.
Quando(/^preencher os campos$/) do
fill_in ‘example_name’, :with => “Aprendendo Ruby”
select(‘Ruby’, from: ‘example_folder_id’)
page.attach_file(‘example_my_file’, ‘C:\Users\Liliane\Dropbox\Ruby’)
59
click_button ‘Criar’
end
1 scenario (1 passed)
4 steps (5 passed)
0m0.015s
60
Executamos o Cucumber e ele nos trará as definições de passos que precisamos para criar
os testes, como mostra a Listagem 12 logo abaixo:
1 scenario (1 undefined)
4 steps (3 undefined, 1 passed)
0m0.017s
You can implement step definitions for undefined steps with these snippets:
Executamos o Cucumber e vemos que todos os passos estão verdes, e o teste passou,
conforme mostra a Listagem 14 e a Figura 19.
1 scenario (1 passed)
4 steps (4 passed)
0m0.015s
Executamos o Cucumber para ele gerar as definições de passos para podermos testar
essa funcionalidade, como mostra a Listagem 15.
Listagem 15. Resultado ao executar o Cucumber para um usuário criar uma pasta
cucumber features/ pasta.feature
Using the default profile...
# language: pt
Funcionalidade: Criar pasta
Como usuario
Quero criar pastas
Para eu poder organizar os arquivos inseridos
1 scenario (1 undefined)
5 steps (4 undefined, 1 passed)
0m0.024s
You can implement step definitions for undefined steps with these snippets:
end
Executamos o Cucumber e todos os passos estão verdes e o cenário para criar uma pasta
na aplicação está finalizado (Listagem 17 e Figura 21).
1 scenario (1 passed)
5 steps (5 passed)
0m0.016s
66
Para o usuário poder compartilhar seus arquivos, foi escrita uma funcionalidade que
especifica como esse processo deve ocorrer (Figura 22).
Listagem 18. Resultado ao executar o Cucumber para um usuário criar uma pasta
$ cucumber features/compartilhar.feature
Using the default profile...
# language: pt
Funcionalidade: Compartilhar pasta
Como usuario
67
1 scenario (1 undefined)
7 steps (5 undefined, 2 passed)
0m0.016s
You can implement step definitions for undefined steps with these snippets:
Listagem 19. Resultado ao executar o Cucumber para um usuário criar uma pasta
# encoding: utf-8
# !/usr/bin/env ruby
O código é escrito e o teste executado até que todos os passos estejam verdes,
significando que o teste passou. A listagem 20 e a figura 23 mostra que o teste passou e este
cenário está finalizado.
Listagem 20. Resultado ao executar o Cucumber para um usuário criar uma pasta
$ cucumber features/compartilhar.feature
Using the default profile...
# language: pt
Funcionalidade: Compartilhar pasta
Como usuario
Quero poder compartilhar pastas
Para que outro usuário também tenha acesso
1 scenario (1 passed)
7 steps (7 passed)
0m0.009s
Essas são as funcionalidades que desejamos em nossa aplicação e para cada uma delas
apresentamos um cenário, que para esse trabalho é suficiente para demonstrar o potencial do
BDD. Mais cenários podem ser escritos para expressar como gostaríamos que a aplicação
funcionasse.
A tela de cadastro (Figura 25) está no formato padrão, consiste em inserir um e-mail,
senha e confirmação da senha.
A página inicial da aplicação apresenta ao usuário uma listagem dos artigos públicos,
que são os arquivos compartilhados com qualquer usuário do sistema. Como os arquivos são
organizados em pastas, é exibida a pasta a qual ele pertence (Figura 26). No menu principal
acima.
71
Existe a opção de tornar os arquivos visíveis apenas para o usuário que o inseriu. Na aba
“artigos privados” temos a listagem dos artigos que o usuário não deseja compartilhar com outros
usuários da aplicação (Figura 27). Essa opção é definida na hora de inserir o arquivo (Figura 28).
Quando o usuário desejar inserir um arquivo, ele deve clicar em “Artigos” e escolher a
opção “Novo”. Deverá aparecer um formulário com os campos onde deve inserir um título
para o artigo, escolher a pasta onde ele deve ficar, escolher o arquivo que será armazenado e
definir se ele terá público ou privado. Se o usuário não marcar a opção privado, o arquivo será
visível para os demais usuários na aba de “Artigos Públicos” (Figura 16).
Os arquivos do usuário são organizados em pastas. Para criar uma pasta ele pode ir no
menu principal e clicar em “Pastas”, e então em “Nova”, em seguida será exibido um
formulário em que ele deve dar um nome à pasta e clicar em criar.
um novo artigo, editar a pasta, exclui-la e compartilha-la com outros usuários, conforme
mostrado na Figura (23).
4.4 CLOUD9
5 CONCLUSÃO
deveria se comportar antes mesmo que qualquer codificação. O fato de fazer com que os
testes sejam escritos antes do próprio código fez com que o esforço maior de validação e
desenvolvimento fosse na escrita do teste e não na depuração.
O Cucumber, ferramenta utilizada para a prática do BDD, apresenta uma estrutura
padrão fácil o suficiente para qualquer pessoa não técnica possa entender, pois a histórias de
usuários não se parecem com código-fonte, então são mais claras. O Cucumber ajudou tanto
no levantamento de requisitos quanto na definição dos testes de aceitação, permitindo que eles
pudessem ser executados automaticamente. Já o Capybara realizou muito bem as funções de
um usuário e seu navegador, clicando e preenchendo formulários e realmente permite que a
aplicação seja testada.
O alcance que o software como serviço tem é bastante superior ao software
tradicional, pois é rapidamente disponibilizado para milhões de usuários, fazendo com que
sua evolução também seja maior. Podemos destacar que o melhor benefício do software como
serviço seja a melhoria continua. Pois não existe uma versão final, sempre é possível
melhorar. Dessa forma, a criação de novas funcionalidades ajudam a garantir que os clientes
não abandonem a aplicação caso apareça outra semelhante.
Nesse trabalho tratamos apenas de testes de aceitação, mas podemos trabalhar outros
tipos de testes, como os unitários. Os testes unitários são importantes porque asseguram que
um procedimento ou método faça o que dele é esperado. O XP recomenda usarmos o método
TDD, através da ferramenta RSpec, para fazermos testes unitários. O TDD deve ser
trabalhado simultaneamente com o BDD.
Um recurso que tornaria a aplicação mais interessante seria permitir ao pesquisador a
inserção manual de mais informações do arquivo como a descrição, palavras-chaves, autor e
data para facilitar a identificação do mesmo. O título seria um link que quando o usuário
passar o mouse por ele poderia abrir uma janela em que ele mostraria a caixa com as
informações citadas.
Podemos sugerir também desenvolver ou pesquisar um algoritmo para automatizar as
operações acima descritas para o usuário não ter que digitar essas informações toda vez que
inserir um novo arquivo. Isso tornaria a experiência do usuário mais satisfatória.
78
Outra sugestão relevante seria utilizar técnicas da IA para o usuário realizar buscas na
web, dentro do repositório, de algum assunto que lhe interesse e armazena os resultados
escolhidos pelo usuário automaticamente no repositório.
Sugerimos também como trabalhos futuros a melhoria da interface gráfica da
aplicação.
79
REFERÊNCIAS
BECK, Kent. et al. Manifesto para Desenvolvimento Ágil de Software. Ano 2001.
Disponível em: <http://www.agilemanifesto.org/>. Acesso em: 23 de dezembro 2015.
CHELIMSKY, David. The RSpec Book. 1 ed. Dallas: The Pragmatic Bookshelf, 2010. 400p.
CRESWELL, John W.; CLARK, Vicki L. Plano. Pesquisa de Métodos Mistos. Tradução de
Magda França Lopes. 2 ed. São Paulo: Penso, 2013. 288p.
FAGUNDES, Priscila Basto. Framework para comparação e análise dos métodos ágeis.
2005. 134p. Dissertação (Mestre em Ciência da Computação) – Programa de Pós-Graduação
em Ciência da Computação, Universidade Federal de Santa Catarina, Florianópolis, 2007.
GORELIK, Eugene. Cloud Computing Models. 2013. 82p. Thesis (Master in Management
and Engineering) - Massachusetts Institute of Technology, Cambridge, Massachusetts, EUA,
2013.
JAKONEN, Markus. When to Utilize Software as a Service. 2011. 121p. Thesis (Master in
Technology) - University Of Turku, Finland, 2011.
MERIAT, Vitor. Modelos de Serviço na Nuvem: IaaS, PaaS e Saas. Disponível em: <
http://www.vitormeriat.com.br/2011/07/08/modelos-de-servio-na-nuvem-iaas-paas-e-saas/>.
Acesso em: 10 de novembo de 2015.
RIBEIRO, Camilo. Entendendo BDD com Cucumber. 2012. Disponível em: <
http://www.bugbang.com.br/entendendo-bdd-com-cucumber-parte-i/>. Acesso em: 25 de
março de 2016.