UNIVERSIDADE VEIGA DE ALMEIDA BACHARELADO EM SISTEMAS DE INFORMAÇÃO INTRODUÇÃO A TESTES AUTOMATIZADOS EM RUBY ON RAILS. Thiago Cifani Ayres Escola



Documentos relacionados
O CONCEITO DE TDD NO DESENVOLVIMENTO DE SOFTWARE

DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES

4 O Workflow e a Máquina de Regras

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

Começando com Ruby on

Orientação a Objetos

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP

10 DICAS DE TECNOLOGIA PARA AUMENTAR SUA PRODUTIVIDADE NO TRABALHO

ABORDAGEM DE FRAMEWORKS PARA JSF QUE AUXILIAM O DESENVOLVIMENTO DE SOFTWARE

ENGENHARIA DE SOFTWARE I

Ambiente Web PHP Problemas Frameworks CakePHP Symfony Zend Framework Prado CodeIgniter Demonstração O livro

Lazarus pelo SVN Linux/Windows

Noções de. Microsoft SQL Server. Microsoft SQL Server

Ambiente Web PHP Problemas Frameworks CakePHP Symfony Zend Framework Prado CodeIgniter Demonstração

Processos Técnicos - Aulas 4 e 5

PROGRAMAÇÃO AVANÇADA -CONCEITOS DE ORIENTAÇÃO A OBJETOS. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Sistema Gerador de Anúncios para Compra e Venda On-line. Leandro de Oliveira ol.leandro@gmail.com

Feature-Driven Development

TESTES AUTOMATIZADOS COM JUNITE MOCKITO

APLICATIVO WEB PARA O SETOR DE EXTENSÃO IFC VIDEIRA

Sistemas Distribuídos

Figura 1 - Arquitetura multi-camadas do SIE

Metodologia e Gerenciamento do Projeto na Fábrica de Software v.2

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Programação de Computadores - I. Profª Beatriz Profº Israel

Desenvolvendo Websites com PHP

Guia Site Empresarial

Uma Abordagem sobre Mapeamento Objeto Relacional com Hibernate

Lógica de Programação

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

Aplicação Prática de Lua para Web

Dadas a base e a altura de um triangulo, determinar sua área.

Lógica de Programação

SISTEMA DE GERENCIAMENTO DE PROJETOS - REDMINE MANUAL DE USO

AUTOR: DAVID DE MIRANDA RODRIGUES CONTATO: CURSO FIC DE PROGRAMADOR WEB VERSÃO: 1.0

Manual SAGe Versão 1.2 (a partir da versão )

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi

Boas Práticas de Desenvolvimento Seguro

INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO

Alterações Easycaptive

Programação Orientada a Objetos Herança Técnico em Informática. Prof. Marcos André Pisching, M.Sc.

MÓDULO 9 METODOLOGIAS DE DESENVOLVIMENTO DE SISTEMAS

Distribuidor de Mobilidade GUIA OUTSOURCING

ROTEIRO PARA ELABORAÇÃO DE PROJETOS

Entrar neste site/arquivo e estudar esse aplicativo Prof. Ricardo César de Carvalho

Centro Universitário Metodista Benne1 Rio de Janeiro, Dezembro de Rafael Polo e Sabrina Arêas

Parte I. Demoiselle Mail

Engenharia de Software III

Modelagemde Software Orientadaa Objetos com UML

MANIFESTO ÁGIL. Esses conceitos aproximam-se melhor com a forma que pequenas e médias organizações trabalham e respondem à mudanças.

Projeto Você pede, eu registro.

ISO/IEC 12207: Gerência de Configuração

Como se tornar um desenvolvedor de plug-ins para AutoCAD e Revit

Sphinx Scanner Informações gerais V

2 Diagrama de Caso de Uso

Tópicos de Ambiente Web. Modulo 2 Processo de desenvolvimento de um site Professora: Sheila Cáceres

XP extreme Programming, uma metodologia ágil para desenvolvimento de software. Equipe WEB Cercomp

PROPOSTA DE SOFTWARE DE INSTALAÇÃO PARA UM AMBIENTE INTEGRADO DE GERÊNCIA DE PROJETOS E DE PROCESSOS DE NEGÓCIOS

PEN - Processo de Entendimento das Necessidades de Negócio Versão 1.4.0

Pós-Graduação em Gerenciamento de Projetos práticas do PMI

Operador de Computador. Informática Básica

Desenvolvendo Software Livre com Programação extrema

Capacidade = 512 x 300 x x 2 x 5 = ,72 GB

1. NÍVEL CONVENCIONAL DE MÁQUINA

UNIVERSIDADE FEDERAL DO PARANÁ UFPR Bacharelado em Ciência da Computação

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza

PROCESSO DE DESENVOLVIMENTO DE SOFTWARE. Modelos de Processo de Desenvolvimento de Software

Na tela dele, clique no sinal de + ao lado do nome do seu computador, para expandi-lo. A seguir, expanda também o item "Sites da web".

