UNIVERSIDADE FEDERAL DE CAMPINA GRANDE CENTRO DE ENGENHARIA ELÉTRICA E INFORMÁTICA UNIDADE ACADÊMICA DE SISTEMAS E COMPUTAÇÃO RELATÓRIO DE ESTÁGIO VALIDAÇÃO DE UMA TÉCNICA PARA GERAÇÃO AUTOMÁTICA DE TESTES COM OBJETOS MOCK RENATO MICELI COSTA RIBEIRO Estagiário DALTON DARIO SEREY GUERRERO Orientador Acadêmico SABRINA DE FIGUEIRÊDO SOUTO Supervisora Técnica Campina Grande – PB Dezembro de 2009 VALIDAÇÃO DE UMA TÉCNICA PARA GERAÇÃO AUTOMÁTICA DE TESTES COM OBJETOS MOCK APROVADO EM _________________________________ BANCA EXAMINADORA ____________________________________________________________ Dalton Dario Serey Guerrero, Prof. DSc. ORIENTADOR ACADÊMICO ____________________________________________________________ Joseana Macêdo Fechine, Prof. DSc. MEMBRO DA BANCA ____________________________________________________________ Sabrina de Figueirêdo Souto, BSc. MEMBRO DA BANCA AGRADECIMENTOS Agradeço inicialmente a Sabrina Souto, por ter me convidado a auxiliá-la em seu mestrado, me oferecendo a oportunidade de participar desse estágio; agradeço a Dalton Serey, pelas discussões frutíferas, mesmo em face das dificuldades em encontrá-lo; agradeço também a Alexandro Soares, a Pryscilla Dóra e a Cícero Alan Cruz, pelas boas sugestões quanto a conduzir este trabalho; e, finalmente, agradeço a Joseana Fechine, pelos votos de sucesso ao acreditar no êxito deste trabalho. APRESENTAÇÃO Como parte das exigências do curso de Ciência da Computação, da Universidade Federal de Campina Grande, para cumprimento da disciplina de Estágio Integrado, apresenta-se o relatório de estágio, que expõe as atividades desenvolvidas por Renato Miceli Costa Ribeiro, ao curso do período 2009.2, sob a orientação acadêmica de Dalton Dario Serey Guerrero e supervisão técnica de Sabrina de Figueirêdo Souto. Esse estágio integrado objetivou validar a técnica Automock de geração automática de testes com Objetos Mock. O estágio foi realizado no Laboratório de Sistemas Distribuídos (LSD), localizado na Universidade Federal de Campina Grande (UFCG), bloco CO. Esse ambiente foi bastante propício para a realização do estágio, visto que dispunha de todo o aparato necessário para o desenvolvimento das atividades. O conteúdo do relatório está distribuído conforme a seguinte descrição. Seção 1 – Introdução. Seção 2 – Ambiente de Estágio. Seção 3 – Fundamentação Teórica e Tecnologias Utilizadas. Seção 4 – Atividades do Estágio. Seção 5 – Considerações Finais. Referências Bibliográficas. Apêndices. Anexos. 4 5 RESUMO Testar softwares é uma atividade muito importante. É através dela que os testadores descobrem faltas no software, que poderiam causar falhas de execução. Uma boa prática de testes sobre sistemas orientados a objeto consiste em isolar as várias unidades de código do restante do sistema de modo a diminuir a influência entre elas durante a execução dos testes. Para isso, uma solução bastante empregada são os Objetos Mock; entretanto, desenvolver testes com Objetos Mock é uma tarefa tediosa e complexa, além de requerer que os testadores possuam profundo conhecimento do sistema e de suas interações. Em seu mestrado, Sabrina Souto propôs uma técnica chamada Automock, para geração automática de código Mock a partir de testes pré-existentes. Este relatório apresenta as atividades desenvolvidas por Renato Miceli ao longo de seu estágio, que objetivaram avaliar a técnica Automock. Para isso, foram utilizados experimentos e questionários, além de análises quantitativas. Este é um trabalho em andamento e deverá ser concluído por Sabrina Souto ao final de seu mestrado. 6 ABSTRACT Testing softwares is an important task. It is by means of it that testers find out faults on softwares, which could lead to execution failures. A recommended testing practice over object-oriented systems consists in isolating the many units of code from the rest of the system, so to decrease the influence between them during the tests' execution. A commonly employed solution for that are the Mock Objects; developing tests with Mock Objects, however, is a tedious and complex task, besides requiring testers to posess deep knowledge about the system and its interactions. On her Masters Course, Sabrina Souto proposed a technique called Automock, for the automatic generation of Mock code out of previously existing tests. This report presents the activities developed by Renato Miceli during his internship, which aimed help evaluating the technique Automock. In order to do that, there have been used experiments and surveys, as well as quantitative analysis. This is an on-going work and should be finished by Sabrina Souto by the end of her Masters Course. 7 8 SUMÁRIO Lista de Siglas e Abreviaturas …................................................................................................. 11 Lista de Quadros …..................................................................................................................... 12 Lista de Tabelas …....................................................................................................................... 13 1. Introdução …........................................................................................................................... 14 2. Ambiente de Estágio …........................................................................................................... 17 2.1. Orientador Acadêmico …................................................................................................ 19 2.2. Supervisora Técnica ….................................................................................................... 19 3. Fundamentação Teórica …..................................................................................................... 21 3.1. Linguagem de Programação Java …............................................................................... 22 3.2. Ambiente de Desenvolvimento Eclipse ......................................................................... 22 3.3. Testes de Software Automatizados ............................................................................... 23 3.4. Arcabouço JUnit ….......................................................................................................... 23 3.5. Classes Stub …................................................................................................................ 24 3.6. Objetos Mock ….............................................................................................................. 24 3.7. Arcabouço EasyMock ..................................................................................................... 25 4. Atividades Realizadas …..…..................................................................................................... 26 4.1. Revisão Bibliográfica ….................…............................................................................... 27 4.2. Escrita de Artigo …....….................…............................................................................... 29 4.3. Proposta de Plano de Estágio ......…............................................................................... 29 4.4. Documentação das Atividades .....…............................................................................... 30 4.5. Seleção de Casos de Teste …........…............................................................................... 31 4.6. Participar do LADC'09 …...............…............................................................................... 33 4.7. Geração de Testes com Colaboradores Stub ................................................................. 34 4.8. Execução de Experimentos …......................................................................................... 35 4.9. Avaliação Preliminar de Tempo de Execução ................................................................ 37 4.10. Montagem de Questionário …..................................................................................... 39 4.11. Avaliação Preliminar do Número de Linhas de Código …............................................. 40 5. Considerações Finais …...…..................................................................................................... 43 Referências Bibliográficas …....................................................................................................... 45 APÊNDICE A …............................................................................................................................. 50 APÊNDICE B …............................................................................................................................. 59 9 APÊNDICE C …............................................................................................................................. 62 APÊNDICE D …............................................................................................................................. 72 APÊNDICE E …............................................................................................................................. 75 ANEXO A ….................................................................................................................................. 81 ANEXO B ….................................................................................................................................. 84 ANEXO C ….................................................................................................................................. 87 10 LISTA DE SIGLAS E ABREVIATURAS BD – Banco de Dados CD-ROM – Compact Disc, Read-Only Memory CUT – Class Under Test (Classe Sob Teste) DSC – Departamento de Sistemas e Computação HP – Hewlett-Packard IDE – Integrated Development Environment IEEE – Institute of Electrical and Electronics Engineers LA-WASP – Latin American Workshop on Aspect-Oriented Software Development LCD – Liquid Crystal Display (Visor de Cristal Líquido) LSD – Laboratório de Sistemas Distribuídos LSI – Laboratório de Sistemas de Informação SAST – Workshop Brasileiro de Teste de Software Sistemático e Automatizado SBSE – Simpósio Brasileiro de Engenharia de Software TDD – Test-Driven Development (Desenvolvimento Orientado a Testes) UFCG – Universidade Federal de Campina Grande 11 LISTA DE QUADROS Quadro 1 – Classes de Teste e seus respectivos Sistemas …....................................... 36 12 LISTA DE TABELAS Tabela 1: Tempos gastos por participante na execução dos experimentos ................. 37 Tabela 2: Tempos gastos pela ferramenta Automock para gerar código mock ........... 37 Tabela 3: Ganho em tempo por participante frente à geração automática de código mock ............................................................................................................................. 38 Tabela 4: Média de ganhos em tempo para intervalos de confiança de 95% …........... 38 Tabela 5: Número de linhas de código dos testes gerados em experimento …............ 41 Tabela 6: Média do total de linhas de código e erros para intervalos de confiança de 95% …............................................................................................................................ 41 13 SEÇÃO I INTRODUÇÃO 14 1. INTRODUÇÃO A atividade de construção do conhecimento não está desassociada da prática do saber. Quando ambas caminham unidas, fortalecem-se os conceitos, adquire-se experiência, obtém-se proeficiência e autossuficiência. Participar de um estágio integrado, pois, é ser presenteado com um diferencial. Essa oportunidade única na vida escolar do jovem aprendiz visa apresentar uma visão prática das teorias já conhecidas. É através dela que se vivencia o dia-a-dia de quem corriqueiramente usa pra fins reais os conceitos meramente teóricos de outrora. Para a formação de um profissional, ter sido estagiário lhe dá uma bagagem de conhecimento teórico e prático, firmemente fixados, e que devem lhe acompanhar durante toda a vida. Seguindo essa filosofia, Renato Miceli participou durante o segundo semestre de 2009 de um estágio integrado. Ele foi realizado no Laboratório de Sistemas Distribuídos (LSD), bloco CO do Campus I da Universidade Federal de Campina Grande (UFCG), durante o período escolar 2009.2, sob orientação acadêmica de Dalton Dario Serey Guerrero e supervisão técnica de Sabrina de Figueirêdo Souto. Este relatório visa apresentar de forma sucinta as atividades desenvolvidas por Renato Miceli ao longo de seu estágio integrado. O estágio integrado desenvolvido teve por objetivo validar a técnica Automock para geração de testes com Objetos Mock (SOUTO, 2009). O foco do estágio foi entender o trabalho proposto, pesquisar soluções de avaliação para problemas similares, e empregar a solução mais adequada para avaliar o Automock sobre o Automock. Objetivo Geral: Validar a técnica e o protótipo de ferramenta Automock de geração de testes com Objetos Mock. 15 Objetivos Específicos: • Entender o trabalho desenvolvido e proposto por Sabrina Souto, a partir de leitura de documentação por ela produzida, palestras e discussões interpessoais. • Pesquisar soluções similares, a fim de identificar melhores abordagens para proceder com a avaliação do trabalho proposto. • Conduzir o trabalho de avaliação usando a abordagem mais adequada, oriunda do trabalho de pesquisa, visando identificar a viabilidade, os benefícios e limitações da técnica Automock. O restante do relatório abordará com mais detalhes o ocorrido no decorrer do estágio integrado, focando as causas que resultaram em mudanças no andamento das atividades, embasadas por argumentos que justificam as decisões tomadas. 16 SEÇÃO II AMBIENTE DE ESTÁGIO 17 2. AMBIENTE DE ESTÁGIO Como citado na seção 1, o estágio integrado foi conduzido no Laboratório de Sistemas Distribuídos (LSD). Este é um laboratório pertencente à Universidade Federal de Campina Grande (UFCG), no âmbito do Departamento de Sistemas e Computação (DSC), localizado no bloco CO. O grupo de pesquisa em sistemas distribuídos já vem de longas datas: fundado em 1996, já passou por diversas mudanças em infraestrutura básica. Sua localidade atual, inaugurada em 2004, dedica toda uma construção própria ao laboratório. Desde sua fundação, os esforços do grupo de pesquisa estão direcionados para a área de sistemas distribuídos, com foco claro nas sub-áreas de computação em grade, sistemas entre-pares, gerenciamento de Ti orientado a negócios, sistemas de arquivo distribuídos e computação nas nuvens. No LSD foram desenvolvidas soluções conhecidas para ambientes distribuídos. Dentre elas, pode-se citar o OurGrid, para compartilhamento de recursos computacionais ociosos; o Commune, para comunicação segura e confiável entre pares através de uma rede; e o BeeFS, um sistema de arquivos distribuído sobre máquinas desktop, que utiliza da capacidade de armazenamento disponível nelas para criar um grande diretório de arquivos. Muitas outras soluções já foram ou estão em desenvolvimento no laboratório, que conta com o suporte financeiro da gigante da informática Hewlett-Packard (HP), especialmente por meio dos projetos OurGrid e Hybrid Clouds, este do qual o estagiário é pesquisador e desenvolvedor atualmente. Mais informações acerca do ambiente de estágio podem ser obtidas na seção “Ambiente de Estágio” no Apêndice A. O LSD possui infraestrutura própria e dispõe de salas climatizadas e máquinas de última geração. São computadores de uso pessoal com mouse, teclado e monitor LCD, rodando sistemas Unix/Linux e Windows e serviços básicos associados. Toda essa infraestrutura de informática é apoiada por uma equipe de suporte, disponível em horário comercial para quaisquer problemas 18 que haja. Assim, o laboratório satisfaz todos os requisitos necessários para ser posto de trabalho permanente no decorrer do estágio integrado. Acima de tudo, foi no LSD que se iniciou o desenvolvimento da técnica Automock, no contexto do projeto AutoTest, coordenado por Dalton Serey. Apesar do fim desse projeto, o laboratório ainda conserva as infraestrutura de serviços montada para suportá-lo; assim sendo, esse é o local mais que propício para a condução do estágio integrado. Dalton Serey e Sabrina Souto são, respectivamente, o orientador acadêmico e a supervisora técnica desse estágio integrado. Suas informações pessoais e profissionais são descritas em sequência. 2.1. ORIENTADOR ACADÊMICO • Nome: Dalton Dario Serey Guerrero • Função: Professor Adjunto e Coordenador de Curso • Endereço Profissional: Universidade Federal de Campina Grande (UFCG) Centro de Engenharia Elétrica e Informática (CEEI) Coordenação do Curso de Ciência da Computação (CCC) Rua Aprígio Veloso, s/n, Bodocongó CEP 58429-900 Campina Grande - PB, Brasil. Telefone: +55 (83) 3310-1027 • Endereço de Email Pessoal: [email protected] • Endereço de Email Profissional: [email protected] 2.2. SUPERVISORA TÉCNICA • Nome: Sabrina de Figueiredo Souto • Função: Mestranda 19 • Endereço Profissional: Universidade Federal de Campina Grande (UFCG) Departamento de Sistemas e Computação (DSC) Laboratório de Sistemas Distribuídos (LSD) Rua Aprígio Veloso, 882 - Bloco CO Bodocongó CEP 58109-970 Campina Grande - PB, Brasil. Telefone: +55 (83) 3310-1647 Fax: +55 (83) 3310-1498 • Endereço de Email Pessoal: [email protected] • Endereço de Email Profissional: [email protected] 20 SEÇÃO III FUNDAMENTAÇÃO TEÓRICA 21 3. FUNDAMENTAÇÃO TEÓRICA 3.1. LINGUAGEM DE PROGRAMAÇÃO JAVA A linguagem de programação Java (JAVA, 2009) é uma linguagem de programação desenvolvida pela Sun Microsystems, Inc. em 1995 que mescla conceitos dos paradigmas imperativo e orientado a objeto. Sua sintaxe deriva majoritariamente das linguagens de programação C e C++, embora tenha um modelo de objetos bem mais simples e menos facilidades de baixo nível. Foi feita para rodar sobre a Máquina Virtual Java, por meio da interpretação de bytecodes, gerados pela compilação de código-fonte. Para a condução do estágio, foi necessário conhecimento aprofundado sobre o paradigma de programação orientado a objeto e suas boas práticas de projeto, bem como proeficiência na linguagem de programação Java. Essa foi a linguagem utilizada durante todo o trabalho já desenvolvido até o momento, inclusive sendo a linguagem usada para desenvolver o protótipo de ferramenta Automock, os cenários de estudo do protótipo e os sistemas para experimentação. Apesar de ser geral, a técnica Automock só foi implementada em ambientes Java (SOUTO, 2009), tornando esse um requisito fundamental para a atividade de estágio. 3.2. AMBIENTE DE DESENVOLVIMENTO ECLIPSE Um dos mais usados ambientes de desenvolvimento de softwares para a linguagem de programação Java, compreende uma IDE e um sistema de gerenciamento de plug-ins (ECLIPSE, 2009). É o sistema de facto utilizado na UFCG para desenvolvimento de aplicações Java. No contexto do trabalho, essa ferramenta foi de suma importância, pois foi através dela que o protótipo Automock e os casos de teste simples para 22 validação foram desenvolvidos (SOUTO, 2009). Esta ferramenta foi usada durante todo o decorrer do estágio para realizar alterações sobre código Java, além de ser tecnologia assistencial obrigatória para os estudos de caso e execução dos experimentos. 3.3. TESTES DE SOFTWARE AUTOMATIZADOS Dentre os maiores princípios da Engenharia de Software estão as recomendadas boas práticas de teste. Testar software é uma técnica eficaz para identificar defeitos em um software que podem ocasionar em falhas de execução. É fato que um maior tempo empregado com atividades de verificação e validação diminui consideravelmente o tempo demandado em atividades de depuração, refatoramento e evolução do software. Para facilitar as atividades de teste de software, inúmeras ferramentas surgiram. Elas se propõem a automatizar o passo-a-passo executado para estimular o software em busca de falhas. Ter se tornado uma tarefa bem menos custosa em termos de tempo contribuiu para tornar o teste de software cada vez mais popular na academia e no mercado. 3.4. ARCABOUÇO JUNIT Dos maiores arcabouços para desenvolvimento de testes de unidade automáticos em sistemas Java é o JUnit (JUNIT, 2009). Na sua atual versão 4.x, é o arcabouço dominante na academia e no mercado para compor testes automatizados sobre softwares Java. Foi com uso do JUnit que o protótipo Automock foi validado. Além disso, os testes que devem ser fornecidos ao protótipo são testes escritos usando o arcabouço JUnit. Assim, todos os testes estudados, alterados e construídos durante o estágio integrado estavam ou foram escritos usando JUnit. 23 3.5. CLASSES STUB O conceito de Classes Stub está intimamente ligado às bases do paradigma de programação orientado a objeto. Classes Stub são classes que simulam o comportamento de outras classes do sistema. Para isso, elas devem respeitar o mesmo contrato e retornar respostas predefinidas para certos estímulos fornecidos ao software. O comportamento esperado é definido estaticamente no código da classe Stub. Classes Stub são um dos meios para prover isolamento da CUT em testes de unidade. No entanto, podem se multiplicar ao longo do ciclo de vida do software, por não serem reutilizáveis. 3.6. OBJETOS MOCK Como o conceito de Classes Stub, o conceito de Objetos Mock também está intimamente ligado ao paradigma de programação orientado a objeto. Objetos Mock servem ao mesmo propósito de classes Stub. Diferenciam-se dessas por terem seu comportamento definido dinamicamente em código, no corpo dos métodos de teste. No mais, Objetos Mock têm a capacidade de auxiliar na decisão sobre a falha ou aceitação de um teste, checando a sequência de expectativas que deveriam ter sido satisfeitas quanto a chamadas sobre si. Objetos Mock, bem como Classes Stub, podem tornar a execução do teste mais rápida, por não executarem algoritmos complexos, além de isolar a CUT do restante do ambiente de teste. Por outro lado, código mock é bem custoso de se escrever, requer conhecimento profundo do testador sobre o sistema em estudo, além de ser bastante suscetível a mudanças sutis no código do sistema (pequenas alterações no código podem levar a descartar o código mock). O trabalho proposto visa solucionar esse problema, através de da técnica Automock (SOUTO, 2009). 24 Para construir Objetos Mock eficientemente, existe uma variedade de arcabouços disponíveis para a linguagem Java, dentre os quais destaca-se o EasyMock. 3.7. ARCABOUÇO EASYMOCK O EasyMock (EASYMOCK, 2009) é um dos arcabouços de desenvolvimento de código mock mais utilizados dentre os disponíveis para a linguagem de programação Java. Ele provê a construção de Objetos Mock para interfaces e classes Java, registra listas de expectativas e omite completamente a existência de um objeto falso por debaixo do tipo provido pelo objeto. É bastante recomendado para TDD, visto que seu modo único de registro de expectativas o torna imune à maioria dos refatoramentos feitos a códigos Java. Esse arcabouço foi de suma importância para o trabalho de estágio, visto que é com uso dele que o protótipo Automock gera código mock para testes JUnit. Por isso, toda e qualquer atividade que envolvesse Objetos Mock no decorrer desse trabalho necessariamente utilizou o arcabouço EasyMock, para fins de comparação de resultados. 25 SEÇÃO IV ATIVIDADES REALIZADAS 26 4. Atividades Realizadas Nessa seção são apresentadas as atividades realizadas no decorrer do estágio. Note-se que a sequência de atividades está ordenada cronologicamente, por questões de organização. 4.1. Revisão Bibliográfica Antes de se proceder com o trabalho de avaliação do Automock, foi necessária uma pesquisa bibliográfica inicial do estado-da-arte. O objetivo dessa atividade foi de agregar conhecimento acerca de outras técnicas utilizadas para realizar a avaliação proposta. Foi necessário entender primeiramente o contexto em que se inseria o problema sob estudo, as abordagens que já haviam sido empregadas para resolver tal problema, além de novas abordagens que potencialmente poderiam ser empregadas, para enfim propor uma metodologia adequada para encarar o problema. Assim, essa atividade foi de suma importância para a condução do trabalho de avaliação do Automock. A revisão bibliográfica apresentou Tim Mackinnon como o criador do conceito de Objetos Mock (MACKINNON, 2001). Seu intuito primário era de auxiliar os desenvolvedores a escrever testes para objetos isolados, enquanto seguiam o método Extreme Programming (BECK, 2000). Também foi mostrado que outra abordagem isolar esses objetos são os Stubs, que, mesmo que tenham os mesmos objetivos dos Objetos Mock, não são o mesmo (FOWLER, 2007). De acordo com Meszaros, Stubs proveem respostas predefinidas para as chamadas feitas durante um teste; se usados fora do programado para o teste, é possível que responsam incorretamente (MESZAROS, 2007). Por outro lado, Objetos Mock são dinamicamente préprogramados com expectativas; se usados fora do programado para o teste, eles podem indicar explicitamente uma falha. Há ainda outras características que os diferenciam: por exemplo, Objetos Mock geralmente contam o número 27 de vezes que cada operação é invocada, além de verificar os argumentos fornecidos às operações e terem seus valores de retorno pré-estabelecidos. Através dessa atividade pôde-se conhecer uma gama de arcabouços dedicados a auxiliar testadores na construção de testes com Objetos Mock. Dentre eles, pode-se listar o EasyMock (EASYMOCK, 2009) e o GoogleMock (GOOGLEMOCK, 2009). A revisão bibliográfica também revelou alguns trabalhos diretamente relacionados ao Automock. O GenUTest, por exemplo, é uma ferramenta que captura e registra interações entre os objetos durante a execução de programas Java para gerar testes JUnit (PASTERNAK, 2009). Apesar de aparentar ser bastante similar à técnica proposta, GenUTest depende de uma versão funcional do software para executar, e gera testes de unidade para todos as classes do sistema; o Automock, por outro lado, espera que o testador indique um objeto-alvo e provenha algum teste que exercite esse objeto (SOUTO, 2009). Ainda, pelo que consta, o GenUTest, até o presente momento, parece não ter sido levado a público, dificultando o estudo dessa ferramenta que tanto se assemelha ao Automock. Outros trabalhos bem relacionados foram um protótipo de ferramenta para geração de Objetos Mock usando uma combinação de execuções concreta e simbólica de código .NET (TILLMANN, 2006), e uma proposta de ferramenta para conversão automática de testes de sistema em uma coleção de testes de unidade, a fim de apoiar a fatoração de testes (SAFF, 2005). Esse último trabalho utiliza a técnica de instrumentação do código binário do sistema, inclusive de todas as suas dependências (por exemplo, as bibliotecas que usa), exceto da CUT. Apesar da similaridade à técnica Automock, nenhum desses trabalhos parece abordar o problema da maneira proposta (SOUTO, 2009), o que aumenta seu trabalho em relevância e originalidade. A partir dessa atividade foram geradas as seções 2 e 1 dos artigos para o SAST'09 e o LA-WASP'09, respectivamente, que podem ser encontrados nos apêndices C e D. 28 4.2. Escrita de Artigo Dada a relevância e originalidade do trabalho de geração automática de testes com Objetos Mock, o próximo passo foi documentar seu estágio atual no formato de artigo científico. Embora tenha sido útil para treinar a prática da escrita de documentos formais, o maior objetivo dessa atividade era de apresentar à comunidade científica a abordagem a ser seguida para solucionar o problema da escrita de testes com Objetos Mock. O primeiro fruto dessa atividade foi o artigo escrito para o SAST'09 (vide apêndice C). Por questões de imaturidade do trabalho, esse artigo acabou não sendo submetido para a conferência a tempo. Entretanto, a partir dele foi escrito o artigo para o LA-WASP'09 (vide apêndice D). Esse último trabalho foi submetido ao evento e notificado como aceito. Ele foi defendido por Sabrina Souto durante o evento, ocorrido em outubro de 2009 em Fortaleza. Foi publicado em CD-ROM pela IEEE Computer Society, juntamente com os anais do SBSE'09. 4.3. Defesa de Plano de Estágio A ideia do estágio era de realizar a avaliação da técnica Automock por meio de estudos de caso. Para isso, deveria-se averiguar o ganho promovido pela técnica automatizada frente à construção manual de testes com Objetos Mock. Assim, seriam selecionados testes já desenvolvidos para os sistemas sob estudo, que seriam convertidos manualmente e automaticamente (com uso do protótipo de ferramenta) em testes com Objetos Mock. Sobre esses testes com e sem o uso de Objetos Mock seriam aplicadas métricas preestabelecidas: tempo para geração, total de linhas de código, cobertura da execução, número de detecções de erro, equivalência em semântica. O resultado dessas métricas, por uso de diferença simples, geraria o ganho proporcionado pela técnica sobre a construção manual de testes com Objetos Mock. Os sistemas para estudo foram selecionados pela proximidade da equipe de desenvolvimento. Esses sistemas eram o OurBackup, o Hidrogis e o OurGrid. Desenvolvido no LSD nos anos de 2007 e 2008 sob orientação de 29 Dalton Serey, o OurBackup (OLIVEIRA, 2008) é voltado para o compartilhamento de arquivos entre amigos, visando o becape cruzado; o Hidrogis foi desenvolvido no Laboratório de Sistemas de Informação (LSI), na UFCG; e o OurGrid (CIRNE, 2006), também desenvolvido no LSD, foca no compartilhamento de poder computacional entre várias grades de máquinas oportunistas. Todos os três sistemas possuem desenvolvedores próximos, o que facilitaria o trabalho de avaliação do Automock. O Plano de Estágio, que pode ser obtido no Apêndice A, foi defendido por meio de uma apresentação, disponível no Apêndice B. Após apreciação do trabalho frente à professora e à turma da disciplina de Estágio Integrado, foi aprovado com a pontuação máxima. 4.4. Documentação das Atividades Foi acordado com a supervisora técnica que todas as atividades relevantes desenvolvidas durante o estágio seriam registradas. Para tanto, foi criado um espaço em wiki no serviço Redmine (REDMINE, 2009), hospedado nos servidores do LSD. As atividades passíveis de documentação são primariamente as reuniões, sejam formais ou informais; o andamento das atividades, sejam de cumprimento obrigatório da disciplina, sejam decorrentes da condução do estágio integrado; quaisquer ideias que forem surgindo, que possam de alguma forma contribuir para melhorar o trabalho. Assim, durante todo o decorrer do estágio, foram postadas anotações que documentam adequadamente as atividades desenvolvidas no âmbito do estágio integrado. Além de tudo, também foram documentados os cronogramas de trabalho, horários de presença no estágio e as atividades desenvolvidas atualmente no âmbito do estágio, tanto do estagiário quanto de seu supervisor técnico. Portanto, o wiki do Redmine tornou-se serviço primordial na boa condução do estágio integrado; obteve status de serviço de centralização das informações concernentes ao estágio, bem como serviço de comunicação confiável público entre o estagiário e seu supervisor técnico. 30 4.5. Seleção de Casos de Teste Para dar início à avaliação da técnica Automock, foi necessário selecionar um sistema como ponto de partida para estudá-lo, entendê-lo e, por fim, poder extrair uma suíte de testes que comporia o estudo de caso. O primeiro sistema escolhido foi o OurBackup (OLIVEIRA, 2008). Esse sistema se apresenta em duas versões: a Home, voltada para usuários doméstico, e a Enterprise, direcionada a usuários corporativos. Visto que o estagiário havia participado do desenvolvido da versão Enterprise do OurBackup e isso implicaria em uma curva de aprendizado menos custosa, essa foi a escolha inicial de sistema para estudo. Após alguns estudos sobre o estado atual do sistema, constatou-se que o OurBackup Enterprise não possuia testes adequados para compor a suíte do estudo de caso. Apenas dois testes envolviam uma CUT e seus colaboradores; entretanto, esses testes já possuíam respectivos com uso de mocks. Os demais testes do sistema se encaixam em cinco categorias: ou são testes de unidade, cuja CUT é testada na inexistência de colaboradores; ou são testes de aceitação sobre um módulo servidor, cujo módulo cliente recebe os estímulos de entrada e fornece as respostas de saída; ou são testes de unidade com CUT e colaboradores, cujos colaboradores já são objetos mock; ou são testes de unidade cuja CUT não está bem modularizada, lidando diretamente com o ambiente (seja agregando responsabilidade ou usando instâncias locais de seus colaboradores em seus métodos), quando isso deveria ser feito por meio de colaboradores globais; ou são testes nãodeterminísticos (isto é, nem toda execução admitirá o mesmo comportamento resultante), que envolvem a realização de operações não necessariamente sequenciais (paralelas ou concorrentes) para atingir condições probabilísticas sobre o estado do sistema. (como é a maioria dos sistema distribuídos, senão todos). Além disso, testes adequados para a técnica Automock (chamados testes “mockáveis”) não devem ser dependentes do tempo de execução, como ocorre com alguns testes não-determinísticos, uma vez que a substituição de colaboradores reais por Objetos Mock pode alterar o tempo de execução do sistema sensivelmente (imagine colaboradores para acesso a BD ou conexões 31 remotas). Dado o uso inviável dos testes do OurBackup Enterprise, não houve outra opção senão descartar o sistema. O próximo sistema sob estudo foi o OurBackup Home. Após diversas análises do sistema e de seus testes, constatou-se que ele apresentava as mesmas deficiências do sistema OurBackup Enterprise. No entanto, sua suíte de testes com Objetos Mock era bem maior. Foi identificado que em ambos os softwares os testes de unidade cuja CUT interage com diversos colaboradores (isto é, os testes focados pelo Automock) já fazem uso de Objetos Mock. Considera-se, pois, sua suíte de testes como de boa qualidade para os padrões atuais de teste de software. Uma alternativa em todo caso seria construir testes para os sistemas sob estudo. Isso requere conhecimento profundo sobre esses sistemas e os relacionamentos estabelecidos entre os objetos em tempo de execução. O tempo de aprendizado seria grande. Portanto, essa foi uma alternativa descartada. Outra alternativa consistia em converter os testes com código mock em testes com colaboradores reais, para então proceder de maneira inversa. No entanto, isso implicaria em realizar manualmente ou dispor de uma ferramenta para tal; ambas as abordagens podem apresentar imperfeições e não garantir equivalência semântica entre os testes original e alterado (vale salientar que avaliar a validade de uma técnica de conversão de testes com código mock em testes com colaboradores reais é da mesma ordem de complexidade de avaliar a técnica Automock). Também requere conhecimento aprofundado do sistema para saber que colaborador real faz o papel exato do Objeto Mock presente em um teste, para questões de substituição. Ainda é um requisito conhecimento acerca da gerência de configuração do sistema, que pode ser bastante complexa, dada a complexidade dos sistemas sob estudo. Por fim, uma limitação dessa abordagem foi de que nem sempre há colaboradores reais no software que se comportem de maneira exata ao modo prescrito pelos Objetos Mock; esse código mock pode realizar o comportamento errôneo (casos de erro ou de alteração do software original), ou ainda servir pra injetar falhas propositais no sistema, desviando do comportamento esperado para um colaborador. Ainda, mesmo que haja colaboradores que se comportem à 32 maneira dos Objetos Mock, é bem provável que as operações que eles realizem resultem em efeitos colaterais sobre o ambiente – que não era previsto no teste com mocks – e assim causem a falha do teste. Se os relacionamentos entre os colaboradores reais e o ambiente são complexas, avaliar o impacto da substituição de colaboradores mock por colaboradores reais é uma atividade bem custosa. Uma terceira alternativa consistia em substituir os colaboradores mock por Stubs; afinal, Stubs podem ser programados também para realizar expectativas predefinidas, mas de modo estático no código. Assim, haveria um conjunto de classes dedicadas somente a reproduzir esse comportamento durante a execução do código: os Stubs. Eles proveem os mesmos ganhos obtidos por meio de Objetos Mock, mas sem não-determinismo, sem efeitos colaterais, nem requerendo conhecimento profundo sobre os relacionamentos entre os objetos do sistema. E como são classes, podem gerar instâncias para atuar como colaboradores reais da CUT, que podem posteriormente ser substituídos por Objetos Mock, através da técnica Automock. Dos três sistemas selecionados para estudo, dois deles – OurBackup e OurGrid – não se encaixavam no modelo de testes adequado para uso pelo Automock (os chamados testes “mockáveis”). Como ainda não havia sido fornecido acesso ao sistema Hidrogis até o momento (algo que estaria sendo providenciado pela supervisora técnica) e as atividades não poderiam parar, essa última alternativa aparentava a mais viável e foi a próxima atividade conduzida no âmbito do estágio. 4.6. Participar do LADC'09 Antes de dar prosseguimento às atividades normais do estágio, houve o evento LADC. A participação como ouvinte foi de suma importância, pois durante o Fórum Estudantil ocorrido nesse evento, a supervisora técnica apresentou o estágio atual do seu trabalho de mestrado, assunto intimamente ligado ao trabalho desenvolvido no estágio integrado. As sugestões e críticas colhidas no decorrer da apresentação da supervisora técnica contribuíram de maneira sucinta para o andamento do trabalho de estágio. 33 4.7. Geração de Testes com Colaboradores Stub Essa atividade foi o passo natural no andamento do trabalho de estágio. Foram selecionados onze (11) testes do sistema OurBackup Home que utilizavam Objetos Mock em sua forma original, para proceder com a atividade. Os colaboradores mock foram todos substituídos por classes Stub que se comportam da mesma maneira que os Objetos Mock. Assim, a semântica do teste estaria assegurada sem que fosse necessário muito conhecimento acerca do sistema ou do relacionamento entre os objetos durante a execução, visto que toda a listagem de expectativas dos Objetos Mock está disponível no corpo dos métodos de teste. No entanto, percebeu-se que os testes que já faziam uso de Objetos Mock (aqueles onze testes selecionados) apresentavam cenários típicos de execução de sistemas de informação: consultas em bancos de dados, relacionamento simples entre objetos, colaboradores sem muita complexidade. Virtualmente, os testes selecionados eram casos de uso de sistemas de informação, que apresentam a característica já definida da “mockabilidade”. Não havia sentido em utilizar testes sobre sistemas distribuídos se o foco maior desses testes era a característica não-distribuída dos objetos em teste. Além disso, os sistemas escolhidos para estudo (excluindo-se o Hidrogis, com o qual não houve contato) todos são sistemas robustos e que demandam tempo em gerência de configuração para terem seus testes executados. Assim, o custo para realizar o estudo de caso sobre os sistemas escolhidos acabou sendo muito alto frente aos benefícios que eles poderiam proporcionar. O tempo requerido era tanto que podia exceder o tempo dedicado a todo o estágio. Por fim, a abordagem tomada para avaliação do Automock por meio de estudo de caso não dispunha de variabilidade estatística que trouxesse segurança aos resultados obtidos. Só havia um único testador manual (o estagiário), os testes eram poucos e bem similares uns aos outros, além de terem sido adulterados de sua forma original (seus colaboradores mock haviam sido substituídos por colaboradores Stub). 34 A solução encontrada foi rever o plano de avaliação e redirecionar esforços para abordagens mais efetivas. O plano de avaliação foi alterado para o modelo de experimentação, com uso de participantes voluntários, que contribuiriam para a variabilidade estatística; e de questionários, para a fundamentação, embasamento e correlação dos resultados obtidos na experimentação com os voluntários. 4.8. Execução de Experimentos O novo modelo adotado para o plano de avaliação do Automock foi a experimentação. Para esse modelo, um conjunto de participantes voluntários seria selecionado para converter testes de unidade simples em testes que usam Objetos Mock. Esses participantes foram selecionados por conhecimento prévio do conceito de mocks, bem como experiência com programação Java (JAVA, 2009) e proeficiência nos arcabouços JUnit (JUNIT, 2009) e EasyMock (EASYMOCK, 2009), utilizados para criar testes com Objetos Mock. Dada a proximidade, os participantes selecionados para o experimento foram majoritariamente oriundos do LSD, o ambiente de estágio. No total, e contando com o estagiário, foram onze (11) os participantes selecionados. Para uso na experimentação, foram desenvolvidos três pequenos sistemas de informação utilizando a linguagem de programação Java (JAVA, 2009), com pequenas funcionalidades, poucas classes e alguns testes com uso de JUnit (JUNIT, 2009). O primeiro sistema, denominado Aluno, envolve o registro de notas de alunos em uma caderneta, bem como cálculo de média e de resultado (aprovação ou reprovação); o segundo sistema, denominado Autenticação, registra usuários por meio do par (login, senha) e permite identificar o usuário no sistema; e o terceiro sistema, denominado Pedido, permite o cadastro de produtos e a criação de pedidos contendo vários desses produtos. Todos os três sistemas envolvem de alguma forma o padrão DAO, de modo que os alunos, os usuários e os produtos são todos persistidos em disco. Mais informações acerca dos sistemas Aluno, Autenticação e Pedido podem ser encontradas, respectivamente, nos anexos A, B e C. 35 O objetivo dos participantes foi de reescrever os testes fornecidos com uso de Objetos Mock, de modo a isolar a CUT do restante dos colaboradores reais do sistema (isto é, os colaboradores seriam mocks). Cada participante recebeu exatamente 2 (dois) testes sobre um único sistema específico (exceto o estagiário, que converteu todos os testes de todos os sistemas em testes com Objetos Mock). Todos os testes com Objetos Mock foram desenvolvidos com uso dos arcabouços JUnit (JUNIT, 2009) e EasyMock (EASYMOCK, 2009), através da IDE Eclipse (ECLIPSE, 2009). Os testes fornecidos e seus respectivos sistemas estão descritos no Quadro 1. Quadro 1 – Classes de Teste e seus respectivos Sistemas Identificador Classe de Teste Sistema T1 AdicionaLinhaTest Pedido T2 TotalFinalTest Pedido T3 LoginValidoTest Autenticação T4 LoginInvalidoTest Autenticação T5 TestAlunoAprovadoFinal Aluno T6 TestAunoReprovadoInfrequencia Aluno T7 TestAlunoAprovadoNota Aluno T8 TestAlunoReprovadoFinal Aluno T9 TestAlunoReprovadoNota Aluno T10 TestAlunoAprovadoInexistente Aluno A execução dos experimentos foi acompanhada pelo estagiário e pela supervisora técnica, a fim de cronometrar o tempo necessário para concluir a conversão de cada um dos testes fornecidos. Visto que essa atividade ainda está sendo conduzida, alguns dos participantes ainda não executaram o experimento, logo os tempos não puderam ser cronometrados. A Tabela 1 apresenta o estado atual da execução dos experimentos, discriminando os tempos gastos por cada participante na conversão dos testes fornecidos em testes com Objetos Mock. Note-se que, por questões de sigilo, os nomes dos participantes no experimento não serão fornecidos; cada participante exceto o estagiário será identificado por “Px”, para x ∈ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}. 36 Tabela 1: Tempos gastos por participante na execução dos experimentos Participante P1 Teste P2 P3 P4 P5 P6 P7 P8 P9 P10 Renato T1 14min 70min 33min T2 10min 10min 6min T3 13min ** 5min T4 37min ** 3min T5 ** 13min 7min T6 ** 3min 3min T7 49min ** 3min T8 11min ** 2min T9 30min 24min 2min T10 26min 11min 1min Foi feita uma avaliação preliminar a partir dos resultados obtidos até o estágio atual. A execução do restante dos experimentos e posterior avaliação de seus resultados foi definido como trabalho futuro e deverá ser conduzido pela supervisora técnica. Esses trabalhos incluem estudar o estado da arte na análise de variação de valores numéricos, definir métricas para mensuração de erro (ganhos ou perdas), para então aplicá-las e analisar os resultados obtidos. 4.9. Avaliação Preliminar de Tempo de Execução Uma vez conduzido o experimento, foi necessário executar o protótipo de ferramenta Automock para poder comparar o ganho obtido entre as construções manual e automática de testes com Objetos Mock. A Tabela 2 apresenta os tempos de execução do Automock para cada testes dos sistemas sob experimento. Tabela 2: Tempos gastos pela ferramenta Automock para gerar código mock Teste T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 Automock 189s 257s 74s 28s 17s 24s 17s 16s 17s 14s Conhecidos ambos os tempos de geração manual e automática de código mock, pôde-se obter resultados preliminares do ganho da abordagem 37 automática sobre a abordagem manual para construção de testes com Objetos Mock. Esses resultados preliminares são apresentados na Tabela 3. Tabela 3: Ganho em tempo por participante frente à geração automática de código mock Participante P1 Teste P2 P3 P4 P5 P6 P7 P8 P9 P10 Renato T1 651s 4011s 1791s T2 343s 343s 103s T3 706s ** 226s T4 2192s ** 152s T5 ** 763s 403s T6 ** 156s 156s T7 2923s ** 163s T8 644s ** 104s T9 1783s 1423s 103s T10 1546s 646s 46s A média dos ganhos para cada teste, bem como o erro aproximado (considerando o ganho em tempo como sendo uma variável aleatória normalmente distribuída) para um nível de confiança de 95% são apresentados na Tabela 4. Tabela 4: Média de ganhos em tempo para intervalos de confiança de 95% Teste Média T1 T2 T3 2151s 263s 466s T4 1172s T5 T6 T7 583s 156s 1543s Erro Aprox. 4245s 344s 3050s 12960s 2287s 0s T8 T9 T10 374s 1103s 746s 17535s 3431s 2197s 1875s A partir da Tabela 4, pode-se inferir que, assumindo o ganho em tempo como normalmente distribuído, em todos os testes do experimento exceto o T6 há 95% de probabilidade de a média dos ganhos assumir valores negativos, o que implica dizer que o uso do protótipo Automock pode proporcionar perdas em tempo, ao invés de ganhos. No mais, os erros aproximados que definem um intervalo de confiança de nível de 95% em torno da média foram muito altos, o que indica falta de acurácia estatística. Para aumentar tal precisão, seria necessária uma replicação dos experimentos para bem mais do que duas ou três réplicas, como consta no estado atual do experimento. 38 Embora desses resultados seja possível inferir que o ganho promovido pelo Automock pode ser de ordem de grandeza bem superior ao tempo de execução automático para geração de código mock (observado ao confrontar os dados das Tabelas 2 e 4), faz-se necessário estudos mais aprofundados sobre as variáveis em estudo, especialmente quanto à distribuição de probabilidade da variável aleatória que rege o ganho em tempo promovido pelo uso da técnica Automock. 4.10. Montagem de Questionário Algumas variáveis sob estudo no experimento não podem ser obtidas diretamente da execução do experimento em si. Para isso, um questionário pode auxiliar bastante, por conseguir extrair diretamente e claramente do participante do experimento valores de variáveis que podem estar diretamente relacionadas às variáveis sob estudo no próprio experimento. Assim facilita-se o trabalho de identificar fatores que influenciem positivamente ou negativamente certos aspectos-chave na avaliação da técnica proposta. Dessa maneira, foi desenvolvido um questionário focando nos conceitos necessários e suficientes para a condução do experimento (seu conteúdo pode ser conferido no apêndice E). Ele foi dividido em 3 (três) subseções: a primeira, denominada Conceitos Básicos, refere-se à fundamentação teórica necessária para participar do experimento e tenta extrair quantitativamente estimativas do tempo de experiência que cada participante possui com os conceitos e ferramentas necessários para a condução do experimento; a segunda subseção, denominada Realização do Experimento, objetiva receber um retorno dos participantes quanto ao ocorrido durante a realização do experimento, bem como suas percepções acerca do sistema experimentado, suas classes e seus testes; e a terceira e última seção, denominada Avaliação da Técnica, foca em extrair dos participantes do experimento se eles compreenderam de fato a que se propõe a técnica Automock avaliada no experimento, além de coletar novas motivações, desvantagens e limitações não-identificadas previamente sobre a técnica proposta. 39 Esse questionário foi desenvolvido após algumas pesquisas sobre boas práticas na construção de surveys, e ainda contou com a contribuição de profissionais entendidos da área. Foram necessárias várias iterações de desenvolvimento para evoluir o questionário ao seu formato atual. Embora considere-se o questionário desenvolvido como ajustado para ser enviado aos respondentes, essa atividade foi reservada como trabalho futuro, visto o custo de realizá-la. Afinal, além de aguardar as respostas dos participantes do experimento, é necessário realizar extensa pesquisa bibliográfica acerca dos métodos existentes de análise de resultados em questionários, e aplicar esses métodos nos resultados obtidos, visando correlacionar os valores de resposta nos questionários entre si aos resultados dos experimentos. 4.11. Avaliação Preliminar do Número de Linhas de Código Embora a métrica sob estudo “tempo de execução” já tenha sido obtida durante a execução dos experimentos, outras métricas só podem ser obtidas posteriormente ao experimento. Dentre elas, pode-se citar “número de linhas de código”, “cobertura da execução”, “número de erros descobertos” e “equivalência em semântica”. Essa atividade foca a métrica “número de linhas de código” sobre os testes com Objetos Mock obtidos ao final dos experimentos. As demais métricas foram reservadas como trabalho futuro e deverão ser estudadas pela supervisora técnica ao longo de seu mestrado. Após pesquisas no estado-da-arte, constatou-se que uma ferramenta adequada para extração do número de linhas de código (com discernimento de linhas em branco e comentários) seria a ferramenta Metrics2 (METRICS2, 2009). Ela é uma evolução da ferramenta Metrics, que foi descontinuada (METRICS, 2009). O objetivo de ambas as ferramentas é disponibilizar facilmente métricas sobre projetos desenvolvidos na linguagem de programação Java (JAVA, 2009). Além do mais, a ferramenta dispõe plug-in para a IDE Eclipse (ECLIPSE, 2009), o que facilitou a análise dos testes com código mock, também desenvolvidos na plataforma Eclipse. 40 Na Tabela 5, é apresentado o número de linhas de código, ignorando comentários e linhas em branco, dos testes com Objetos Mock gerados pelos participantes do experimento. Note-se que esta é uma atividade em andamento, cujos resultados ainda não foram plenamente apurados. Tabela 5: Número de linhas de código dos testes gerados em experimento Participante P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 Renato Teste T1 58 ** 102 T2 52 ** 92 T3 18 ** 38 T4 40 ** 31 T5 ** 23 43 T6 ** 22 34 T7 34 ** 38 T8 32 ** 41 T9 39 31 38 T10 32 30 34 É possível inferir que, excetuando-se os testes do sistema Pedido, todas as outras classes de teste com Objetos Mock possuem número total de linhas de código próximos uns aos outros. Na Tabela 6, é apresentada a média do total de linhas de código para cada teste em experimentação, bem como o erro estimado para um nível de confiança de 95%, quando considerado que o total de linhas de código é uma variável aleatória normalmente distribuída. Tabela 6: Média do total de linhas de código e erros para intervalos de confiança de 95% Teste T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 Média Aprox. 80 72 28 36 33 28 36 37 36 32 Desvio-Padrão Aprox. 31 28 14 6 14 34 3 6 4 2 Erro Aprox. ± 280 ± 254 ± 127 ± 57 ± 127 ± 76 ± 25 ± 57 ± 11 ± 5 Da Tabela 6 é possível inferir que quanto maior o número de amostras, menor o erro que estabelece os limites superior e inferior do intervalo de confiança de 95%. Os valores para maiores números de amostras possuem menor desvio-padrão do que valores com menos amostras. Isso reforça 41 novamente a ideia de que é necessário uma maior replicação do experimento para assegurar a validade estatística. As análises desenvolvidas nessa atividade focaram somente no estudo quantitativo do número total de linhas dos testes produzidos manualmente com Objetos Mock. Diante da inacessibilidade dos códigos mock produzidos automaticamente pela ferramenta Automock, o estudo comparativo entre as duas abordagens foi elevado a trabalho futuro. Cabe aqui ainda realizar um estudo qualitativo dos testes com Objetos Mock produzidos, de modo a averiguar e tentar correlacionar as disparidades entre os números totais de linhas dos testes produzidos por um e outro participantes do experimento. 42 SEÇÃO V CONSIDERAÇÕES FINAIS 43 5. Considerações Finais A maior lição adquirida com esse trabalho, decerto, foi que planejamento e antecipação nunca são demais. Sem dúvida a probabilidade de um trabalho dar errado ou de ele estar seguindo por um caminho tortuoso diminui quanto melhor ele for pensado, quanto mais detalhes forem postos à mesa, quanto mais análise for feita sobre o problema de estudo, quanto mais conhecimento for detido a respeito do estado-da-arte e, principalmente, quanto antes todo o trabalho começar a ser desenvolvido: mais tempo vai ser poupado em caso de falha, tempo que servirá com folga para refazer o caminho-solução para o problema. Com toda certeza, planejamento e antecipação são as bases de uma boa solução. Ao final do estágio integrado, a visão sobre as atividades desenvolvidas durante todo o semestre muda completamente. Certamente aumentou o conhecimento sobre a dinâmica da condução de um trabalho de mestrado; sobre o relacionamento entre orientador e orientando; sobre as facilidades e dificuldades de se conduzir um trabalho científico, especificamente na área da Engenharia de Software. Essa foi uma experiência única, com altos e baixos, pressa e calma, que trouxe ganhos em conhecimento teórico e prático, sobretudo relativo a relacionamento interpessoal. Porque homens não atingem grandes feitos por si sós. 44 REFERÊNCIAS BIBLIOGRÁFICAS 45 Referências Bibliográficas ANT. Desenvolvido pela Apache Software Foundation, 2000-2009. Domínio da Apache sobre a ferramenta Ant, para automatizar o processo de construção de softwares. Disponível em: <http://ant.apache.org>. Acesso em: 13 dez. 2009. ASPECTJ. Mantido pela The Eclipse Foundation, 2001-2009. Apresenta a linguagem AspectJ que estende Java para o paradigma orientado a aspectos. Disponível em: <http://www.eclipse.org/aspectj/>. Acesso em: 13 dez. 2009. BECK, K. Extreme Programming Explained: Embrace Change. AddisonWesley, 2000. BINDER, R. V. Testing Object-Oriented Systems: Models, Patterns, and Tools. Addison-Wesley Professional, 2000. CIRNE, W.; BRASILEIRO, F.; ANDRADE, N.; COSTA, L. B.; ANDRADE, A.; NOVAES, R.; MOWBRAY, M. Labs of the World, Unite!!! Journal of Grid Computing, Nova Iorque, v. 4, n. 3, p. 225-246, 2006. ECLIPSE. Desenvolvido pela The Eclipse Foundation, 2001-2009. Apresenta a suíte de desenvolvimento Eclipse, além de informações sobre manuseio. Disponível em: <http://www.eclipse.org>. Acesso em: 13 dez. 2009. EASYMOCK. Desenvolvido por Tammo Freese e Henri Tremblay, 2001-2009. Apresenta o arcabouço EasyMock para desenvolvimento de código Mock. Disponível em: <http://www.easymock.org>. Acesso em: 13 dez. 2009. FOWLER, M. Mocks Aren’t Stubs, 02 jan. 2007. Disponível em: <http://www.martinfowler.com/articles/mocksArentStubs.html>. Acesso em: 13 dez. 2009. FREEMAN, S.; PRYCE, N.; MACKINNON, T.; WALNES, J. Mock roles, not objects. In: Annual ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA), 19., 2004, Vancouver. Proceedings... Vancouver: ACM Press, 2004, p. 236-246. 46 GOOGLEMOCK. Desenvolvido pela Google, 2009. Domínio dos desenvolvedores do arcabouço GoogleMock para desenvolvimento de código Mock. Disponível em: <http://code.google.com/p/googlemock/>. Acesso em: 13 dez. 2009. JAVA. Desenvolvido pela Sun Microsystems, Inc., 1995-2009. Domínio da desenvolvedora da plataforma Java. Disponível em: <http://www.java.com>. Acesso em: 13 dez. 2009. JUNIT. Mantido pelo time Object Mentor, 2000-2009. Apresenta o arcabouço JUnit para desenvolvimento de testes em métodos ágeis. Disponível em: <http://www.junit.org>. Acesso em: 13 dez. 2009. KERIEVSKY, J. Point/Counterpoint: TDD: Don’t Muck It Up with Too Many Mocks. Software, IEEE, v. 24, n. 3, p. 80-83, maio/jun. 2007. KICZALES, G.; LAMPING, J.; MENDHEKAR, A.; MAEDA, C.; LOPES, C. V.; LOINGTIER, J.M.; IRWIN, J. Aspect-Oriented Programming. In: EUROPEAN CONFERENCE ON OBJECT-ORIENTED PROGRAMMING (ECOOP), 11., 1997, Jyväskylä. Proceedings... Berlin: Springer-Verlag LNCS 1241, 1997, v.1241, p. 220-242. MACKINNON, T.; FREEMAN, S.; CRAIG, P. Endo-Testing: Unit Testing with Mock Objects. In: SUCCI, G.; MARCHESI, M. eXtreme Programming eXamined. Addison-Wesley, 2001, cap. 17, p. 287-301. MACKAY, C. A. An Introduction To Mock Objects, 20 jun. 2007. Disponível em: <http://www.colinmackay.net/tabid/159/Default.aspx>. Acesso em: 13 dez. 2009. MESZAROS, G. xUnit Test Patterns: Refactoring Test Code. Pearson Education, Inc., 2007. METRICS. Hospedado no SourceForge, 2002-2005. Domínio da ferramenta de geração de métricas sobre softwares escritos na linguagem Java. Disponível em: <http://metrics.sourceforge.net/>. Acesso em: 15 dez. 2009. 47 METRICS2. Hospedado no SourceForge, 2009. Domínio da evolução da ferramenta de geração de métrica Metric. Disponível em: <http://metrics2.sourceforge.net/>. Acesso em: 15 dez. 2009. OLIVEIRA, M. I. S.; CIRNE, W.; BRASILEIRO, F.; GUERRERO, D. On the Impact of the Data Redundancy Strategy on the Recoverability of Friend-toFriend Backup Systems. In: SIMPÓSIO BRASILEIRO DE REDES DE COMPUTADORES E SISTEMAS DISTRIBUÍDOS (SBRC), 26., 2008, Rio de Janeiro. Anais... Rio de Janeiro: Sociedade Brasileira de Computação, 2008. PASTERNAK, B.; TYSZBEROWICZ, S.; YEHUDAI, A. GenUTest: a unit test and mock aspect generation tool. International Journal on Software Tools for Technology Transfer (STTT), Berlin/Heidelberg, v. 11, n. 4, p. 273-290, set. 2009. REDMINE. Mantido por Jean-Philippe Lang, 2006-2009. Apresenta o serviço Redmine para auxílio no gerenciamento de projetos. Disponível em: <http://www.redmine.org/>. Acesso em: 14 dez. 2009. SAFF, D.; ARTZI, S.; PERKINS, J.; ERNST, M. D. Automatic test factoring for Java. In: ANNUAL INTERNATIONAL IEEE/ACM CONFERENCE ON AUTOMATED SOFTWARE ENGINEERING (ASE), 20., 2005, Long Beach. Proceedings... Long Beach: IEEE Computer Society, 2005. p. 114-123. SOUTO, S. F.; MICELI, R.; SEREY, D. Generating Mock-Based Test Automatically. In: LATIN AMERICAN WORKSHOP ON ASPECT-ORIENTED SOFTWARE DEVELOPMENT, 3., 2009, Fortaleza. Proceedings... Fortaleza: IEEE Computer Society, 2009. 1 CD-ROM. TILLMANN, N.; SCHULTE, W. Mock-object generation with behavior. In: ANNUAL INTERNATIONAL IEEE/ACM CONFERENCE ON AUTOMATED SOFTWARE ENGINEERING (ASE), 21., 2006, Tóquio. Proceedings... Tóquio: IEEE Computer Society, 2006. p. 365-368. 48 APÊNDICES 49 APÊNDICE A – Plano de Estágio 50 APÊNDICE B – Apresentação da Defesa de Proposta de Estágio 51 APÊNDICE C – Artigo para o SAST'09 52 APÊNDICE D – Publicação em Anais do LA-WASP'09 53 APÊNDICE E – Questionário de Avaliação de Perfil 54 ANEXOS 55 ANEXO A – Explicação sobre Sistema Aluno 56 ANEXO B – Explicação sobre Sistema Autenticação 57 ANEXO C – Explicação sobre Sistema Pedido 58