UML - Unified Modeling Language

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

Desenvolvendo para WEB

Engenharia de Requisitos Estudo de Caso

Bem- Vindo ao manual de instruções do ECO Editor de COnteúdo.

TRABALHO DE DIPLOMAÇÃO Regime Modular ORIENTAÇÕES SOBRE O ROTEIRO DO PROJETO FINAL DE SISTEMAS DE INFORMAÇÕES

Conteúdo. Disciplina: INF Engenharia de Software. Monalessa Perini Barcellos. Centro Tecnológico. Universidade Federal do Espírito Santo

Construtor de sites SoftPixel GUIA RÁPIDO - 1 -

2. O AMBIENTE DE PROGRAMAÇÃO EM C

Engenharia de Software II

UNIVERSIDADE FEDERAL DO PARANÁ UFPR Bacharelado em Ciência da Computação

agility made possible

Introdução a Banco de Dados

Desenvolvendo plugins WordPress usando Orientação a Objetos

Curso Técnico em Redes

Nome: Login: CA: Cidade: UF CARTÃO RESPOSTA QUESTÃO RESPOSTA QUESTÃO RESPOSTA

Prevayler. Perola. André Luís Sales de Moraes Juliana Keiko Yamaguchi Tatiana Yuka Takaki

Desenvolvimento de aplicação web com framework JavaServer Faces e Hibernate

Dicas para usar melhor o Word 2007

FLUXO DE CAIXA: Módulo BI (Business Intelligence)

UFG - Instituto de Informática

Disciplina de Banco de Dados Introdução

Na medida em que se cria um produto, o sistema de software, que será usado e mantido, nos aproximamos da engenharia.

Documento de Análise e Projeto VideoSystem

1. Quem somos nós? A AGI Soluções nasceu em Belo Horizonte (BH), com a simples missão de entregar serviços de TI de forma rápida e com alta qualidade.

MANUAL DO USUÁRIO SORE Sistema Online de Reservas de Equipamento. Toledo PR. Versão Atualização 26/01/2009 Depto de TI - FASUL Página 1

INTRODUÇÃO E CONFIGURAÇÃO DO PRIMEFACES MOBILE EM APLICAÇÕES JSF

MAPEAMENTO OBJETO RELACIONAL: UM ESTUDO DE CASO

Software automatizado para controle de consultas da clínica de fisioterapia

Referências internas são os artefatos usados para ajudar na elaboração do PT tais como:

Transcrição:

UNIVERSIDADE VEIGA DE ALMEIDA BACHARELADO EM SISTEMAS DE INFORMAÇÃO INTRODUÇÃO A TESTES AUTOMATIZADOS EM RUBY ON RAILS Thiago Cifani Ayres Escola Cabo Frio 2011

THIAGO CIFANI AYRES ESCOLA INTRODUÇÃO A TESTES AUTOMATIZADOS EM RUBY ON RAILS Trabalho desenvolvido durante a disciplina Monografia e apresentada ao Curso de Sistemas de Informação da Universidade Veiga de Almeida, campus Cabo Frio, como prérequisito para a obtenção do título de Bacharel em Sistemas de Informação. Orientador: Prof. Matheus Bousquet Bandini, M.Sc. Campus Cabo Frio 2011

Universidade Veiga de Almeida - UVA Faculdade de Informática Curso de Bacharelado em Sistemas de Informação Reitor: Prof. Dr. Mário Veiga de Almeida Jr. Vice-Reitor: Prof. Tarquínio Prisco Lemos da Silva Coordenador do Curso de Informática: Prof. Edgar Banca Examinadora: Prof. Matheus Bousquet Bandini (Orientador) M.Sc. em Sistemas e Computação IME/RJ Prof. Douglas Ericson Marcelino de Oliveira M.Sc. em Sistemas e Computação IME/RJ Prof. Rodrigo Lessa de Sena Especialista em Computação Gráfica - UVA Universidade Veiga de Almeida Cabo Frio Estrada das Perynas, s/n CEP: 28901-970 - Cabo Frio RJ

Dedico este trabalho a Arnaldo, Rose, Priscilla e Elaine.

AGRADECIMENTOS Agradeço a meus pais, família, amigos e professores. Agradeço todas estas pessoas que se fizeram presentes e ocuparam com excelência o devido papel em minha vida. Agradeço pelo carinho, respeito, dedicação e incentivo para continuar mesmo com todos os atenuantes da vida.

LISTA DE FIGURAS Figura 3.1 Modelo MVC Rails... 23 Figura 3.2 Código Rails para Localizar Cliente por ID... 24 Figura 3.3 Exemplo de uso do Active Record... 25 Figura 4.1 Exemplo de Estrutura de Teste Unitário... 29 Figura 4.2 Teste Unitário com Asserção... 29 Figura 4.3 Teste Unitário com Assert Equals... 30 Figura 4.4 Teste Unitário com Assert Not Equal... 30 Figura 4.5 Exemplo de Repetição de Código em Teste Unitário... 31 Figura 4.6 Exemplo de Método Setup... 32 Figura 4.7 Ciclo do TDD... 36 Figura 4.8 Exemplo de Describe com RSpec... 39 Figura 4.9 Exemplo de Describe com Context e IT... 39 Figura 4.10 Exemplo de Saída Formatada do RSpec... 39 Figura 4.11 Exemplo de Teste RSpec Pente... 40 Figura 4.12 Saída RSpec Teste Pente... 40 Figura 4.13 Teste RSpec pente com mensagem personalizada... 41 Figura 4.14 Teste RSpec com It para descrever comportamento... 41 Figura 4.15 Teste RSpec Let e Specify... 42 Figura 4.16 Teste Exemplo cenário com cucumber... 43 Figura 5.1 GemFile para Testes... 47 Figura 5.2 Comandos Instalação... 48 Figura 5.3 Team Feature... 48 Figura 5.4 Team Steps Pentes... 49 Figura 5.5 Team Steps... 49 Figura 5.6 Controlador Team... 50 Figura 5.7 team_spec.rb... 50 Figura 5.8 Team model... 51

LISTA DE ABREVIATURAS E SIGLAS API BDD CoC DRY DSL ERB HTML IDE JVM MRI MVC RoR SAAS SSH SVN TDD URL VPS YAML YARV XP Application Programming Interface Behavior Driven Development Convention Over Configuration Don't Repeat Yourself Domain Specific Language Embedded Ruby Hyper Text Markup Language Integrated Development Environment Java Virtual Machine Matz's Ruby Interpreter Model View Controller Ruby on Rails Software as a Service Secure Shell Subversion Test Driven Development Uniform Resource Locator Virtual Private Server YAML Ain t Markup Language Yet another Ruby VM Extreme Programming

RESUMO Este trabalho apresenta as formas de desenvolvimento de software baseado em testes automatizados em Ruby on Rails como tecnologia para desenvolvimento de aplicações para a Internet. São demonstrados suas principais características e componentes. Também são exibidos diversos frameworks que facilitam a elaboração de testes e gems relacionadas. Por fim, uma pequena suíte de testes é desenvolvida, de forma a exemplificar a utilização dos recursos apresentados. Através da análise das características da ferramenta e dos resultados obtidos no estudo de caso é respondida a razão do Ruby on Rails ser uma plataforma que cumpre com sucesso sua proposta de simplicidade e agilidade.

ABSTRACT This paper presents the ways of developing software-based automated tests in Ruby on Rails as the technology to develop applications for the Internet. Showing us the main characteristics and components. Also displayed are several frameworks that facilitate the development of tests and related gems. Finally, a small tests suite is developed in order to illustrate the use of appeals. By analyzing the characteristics of the tool and the results obtained in the study case, is answered the reason for Ruby on Rails to be a platform that successfully fulfills its proposal of simplicity and agility.

SUMÁRIO 1 INTRODUÇÃO... 12 1.1 CONTEXTUALIZAÇÃO... 12 1.2 PROBLEMA... 12 1.3 HIPÓTESE... 12 1.4 OBJETIVO... 13 1.5 JUSTIFICATIVA... 13 1.6 METODOLOGIA DE PESQUISA... 13 1.7 ORGANIZAÇÃO DO TEXTO... 13 2 HISTÓRICO... 15 2.1 O COMPUTADOR... 15 2.2 LINGUAGENS DE PROGRAMAÇÃO... 15 2.3 MANIFESTO ÁGIL... 16 3 TECNOLOGIAS ENVOLVIDAS... 19 3.1 RUBY... 19 3.1.1 RubyGems... 21 3.1.2 RVM... 21 3.2 RAILS... 21 3.2.1 Padrão MVC... 22 3.2.2 Suporte a Modelo no Rails... 24 3.2.2.1 Mapeamento Objeto Relacional... 24 3.2.2.2 Active Record... 25 3.2.3 Action Pack: Visualização e Controlador... 25 3.2.3.1 Suporte a Visualização... 26 3.2.3.2 Controlador... 26 4 TESTES AUTOMATIZADOS... 27 4.1 TESTES EM RUBY ON RAILS... 28 4.1.1 Setup e TearDown... 31 4.1.2 O que pode ser testado em Rails... 32 4.1.3 Fixtures... 34

4.2 TEST DRIVEN DEVELOPMENT... 34 4.3 BEHAVIOR DRIVEN DEVELOPMENT... 36 4.3.1 Os Princípios do BDD... 37 4.4 RSPEC... 38 4.4.1 Descrevo Comportamentos... 38 4.4.2 Exemplos Pentes... 40 4.4.3 Before, After, Specify, Let... 41 4.5 CUCUMBER... 42 5 ESTUDO DE CASO... 45 5.1 AMBIENTAÇÃO... 45 5.2 PROERD... 45 5.2.1 Origem... 45 5.2.2 Propósito... 46 5.3 OBJETIVO... 46 5.4 IMPLEMENTAÇÃO... 47 5.4.1 Ferramentas... 47 5.4.2 Testes com Rspec e Cucumber... 47 6 CONSIDERAÇÕES FINAIS... 52 6.1 CONCLUSÕES... 53 ANEXO A CÓDIGO FONTE TESTES... 54 REFERÊNCIAS BIBLIOGRÁFICAS... 65 12

1. INTRODUÇÃO 1.1 Contextualização Atualmente o desenvolvimento de software tem crescido em larga escala no Brasil e no mundo. Com a popularização da internet e dos smartsfones, desenvolver software tornou-se uma forma de adquirir conhecimento e ra. Mas com o grande aumento de profissionais na área, observou-se a necessidade de elaborar padrões de especificação para o desenvolvimento desses aplicativos. Para facilitar o trabalho das equipes na elaboração e implementação do projeto, são tomadas boas práticas para desenvolver software funcional e legível, uma das mais importantes práticas adotadas para essa facilitação são os testes automatizados. 1.2 Problema A grande dificuldade que as empresas de software enfrentam nos dias de hoje é a manutenção do sistema em produção. Sabe-se que necessidades surgem a todo instante, e que para o desenvolvedor, lembrar do código criado a algum tempo não é uma tarefa fácil. O problema dessa deficiência torna a manutenção do código quase inviável. O rodízio de profissionais em equipes também torna a padronização do código algo de difícil administração. Devido a essas dificuldades, foram criados frameworks para facilitar o processo de criação e manutenção do código fonte, otimizando todo o processo e garantido o retorno esperado do mesmo. 1.3 Hipótese O ambiente de testes automatizados em Ruby On Rails, foco do trabalho, é um conjunto de ferramentas integradas que visam tornar o desenvolvimento de aplicações web simples e rápido. Esse ambiente visa cobrir o software com testes que garantem que determinada funcionalidade foi implementada com êxito e executa sua função da melhor forma esperada. Os testes automatizados também visão auxiliar o desenvolvimento através de redução na complexidade do código, o que facilitaria a manutenção futura. Através dos testes, pode ser feita uma leitura de cada método do sistema em questão e enter seu comportamento por completo. A maioria dos testes auxilia o programador a enter a regra de negócio e programá-la da melhor maneira possível. 13

1.4 Objetivo O objetivo desta pesquisa é apresentar o ambiente de Testes Automatizados em Ruby on Rails. Seus benefícios e usos serão explicados ao decorrer do trabalho. Será respondido ao longo deste trabalho o que é teste automatizado, TDD e BDD. Serão explicadas as suas principais características, componentes e seu funcionamento. Ao final, será apresentado um projeto construído utilizando Ruby on Rails de forma a validar a proposta dos testes automatizados. 1.5 Justificativa Ao adotar o padrão ágil de desenvolvimento que prioriza um produto de qualidade e um total contato com o cliente, o desenvolvedor se depara com um cenário onde existem mudanças constantes. Essas mudanças podem prejudicar a qualidade do código exponencialmente se não trabalhada de uma forma a facilitar seu entimento. Com testes automatizados, qualquer desenvolvedor que enta teste poderá determinar perfeitamente o comportamento da aplicação e de seus métodos. Com eles também é possível afirmar que quando uma funcionalidade é terminada realmente está terminada. Os testes facilitam a escrita do código, facilita a interação da equipe e torna o sistema mais resistente a falhas e bugs. 1.6 Metodologia de Pesquisa Foram utilizados livros especializados no assunto como fontes de pesquisa, documentos produzidos pela comunidade que desenvolve a plataforma Ruby On Rails, além de sites na internet. 1.7 Organização do Texto O texto está organizado em 6 capítulos. O Capítulo 2 mostra a evolução das tecnologias que culminaram com o surgimento de aplicações na Internet, linguagens de programação e o Manifesto Ágil. O Capítulo 3 apresenta a linguagem de programação Ruby, suas origens e ideais. Introduzirá o framework Ruby On Rails seus componentes e principais características. O Capítulo 4 apresenta 14

testes automatizados em Ruby On Rails, TDD, BDD e o uso de dois frameworks muito utilizados na comunidade para determinar o comportamento da aplicação e fazer teste de integração. O capítulo 5 procura demonstrar a utilização dos conceitos apresentados através do desenvolvimento de um sistema baseado na plataforma Ruby On Rails. As considerações finais sobre o projeto de estudo deste texto se encontram no Capítulo 6. 15

2. HISTÓRICO 2.1 O Computador Pode-se considerar o computador como uma das grandes descobertas da humanidade. Temse hoje o computador como uma ferramenta essencial no dia a dia de muitas empresas e indústrias. Seu principal papel é o processamento de dados, sabe-se que os dados que são inseridos passam por um processamento e armazenagem, o que permite a análise e compreensão de uma larga escala de informação em poucos segundos. Na década de 40, os computadores eram gigantescos e ocupavam grande espaço físico, eram utilizados principalmente para pesquisas científicas e operações militares. Os computadores dessa década tinham programas específicos para cada área de atuação e eram usados somente por especialistas. Com o passar das décadas e a grande quantidade de informação a serem processadas, as empresas foram motivadas a expandir o uso dos computadores. Com isso, passaram a fabricar computadores com tamanhos reduzidos e com um poder de processamento maior. Existiam terminais de acesso a grandes mainframes, estes, gerenciavam todos os aplicativos e efetuavam o processamento dos dados. Devido à popularização dos computadores nas empresas, notou-se uma grande possibilidade de expandir o mesmo para a utilização doméstica, o que proporcionou um maior contato do usuário leigo e o surgimento de programas personalizados para ater diversas necessidades que surgiriam com o tempo. Atualmente, com o crescimento da demanda por computadores e dispositivos portáteis de acesso a internet e a aplicativos, os smartfones e tecnologias móveis tem tomado uma grande fatia do mercado tecnológico para utilização e resolução de problemas rotineiros. 2.2 Linguagem de Programação Uma linguagem de programação é um conjunto de instruções que são lidas por uma máquina para efetuar algum processamento, ou seja, este conjunto de instruções forma o programa de computador. A linguagem permite que o programador controle o comportamento do programa e as decisões do computador de acordo com uma série de blocos de códigos e estruturas que permitem a tomada de decisões pela máquina. 16

O conjunto de instruções que são digitadas no computador compõem o que é chamado de código fonte de um software. O que será compilado e transformado em linguagem de máquina para que o processador venha a enter. A principal motivação para utilizar uma linguagem de programação para a elaboração de um software é a produtividade. A maioria das linguagens de programação eleva o nível da programação utilizando sintaxe e conceitos mais próximos da linguagem humana. As primeiras linguagens de programação surgiram na década de 50, so como principais daquela época, FORTRAN, LISP, COBOL. Na década de 70 as linguagens que começaram a aparecer foram, Pascal, SQL e C, então começou a debater-se sobre a criação de linguagens estruturadas. Programação estruturada é a programação onde é utilizado um fluxo para a execução do código escrito, ao contrário das linguagens que utilizavam o famoso GOTO para levar a diversas partes do código, a programação estruturada segue um bloco de código com várias funções e subrotinas que seguidas estruturalmente processam as informações de acordo com as condições impostas pelo desenvolvedor. Um pouco mais tarde foi criada a programação orientada a objetos. A orientação a objetos visa determinar escopos reduzidos para a construção dos blocos de código, facilitando assim o entimento do programa e sua real função e fluxo de troca de mensagens. Esse paradigma visa à modelagem de objetos do mundo real, agregando a eles comportamentos semelhantes no contexto da aplicação. A comunicação entre os objetos é feita através de mensagens entre os métodos. As linguagens que inspiraram a orientação a objetos foram o C++ e o Perl. Na década de 90 houve o surgimento do Java, Python e C#. A maioria dessas linguagens era direcionada a web, devido à popularização da internet no mundo e a necessidade de aplicações para internet. Uma peculiaridade da era da internet, foi o surgimento de linguagens de script, como PHP, Ruby e JavaScript. 2.3 Manifesto Ágil Com o aumento exponencial do uso de computadores por empresas e indivíduos, a necessidade de produzir software tornou-se algo vital para a humanidade. Várias empresas começaram a ser formadas ao redor do globo, desenvolvo de formas distintas. Com a necessidade de mão de obra e padronização na produção, áreas da computação foram surgindo, tais como a Engenharia de Software. Portanto, foram elaborados alguns modelos para especificar o desenvolvimento de sistemas, dos quais se destaca o modelo cascata ou seqüencial, que visa à construção do software por etapas pré-determinadas. 17

Ao longo dos anos, alguns desenvolvedores perceberam que a forma de trabalhar não estava correta, ou seja, as questões de levantamento de requisito antes e codificação depois de preencher papéis de documentação não se encaixavam na realidade do mercado. Esses, mais conhecidos como signatários, elaboraram o manifesto ágil, que determina algumas prioridades na elaboração do software no mundo real. Esse manifesto visa reforçar as boas práticas para desenvolvimento apontando o modelo a ser seguido num projeto. Nesse manifesto temos quatro valores principais: Os indivíduos e suas interações acima de procedimentos e ferramentas O funcionamento do software acima de documentação abrangente A colaboração dos clientes acima da negociação de contratos A capacidade de resposta às mudanças acima de um plano pré-estabelecido O que foi observado com esses valores principais, é que o processo clássico para elaboração de um projeto de software era engessado por partes vitais e seqüenciais, ou seja, se alguma das partes não fosse completada a tempo, o projeto ficava congelado esperando liberação de tal parte. Já o manifesto ágil prega uma interação constante com o cliente para ter feedback das funcionalidades implementadas, o produto so posto em produção antes mesmo de uma extensa documentação, e outros valores que vem melhorando a forma de desenvolver software atualmente. A agilidade nos projetos não implica na velocidade do desenvolvimento e sim nos curtos períodos de tempo que o produto leva para ser entregue, ou seja, têm-se entregas semanais dos produtos, para saber se tal funcionalidade ate a necessidade do cliente. A busca por simplicidade no código e qualidade técnica também são fatores abordados pelo manifesto ágil. A partir dele, alguns dos signatários ganharam notoriedade no meio do mundo do desenvolvimento, dentre eles podemos ressaltar Kent Beck, o criador do XP (BECK, 99). A técnica do XP é utilizada para agilizar o processo de desenvolvimento e reduzir a complexidade do código criado pelo desenvolvedor através de boas práticas, so elas: Testes automatizados Programação em Par Refatoração Com os testes é possível afirmar que o código elaborado realmente faz o que ele se propõe a fazer. A programação em par visa à qualidade do software e o aprizado com duas pessoas 18

programando juntas uma funcionalidade. E a refatoração é o ato de sempre melhorar o código uma vez criado. Refatoração ajuda você a fazer código mais legível. Quando estamos refatorando, vemos código que funciona, mas ainda não está totalmente estruturado. Um pouco de tempo gasto com refatoração pode fazer o código ser auto-explicativo. Programar dessa forma é sempre querer mostrar o que aquilo significa pra você. [FOWL 99, p. 48] 19

3. TECNOLOGIAS ENVOLVIDAS 3.1 Ruby Antigamente, a forma de diferenciar uma linguagem era fácil: haviam apenas a compilada, como C ou Fortran, ou a interpretada, como BASIC. Sabe-se que linguagens compiladas dão velocidade e acesso de baixo nível em computadores. Já as interpretadas são de alto nível, porém mais lentas. O tempo se passou e alguns designers de linguagem começaram a chamar suas criações de Linguagem de Script. Isso significa que essas linguagens, além de serem interpretadas, podiam ser usadas para substituir arquivos batch e shell scripts, manipulando o comportamento de outros programas e algumas funções do sistema operacional. Dentre as linguagens de Script podemos citar: Python, Perl, TCL e Ruby. [THOM, 04] Ruby é uma linguagem de script com uma tipagem dinâmica, forte e gerenciamento de memória automático. É fácil de aprer. Tarefas diárias são simples de codificar e, uma vez to as criado, é fácil mantê-las e expandí-las. É uma linguagem transparente, porque não existem partes obscuras na escrita do código, por outro lado, esse é muito legível e torna o entimento fácil para o programador. A dificuldade que o programador tem em outras linguagens para expressar o pensamento lógico, não existe em Ruby. Pela facilidade que há em escrever código em Ruby, podemos nos preocupar apenas com as regras de negócio do escopo do software e com alguns padrões de manutenção e melhorias constantes. Com a facilidade na leitura do código digitado, o risco de errar ou escrever código com comportamento duvidoso é quase nula. Ruby é uma linguagem concebida pelo intelecto de um homem através dos pontos positivos de diversas linguagens. Yukihiro Matsumoto, mais conhecido na comunidade como Matz, pegou os pontos principais de diversas linguagens como, ADA, LISP, Smalltalk, Python, Perl, e incorporou no núcleo da linguagem. [FLAN, 08] Pode-se ressaltar que Ruby é fortemente orientada a objetos, ou seja, tudo é um objeto. Outro aspecto importante é que esta linguagem possui uma poderosa capacidade de metaprogramação. Matz se preocupou em fazer uma linguagem que realmente fosse amiga do programador, tornando seu trabalho diário divertido. Em suas próprias palavras ele dizia: Ruby is designed to make programmers happy (Ruby é projetada para fazer os programadores felizes) [MATZ]. 20

Ruby é uma linguagem orientada a objetos genuína. Tudo que é manipulado é um objeto e os resultados dessa manipulação também são objetos. [THOM 04, p.09] A primeira publicação de Ruby, a versão 0.95, foi lançada em dezembro de 1995. O primeiro livro sobre a linguagem fora do Japão foi impresso somente em 2000. A versão da linguagem amplamente utilizada hoje é a 1.8. Em 30 de janeiro de 2009 a versão 1.9.1 foi introduzida, incorporando novas características e melhorias, principalmente no que diz respeito ao desempenho. Ruby, até sua versão 1.8, tinha apenas duas principais implementações. A primeira e mais comum é a MRI (Matz s Ruby Interpreter), interpretador do próprio Matsumoto. A segunda é chamada JRuby, e roda o código ruby dentro da JVM (Java Virtual Machine). A partir da versão 1.9 uma nova máquina virtual é utilizada, o YARV (Yet another Ruby VM), uma máquina virtual que interpreta byte code visando aumentar a velocidade de programas em Ruby. 3.1.2 RubyGems RubyGems é um gerenciador de pacotes para a linguagem de programação Ruby. Uma gem é um conjunto de códigos reutilizáveis que podem ser distribuídos num formato muito parecido com o repositório apt-get do Linux. O interessante na utilização de gems é o padrão imposto na elaboração da mesma e seu controle de versões. RubyGems é um framework de instalação e empacotamento para bibliotecas e aplicativos, facilitando a localização, instalação, atualização e desinstalação de pacotes Ruby. (THOM 04, p. 203) Para instalar uma gem no Ruby, basta digitar o seguinte comando: gem install nomedagem 21

3.1.3 RVM Ruby Version Manager RVM é um gerenciador de controle de versão para a linguagem Ruby que permite ao desenvolvedor ter várias versões da linguagem instaladas na mesma máquina. Antes da criação do RVM era difícil e conflitante utilizar versões diferentes do Ruby com gems diferentes e alternar de acordo com cada projeto. Já com o uso da RVM basta digitar: rvm use versaodoruby, para utilizar a versão especificada. Com o RVM é possível ter várias versões de Ruby instalados na máquina e várias gems dentro de cada versão, o que facilita bastante na hora de desenvolver um projeto, bem como contribui na questão da compatibilidade entre sistemas desenvolvidos com versões distintas. 3.2 Rails Com a popularização do desenvolvimento web e com as práticas ágeis so incorporadas nas empresas em todo o mundo, a maioria dos desenvolvedores passaram a reaproveitar código para evitar a repetição na hora de iniciar um novo projeto e ter que configurar todos os diretórios, pastas, banco de dados e ambiente. A partir do momento que a reutilização de código tornou-se uma tarefa quase que obrigatória na área de desenvolvimento, foram surgindo os frameworks para abstração de camadas mais complexas de programação e para reuso do código usado em projetos. Uma façanha que a orientação a objetos conseguiu obter foi à estruturação de blocos de códigos imensos, em pequenas classes especialistas. Alguns conceitos como Herança, Polimorfismo e Interfaces auxiliam o desenvolvedor a estruturar melhor o seu código e fazê-lo sem muitas linhas em um único arquivo. Pensando assim, surgiu o Ruby on Rails. David Heinemeier Hansson (DHH), o criador do Rails, cansado de utilizar códigos gigantescos, como Java e PHP, resolveu utilizar alguma linguagem nova que atesse sua necessidade naquele momento. Ele então, ao iniciar seu projeto intitulado BaseCamp, na 37 Signals, empresa na qual ele foi contratado como programador, começou a preparar seu ambiente de desenvolvimento, fazo classes genéricas, abusando da orientação a objetos e da linguagem Ruby, que permitia o uso intenso deste paradigma.[ruby, 11] Rails foi lançado em 2005 para uso pela comunidade como open source, o que permitiu sua constante melhora e adição de funcionalidades por um grupo intitulado CORE TEAM e por outros desenvolvedores. 22

ROR (Ruby On Rails) tem como objetivo facilitar o desenvolvimento de aplicações web. É um framework que facilita a elaboração de aplicativos e torna fácil a manutenção devido a alguns princípios de qualidade de software. O primeiro princípio, Convention Over Configuration (CoC), diz que o programador que seguir algumas convenções terá rapidamente sua aplicação rodando com o mínimo de complexidade. Programadores Java que já passaram por problemas de depências, configurações de XML (extensible Markup Language), banco de dados e servidores, podem facilmente migrar para ROR e ver o quanto de configuração é encapsulada. Rails prioriza indivíduos e interações. Não existem ferramentas pesadas, configurações complexas e processos elaborados. [RUBY, 2011, p21] Rails também possui o princípio de DRY (Don t Repeat Yourself), ou seja, deve-se apenas ter código no lugar onde aquele código destina-se a ser usado. Não se deve repetir o código gerado em outros lugares. Se esse código é usado em vários locais, deve-se torná-lo genérico e de acesso múltiplo a várias classes. DHH quando criou o Rails fez pensando de forma ágil e dentro de alguns padrões de projeto. Uma característica que confirma essa afirmação é a criação de três ambientes de execução, Production (Produção), Development (Desenvolvimento) e Test (teste). Como se sabe, uma aplicação em produção tem toda uma particularidade, assim como nos outros ambientes. Em Java, é necessário sempre que feita uma modificação, reiniciar o servidor e iniciar o mesmo para visualizar a modificação efetuada. Já no ROR tem-se como utilizar o ambiente de desenvolvimento e simplesmente atualizar o navegador para visualizar a modificação efetuada no código. Ratificando o uso de metodologias ágeis, o ambiente de teste fora criado para facilitar a execução de suítes de testes e configuração de algumas peculiaridades como seed de banco de dados, fixtures, etc. E o último conceito, o KISS (Keep it Simple Stupid) visa manter o código criado na forma mais simples possível, permitindo que qualquer desenvolvedor enta o que o mesmo faz, e reforçando o uso de refatoração no código criado. 3.2.1 Padrão MVC Em 1979, Trygve Reenskaug desenvolveu uma nova arquitetura para desenvolver aplicações interativas. Na sua concepção, as aplicações eram distribuídas em três partes: Modelo, Visualização e Controlador. [RUBY, 11] 23

O modelo é responsável por manter o estado da aplicação. O modelo quase não tem contato com o usuário, ele é responsável pelo armazenamento da informação na base de dados. Representa também a entidade no sistema a ser desenvolvido e mantém em si, toda a regra de negócio da aplicação. Um modelo é mais que apenas dados. Ele agrega todas as regras de negócio que se aplica aos dados. [RUBY, 2011, p. 51] A visualização é responsável pela apresentação dos dados obtidos pelo modelo, gerando assim a interface. Sabe-se que essa interface pode ser representada de diversas formas para o mesmo modelo, depo assim da necessidade do usuário. O controlador como o próprio nome já diz, controla toda interação do usuário com o sistema e qual visualização o mesmo vai obter, ou seja, ele orquestra o modelo, e a visualização deste, e as entradas de dados do usuário. É através do controlador que podemos buscar adicionar e localizar dados no sistema. Ruby on Rails é um framework MVC. Ao criar uma aplicação Rails, pode-se observar que o framework cria automaticamente os diretórios para os controladores, as visualizações e os modelos. So assim, o Rails consegue interpretar todo o código adicionado nos três locais, respeitando o conceito de MVC e deixando a aplicação mais fácil de ser mantida. Figura 3.1 - Fonte: Modelo MVC Rails, http://wiki.cercomp.ufg.br/equipe_web/ror/mvc, 2011 24

3.2.2 Suporte a Modelo no Rails O objetivo principal do Rails é proporcionar aos desenvolvedores para web que utilizam o padrão MVC a possibilidade de armazenar dados no banco de dados através da própria aplicação. Ele trata cada modelo criado através do framework como uma entidade, e através dessa convenção nota-se que o Rails cria automaticamente a tabela no banco de dados para receber os respectivos dados e seus relacionamentos caso existam. O problema em trabalhar com uma linguagem de programação orientada a objetos e um banco de dados relacional já é conhecido, devido à complexidade em questão. É correto afirmar que objetos possuem dados e métodos. Em contrapartida, bancos de dados são somente linhas e colunas com conjunto de valores. O mapeamento objeto-relacional sempre foi uma tarefa difícil de ser implementada, até mesmo em outras linguagens. Devido a essa dificuldade, alguns desenvolvedores começaram a estudar padrões de mapeamento objeto-relacional, o que permitia a comunicação e modelagem dos objetos em colunas do banco de dados. Essas bibliotecas que fazem essa comunicação são conhecidas como ORM s (Object-Relational Mapping). 3.2.2.1 Mapeamento Objeto-Relacional Bibliotecas de Mapeamento Objeto-Relacional mapeiam as tabelas do banco de dados em classes. Por exemplo, se existe uma tabela chamada cliente, deve existir uma classe chamada cliente. Os objetos clientes correspondem a linhas na tabela e seus atributos a colunas da mesma. Cada objeto tem métodos get e set para preenchê-lo com os dados das colunas. Rails, em específico, traz métodos que auxiliam a manipular os dados vindos do banco de dados. Por exemplo, é possível observar nesse código Ruby a complexidade SQL que foi omitida para achar um cliente por seu código: cliente = Cliente.find(1) Figura 3.2 Código Rails para localizar Cliente por id 25

Em resumo, uma camada de Mapeamento Objeto-relacional mapeia tabelas para classes, linhas para objetos e colunas para atributos desse objeto. Geralmente, para que esse processo ocorra, é necessário utilizar arquivos XML para fazer o relacionamento dos campos. Porém, com a Convenção sobre a Configuração do Rails, o processo é automático. 3.2.2.2 Active Record Active Record (AR) é a camada ORM que vem com o Rails. Ele segue estritamente o padrão dos ORM s tradicionais, porém, uma das grandes adições feitas foi à redução de configuração se o padrão do framework for seguido. Para enter melhor como isso é feito, veremos um código em Rails de um mapeamento de uma tabela chamada clientes: classcliente<activerecord::base cliente = Cliente.find(1) cliente.nome = Thiago cliente.save Figura 3.3 Exemplo de Uso do AR Como é observado a classe automaticamente, quando criada, herda de ActiveRecord::Base, que é a classe ORM que vem por padrão em Rails. Com essa classe herdada, todos os métodos e atributos da classe ActiveRecord passam a fazer parte da classe Cliente, podo simplesmente fazer um find e localizar um cliente por id. Localizando o registro, é possível modificá-lo e depois salvá-lo na base de dados. O AR do Rails é a base do Modelo do padrão MVC e também um padrão de projeto estabelecido por Martin Fowler [FOW 03]. Ele possui algumas validações dos atributos pertencentes ao modelo e outros métodos que fazem dele um framework prático e ú. 3.3 Action Pack: Visualização e Controlador Quando é analisado a fundo a visualização e o controlador no padrão MVC, é possível perceber o quão interligados estão. O controlador recebe várias requisições das interfaces geradas 26