62
U NIVERSIDADE F EDERAL DE G OIÁS I NSTITUTO DE I NFORMÁTICA DANIEL G OMES DE O LIVEIRA Avaliação de Ferramentas de Geração Automática de Dados de Teste para Programas Java: Um Estudo Exploratório Goiânia 2016

Avaliação de Ferramentas de Geração Automática de Dados de ... · Projetos da Universidade Federal de Goiás, foi feita uma pergunta aos alunos, quais atuavam do mercado como

  • Upload
    dangdat

  • View
    214

  • Download
    0

Embed Size (px)

Citation preview

UNIVERSIDADE FEDERAL DE GOIÁS

INSTITUTO DE INFORMÁTICA

DANIEL GOMES DE OLIVEIRA

Avaliação de Ferramentas de GeraçãoAutomática de Dados de Teste para

Programas Java: Um EstudoExploratório

Goiânia

2016

DANIEL GOMES DE OLIVEIRA

Avaliação de Ferramentas de GeraçãoAutomática de Dados de Teste paraProgramas Java: Um Estudo

Exploratório

Dissertação apresentada ao Programa de Pós-Graduação do

Instituto de Informática da Universidade Federal de Goiás,

como requisito parcial para obtenção do título de Mestre em

Ciência da Computação.

Área de concentração: Ciência da Computação.

Orientador: Prof. Dr. Auri Marcelo Rizzo Vincenzi

Goiânia

2016

Ficha de identificação da obra elaborada pelo autor, através doPrograma de Geração Automática do Sistema de Bibliotecas da UFG.

CDU 004

Gomes de Oliveira, Daniel Avaliação de Ferramentas de Geração Automática de Dados deTeste para Programas Java: Um Estudo Exploratório [manuscrito] /Daniel Gomes de Oliveira. - 2016. LVIII, 58 f.: il.

Orientador: Prof. Dr. Auri Marcelo Rizzo Vincenzi . Dissertação (Mestrado) - Universidade Federal de Goiás, Institutode Informática (INF), Programa de Pós-Graduação em Ciência daComputação, Goiânia, 2016. Bibliografia. Apêndice. Inclui siglas, abreviaturas, símbolos, gráfico, tabelas, lista defiguras, lista de tabelas.

1. Teste de software. 2. geradores automáticos de dados deteste. 3. cobertura de código. 4. teste de mutação. 5. estudosexperimentais. I. , Auri Marcelo Rizzo Vincenzi, orient. II. Título.

DANIEL GOMES DE OLIVEIRA

Avaliação de Ferramentas de GeraçãoAutomática de Dados de Teste paraProgramas Java: Um Estudo

Exploratório

Dissertação apresentada ao Programa de Pós-Graduação do

Instituto de Informática da Universidade Federal de Goiás,

como requisito parcial para obtenção do título de Mestre em

Ciência da Computação.

Área de concentração: Ciência da Computação.

Orientador: Prof. Dr. Auri Marcelo Rizzo Vincenzi

Goiânia

2016

DANIEL GOMES DE OLIVEIRA

Avaliação de Ferramentas de GeraçãoAutomática de Dados de Teste para

Programas Java: Um EstudoExploratório

Dissertação defendida no Programa de Pós-Graduação do Instituto deInformática da Universidade Federal de Goiás como requisito parcialpara obtenção do título de Mestre em Ciência da Computação, aprovadaem 15 de Fevereiro de 2016, pela Banca Examinadora constituída pelosprofessores:

Prof. Dr. Auri Marcelo Rizzo Vincenzi

Instituto de Informática – UFGPresidente da Banca

Prof. Dr. Plínio de Sá Leitão Júnior

Instituto de Informática – UFG

Prof. Dr. Arilo Cláudio Dias Neto

Instituto de Computação – UFAM

Todos os direitos reservados. É proibida a reprodução total ou parcial dotrabalho sem autorização da universidade, do autor e do orientador(a).

Daniel Gomes de Oliveira

Graduado em Análise de Sistemas pela Universidade Salgado de Oliveira,Possui o título de Especialista em Desenvolvimento de Software pela insti-tuição Senac. Bolsista pela Coordenação de Aperfeiçoamento de Pessoal doNível Superior (CAPES).

Dedico este trabalho principalmente à minha família e ao meu orientador.

Agradecimentos

A Deus por permitir que diante de todas as dificuldades encontradas no caminho

os objetivos fossem alcançados.

À minha família, Romes Carlos de Oliveira (pai), Orcélia Maria de Oliveira

(mãe), Flávio Gomes de Oliveira (irmão), Raquel Martins de Oliveira (Esposa) e a Giovani

Martins de Oliveira Gomes e Gustavo Martins de Oliveira Gomes (filhos) que além de

apoio, não se opuseram a ausências em alguns eventos familiares.

Ao meu orientador, Dr. Auri Marcelo Rizzo Vincenzi, por todos os momentos em

que esteve disponível para esclarecer minhas dúvidas e passar orientações com clareza.

Agradeço pela dedicação oferecida a mim durante este período de mestrado, mesmo em

momentos de disponibilidade à sua família.

À Coordenação de Aperfeiçoamento de Pessoal do Nível Superior (CAPES),

pela bolsa que contribuiu para que essa pesquisa se tornasse possível.

Ao Professor Dr. Fernando Marques Federson por permitir cumprir meu estágio

de docência em sua disciplina, me passando todas as orientações quanto a como proceder

em um ambiente acadêmico como também orientações que são para toda uma vida.

À toda equipe administrativa da Universidade Federal de Goiás por ceder espaço

para realização dos estudos como insumos necessários para o mesmo.

Aos amigos de mestrado, que me apoiaram em toda essa jornada, Tiago do

Carmo Nogueira, Márcio Dias de Lima, Matheus Rudolfo Diedrich Ullmann, Weder

Cabral Mendes, Flávio de Assis Vilela.

Um bom teste de software é aquele que revela a presença de falhas noproduto com a máxima cobertura de códigos e o mínimo de esforço por partedo testador (BARBOSA; MALDONADO; VINCENZI, 2000).

Barbosa E. F., Maldonado J. C., Vincenzi A. M. R.,ICMC-USP.

Resumo

Oliveira, Daniel G. Avaliação de Ferramentas de Geração Automática de

Dados de Teste para Programas Java: Um Estudo Exploratório. Goiânia,2016. 57p. Dissertação de Mestrado. Instituto de Informática, UniversidadeFederal de Goiás.

Considerando o alto custo e a grande quantidade de tempo demandada pela atividade

de criação de casos de testes dentro do processo de desenvolvimento de software. A

utilização de ferramentas ou procedimentos que tornem o processo de geração de dados

de testes mais ágil, menos oneroso e que atendam demandas por precisão se tornam

fundamentais para que as empresas atuantes no mercado de desenvolvimento de software

possam atingir seus objetivos. Com base nessas informações, surge a dúvida relacionada

a como proceder para adotar um processo de desenvolvimento e teste de software que

tornem possíveis o alcance dos objetivos de forma a atender os resultados mencionados

anteriormente, mesmo com as dificuldades de gerar dados de teste em decorrência dos

domínios de entrada dos programas serem em geral infinitos. O objetivo do presente

trabalho é conduzir uma avaliação experimental de geradores automáticos de dados de

teste visando identificar qual deles apresenta a melhor relação custo/benefício em termos

de eficácia em detectar defeitos, número de dados de teste gerados e cobertura de código

determinada pelos conjuntos de teste. A pesquisa foi dirigida em duas etapas: na primeira,

dois geradores foram avaliados em relação a um conjunto de 32 programas Java e os

resultados obtidos indicam que, de maneira geral, o gerador CodePro foi o que apresentou

a melhor relação custo benefício frente ao Randoop; na segunda, foi inclusa uma terceira

ferramenta, juntamente a testes gerados de forma manual. Foram gerados novos conjuntos

de teste utilizando os três geradores automáticos e incluso ao projeto conjuntos gerados

de forma manual. Ao final, foram apresentados os resultados em termos de eficácia e

eficiência por meio dos comparativos entre os quatro conjuntos de teste.

Palavras–chave

Teste de software, geradores automáticos de dados de teste, cobertura de código,

teste de mutação, estudos experimentais.

Abstract

Oliveira, Daniel G. Automatic Generation Tools Assessment Test Data: Ex-

ploratory Study.. Goiânia, 2016. 57p. MSc. Dissertation. Instituto de Informá-tica, Universidade Federal de Goiás.

Considering the high cost and large amount of time demanded by the activity generation

tests in the software development process, the need a proposal to reduce both the time

spent as the related costs testing activities is necessary. In this context, the use of tools or

processes that make the activities of generation of more agile testing, less costly and meet

demands for precision are key to companies operating in software development market

can achieve their goals. Based on these information comes to questions regarding how to

go about adopting a process that makes possible the achievement of objectives in order to

meet the results mentioned previously, even with the difficulties of generating test data as

a result of of programs input areas are infinite. There are different tools that use various

strategies for generating test data, however, lacks evidence as the quality of these tools.

In this context, the aim of this work is conducting an experimental evaluation of some

automatic test data generators to identify which one offers the best cost / benefit in terms

of effective in detecting defects number of generated test data, code coverage demanded

by test data, and generation time of testing. At second step a third tool was included along

manually generated tests. New test sets using three automatic generators and included the

manually -generated sets project were generated. Finally, results were presented in terms

of effectiveness and efficiency through the comparison between the four test sets .

Keywords

Software testing, automatic test data generators, code coverage, mutation testing,

experimental studies.

Sumário

Lista de Figuras 10

Lista de Tabelas 11

1 Introdução 12

1.1 Motivação 131.2 Objetivo do Trabalho 16

1.2.1 Metodologia 171.3 Organização do Trabalho 18

2 Terminologia e Conceitos Básicos 19

2.1 Considerações Iniciais 192.2 Dado de Teste, Caso de Teste e Conjunto de Teste 192.3 Etapas do Processo de Testes 202.4 Geração de Dados de Teste 212.5 Variáveis 23

3 Revisão Bibliográfica 26

4 Ambiente de Experimentação 31

4.1 Definição de Experimentação 324.2 Metodologia 334.3 Plano de Experimentação 364.4 Validação dos Dados 374.5 Execução do Experimento 384.6 Análise de Dados Coletados 404.7 Ameaças a Validade 504.8 Considerações Finais 51

5 Conclusão 52

5.1 Contribuições 535.2 Trabalhos Futuros 53

Referências Bibliográficas 55

Lista de Figuras

2.1 Domínios de entrada e saída de dado programa. Adaptada de (JORGE,2013). 22

4.1 Conjunto de ferramentas formado com Randoop - fase 1. 344.2 Conjunto de ferramentas formado com CodePro Tools - Fase 1. 354.3 Programas em projetos Maven. 384.4 Estrutura dos programas usando o Maven. 394.5 Forma como são gerados os testes no CodePro Tools. 404.6 Relação Cobertura de Códigos. 434.7 Relação Dados de Teste Gerados. 434.8 Relação Quantidade de Mutantes Gerados. 454.9 Relação Quantidade de Mutantes Mortos. 464.10 Relação Score de Mutação. 47

Lista de Tabelas

2.1 Lista de ferramentas de geração automática de dados de teste. 24

3.1 Trabalhos relacionados a avaliação de ferramentas. 30

4.1 Lista filtrada de ferramentas de geração automática de dados de teste. 324.2 Lista completa de ferramentas, versões e funcionalidades. 324.3 Hipótese. 364.4 Lista de programas utilizados para a geração dos experimentos. 374.5 Tabela com os dados analisados - CodePro Tools. 414.6 Tabela com os dados a serem analisados - Randoop. 424.7 Tabela com os dados analisados CodePro Tools e PIT Test. 444.8 Tabela com os dados analisados Randoop e PIT Test. 454.9 Tabela - Informações Estáticas dos Programas Java. 474.10 Cobertura e Declaração de Mutação - Score por Teste Gerado. 48

CAPÍTULO 1Introdução

O desenvolvimento de software é um processo composto por etapas, e o teste de

software é uma etapa que compõe esse processo.

Teste é uma atividade obrigatória para a garantia da qualidade de software.

Com base nesta etapa do processo, surgem diversos paradigmas e questionamen-

tos relacionados ao assunto (DELAHAYE; BOUSQUET, 2015).

Perguntas como, qual a melhor linguagem para o desenvolvimento, quais fer-

ramentas utilizar para geração de dados de teste, qual a melhor metodologia de testes

utilizar, e outros questionamentos surgem durante todo o projeto.

A presente pesquisa tem o intuito de avaliar eficácia, custo e força de um

conjunto de testes gerados de forma manual e automática em programas Java.

Para cobrir acima de 80% do código o profissional deve conhecer profundamente

as regras de negócio implementadas (BACHIEGA et al., 2016).

Um aspecto interessante pode ser observado em um trabalho reproduzido em

paralelo ao atual, conjuntos de teste gerados de forma automática complementam os

gerados de forma manual (BACHIEGA et al., 2016).

Nesse estudo, quando combinados conjuntos teste manuais com aqueles gerados

automaticamente, a média de cobertura de código e de escore de mutação aumentaram

mais de 10% em relação aos valores obtidos pelos conjuntos de teste individuais, man-

tendo um custo baixo.

Sendo assim, sugere-se que os testes manuais poderiam ser utilizados para testes

em partes essenciais e críticas do software podendo melhorar os resultados adicionando

dados de testes gerados automaticamente.

Ainda em relação a etapa de testes de software, existem vários processos bem

definidos para auxiliar na tarefa árdua, e onerosa que compõem este processo.

Entretanto, testes de software apresenta ainda muito potencial de melhoria e ma-

turação abrindo espaço para que os estudiosos e pesquisadores invistam seus conhecimen-

tos em busca de novas técnicas e procedimentos.

A fase de teste é tida como a etapa mais dispendiosas no processo de desenvolvi-

mento de softwares podendo ultrapassar 50% do custo total do projeto (DELAHAYE;

1.1 Motivação 13

BOUSQUET, 2015; SHARMA; BAJPAI, 2014; KRACHT; PETROVIC; WALCOTT-

JUSTICE, 2014).

O fator tempo impacta de forma direta no custo, sendo que quanto maior o tempo

gasto para o desenvolvimento e testes, maiores serão os gastos com mão de obra entre

outras variáveis que também dependem desta etapa.

De forma geral, a grande maioria dos autores envolvidos nessa linha de pesquisa

concordam que tanto o tempo quando os custos do processo devem ser reduzidos.

Isso pode ocorrer tanto em função de mudanças nas metodologias já existentes

quanto na automatização de atividades repetitivas, e muito onerosas do processo e que

demandem uma quantidade excessiva de tempo.

Existem vários segmentos relacionados a testes de software, dentre eles estão

a geração de dados de teste de forma manual e geração de dados de teste de forma

automática.

Em relação a geradores automáticos, a presente pesquisa está direcionada a

domínios de geração aleatória de dados de teste e geração baseada em heurísticas e

técnicas de otimização.

Quanto antes uma falha é identificada, menor será o custo de correção e menor a

possibilidade do projeto fracassar.

Os testes se iniciam em nível de unidade, seguido por testes de integração, e,

finalmente, são realizados os testes de sistema. Este trabalho tem foco nos testes unitários.

A seleção dos casos de teste tem fundamental importância para o processo, tendo

em vista que, idealmente, todas as unidades a serem testadas devem ser cobertas pelos

casos de teste.

Esse processo pode ocorrer de forma manual ou automatizada.

As entradas são geradas, mas o gerador não conhece as regras de negócio do

produto.

As regras não podem ser geradas de forma automática, mas uma vez definidas,

elas são a base para a identificação das saídas esperadas que cada unidade em teste deve

produzir.

1.1 Motivação

O fator predominantemente motivador para a elaboração dessa pesquisa está

relacionado às ferramentas e metodologias utilizadas no processo de testes e em como a

utilização de um determinado conjunto pode impactar nos resultados e custos do processo

como um todo.

1.1 Motivação 14

Alguns problemas identificados durante o andamento do projeto foram conside-

rados como potenciais oportunidades de melhorias a serem empregadas na fase de testes

de software.

Durante a elaboração da pesquisa, em uma pré-apresentação do trabalho aos

alunos de graduação ocorrida no estágio docência, na disciplina de Gerenciamento de

Projetos da Universidade Federal de Goiás, foi feita uma pergunta aos alunos, quais

atuavam do mercado como testadores. Na ocasião, 5 de aproximadamente 40 alunos

informaram serem atuantes em empresas distintas na cidade de Goiânia.

Esses alunos foram questionados quanto a quais estariam utilizando ferramentas

para geração de dados de teste de forma automatizada e nenhum deles estava utilizando

tais ferramentas em suas posições de trabalho até a ocasião (06/2015).

Dados obtidos através de 5 testadores somente e em um ambiente especifico, não

são indicadores conclusivos para saber se o problema abordado é realmente relevante, mas

agrega valor aos demais aspectos levantados no decorrer da pesquisa.

Por meio do relato acima mencionado e pela carência ainda presente no ambiente

de desenvolvimento direcionado ao estado de Goiás, podemos ter uma pequena amostra

quanto a como o mercado em questão apresenta potencial para estudo direcionado às

novas ferramentas, conjuntos e metodologias voltadas a teste de software.

Os 5 testadores mencionados na citação foram questionados quanto à relevância

de um estudo direcionado à geração de dados de teste de forma automatizada e todos

concordaram que o tema temmuita relevância para evitar a geração de dados tendenciosos

e a cobertura de domínios de entrada mais variados.

Conforme Fraser et al. (2014) relatam em seu artigo, sistemas geradores de dados

de testes de forma automatizada conseguem cobrir até 300% a mais do código fonte do

que conjuntos de teste gerados de forma manual e com base em seus estudos podemos

ter uma percepção maior quanto a relevância de dar continuidade a essa pesquisa e

desenvolver projetos que inovem a forma como o setor de desenvolvimento pode optar

por uma ferramenta ou metodologia que mais se adeque às suas necessidades.

Fraser et al. (2014) comentam ainda em sua pesquisa que a cobertura de código

não está diretamente associada a qualidade dos testes.

Boa parte dos dados de teste gerados são desnecessários por revelarem os mes-

mos defeitos, outros podem ser gerados de forma duplicada, e outros serem redundantes

por exercitarem as mesmas funcionalidades e explorarem os mesmos domínios de entrada.

Maiores detalhes quanto ao comparativo realizado por Fraser et al. (2014) serão

relatados no Capítulo 3.

Outros autores já avaliaram testes manuais e automáticos em contextos diferen-

tes. Por exemplo, Ma, Offutt e Kwon. (2005) defendem o fato de testes manuais e auto-

1.1 Motivação 15

matizados serem complementares. Eles também desenvolveram uma ferramenta chamada

auto teste, que combinam as melhores práticas relacionadas às duas técnicas.

A mesma conclusão foi obtida por Bachiega et al. (2016) utilizando metodologia

diferente e conjuntos de ferramentas também diferentes. A pesquisa de Bachiega et

al. (2016) foi gerara em paralelo a presente pesquisa, sendo de fundamental importância

para a obtenção de dados e elaboração deste texto.

Solingen V. Basili e Rombach. (2002) avaliaram a qualidade dos testes unitários

gerados de forma manual e os conjuntos de teste gerados de forma automática por meio

de dois geradores de dados, Randoop e JWalk. Smeets e Simons. (2011) aplicam testes de

mutação gerados pela MuJava (PACHECO; ERNST., 2007).

Randoop também foi objeto de estudos na presente pesquisa conforme veremos

de uma forma mais detalhada no Capítulo 4. Solingen V. Basili e Rombach. (2002)

defendem a ideia que geradores de teste automatizados são melhores em geral que

a geração de forma manual, considerando que os testes gerados de forma automática

garantem a integridade em áreas onde os testes são tendenciosos ou quando o teste é para

uma parte específica do código. Nesse estudo, tanto a pontuação obtida em relação a morte

de mutantes por meio de testes manuais quanto de testes gerados de forma automatizada

são baixas, inferior a 70%, e todos os conjuntos de testes podem ser considerados

incompletos em alcançarem uma boa cobertura de código e morte de mutantes ou score

de mutação.

Kracht, Petrovic e Walcott-Justice (2014) realizaram uma avaliação empírica

entre testes automatizados e testes manuais, com o objetivo de ajudar os desenvolvedores

na redução do custo do processo de testes.

Foram utilizados 10 programas disponíveis a partir de um repositório de soft-

ware (FRASER; ARCURI., 2016).

Foram selecionados programas com base no seu tamanho e disponibilidade para

geração de conjuntos de testes unitários de forma manual. Os geradores automáticos de

dados de teste utilizados na comparação foram EvoSuite e CodePro. A qualidade dos

conjuntos de teste foi baseada na cobertura de código e score de mutação ou morte de

mutantes.

Os resultados mostram que EvoSuite apresenta valores mais satisfatórios que

CodePro em termos de cobertura de código e score de mutação, entre tanto, os conjuntos

de testes gerados de forma manual apresentammaior cobertura que as ferramentas citadas.

(SIMONS., 2007) Relata o motivo pela qual foram selecionados os programas

testados em sua pesquisa. Apresenta o motivo que teve para selecionar programas de

tamanho que variavam de 18 mil à 783 linhas de código, ou seja, programas relativamente

grandes.

1.2 Objetivo do Trabalho 16

Apesar da presente pesquisa utilizar programas menores em relação a quantidade

de linhas de código, os resultados obtidos em relação a quantidade de linhas de código

foram bem próximos conforme veremos no Capítulo 4.

1.2 Objetivo do Trabalho

O objetivo da pesquisa é obter dados a partir de experimentações que possam

demonstrar as vantagens na utilização de ferramentas e metodologias já existentes dentro

de um ambiente controlado.

Por meio dos dados obtidos, responder a questionamentos como por exemplo

como selecionar uma ferramenta de geração automática de dados de testes que mais se

adeque às necessidades de uma equipe voltada a esta atividade?

Quais as melhores ferramentas e como utilizá-las em conjunto para que se tenha

os melhores resultados quanto à eficácia e eficiência?

Qual a ferramenta ou conjunto de ferramentas trabalha melhor para cobrir a

maior quantidade de cobertura de códigos possível?

Outro aspecto abordado será como os mesmos conjuntos de programas se

comportam por meio de testes gerados de forma manual e comparar esses dados aos testes

gerados de forma automatizada.

A utilização de ferramentas geradoras de dados de testes de forma automática

ainda apresenta potencial muito elevado de melhorias que levem a uma aceitação maior

por parte das empesas do ramos de desenvolvimento.

Além da dúvida relacionada a qual ferramenta adotar, outros questionamentos

também relacionados a essa mudança são levantados quando se fala no assunto.

A forma como a ferramenta geradora de dados de testes atua (aleatória ou ba-

seada em heurísticas de otimização), cobertura de código, número de defeitos revelados,

tempo gasto para percorrer o código, quantidade de falhas identificadas durante a execu-

ção, são critérios de qualidade importantes ao se considerar quando se deseja selecionar

ferramentas que gerem dados de teste automaticamente.

Como a ferramenta irá se comportar em relação a cobertura de código?

Como a ferramenta atua em relação ao tempo gasto em sua execução?

Os testes executados pela ferramenta são realmente confiáveis?

A ferramenta que será adotada é suficiente para atender as demandas da equipe

de testes ou será necessária a combinação de ferramentas para a obtenção de testes de

melhor qualidade?

Como base nesses questionamentos, surge a necessidade de avaliações que

justifiquem a escolha de uma ferramenta ou um conjunto específico de ferramentas que

1.2 Objetivo do Trabalho 17

se adequem mais às características de uma empresa que atenda da melhor forma às

necessidades dessa empresa.

1.2.1 Metodologia

O objetivo dessas avaliações consiste em realizar experimentos em ambiente

controlado com intuito de levantar dados que comprovem a qualidade do conjunto de

ferramentas de testes fundamentada em experimentos científicos.

Os experimentos foram executados em duas etapas e foram feitos em três

ferramentas geradoras de dados de teste de forma automática, um conjunto de testes

gerados de forma manual.

Para motivos de comparação, a presente pesquisa utiliza os mesmos programas

e os conjuntos de teste gerados manualmente na pesquisa de Souza et al. (2012).

Os conjuntos de teste gerados de forma automática foram obtidos a partir da

execução de três diferentes ferramentas:

• EvoSuite (FRASER; ARCURI., 2016): Estado da arte entre os geradores de dados

de teste.

• Randoop (PACHECO; ERNST., 2007): Gerador de dados de teste aleatório.

• CodePro (GOOGLE, 2010): Essa ferramenta foi descontinuada durante a pesquisa,

mas foi mantida pelo fato de já possuirmos os dados gerados por ela e em decor-

rência de estar ainda funcional e o plugin ainda poder ser instalado conforme será

apresentado no decorrer na pesquisa.

Ambas as técnicas foram somadas um conjunto com um gerador de relatórios

em formato JUnit que posteriormente foi alterado adequado às necessidades encontradas

na segunda parte do projeto conforme detalhado no 4.

A primeira ferramenta apresenta relatórios contendo dados sobre cobertura de

linhas de códigos e quantidade de dados de testes gerados.

A segunda ferramenta foi utilizada com o intuito de apresentar dados referentes

à quantidade de mutantes mortos pelo conjunto de teste gerado.

A ideia é utilizar o teste de mutação como modelo de defeitos que possam ser

detectados pelos testes e, desse modo, ter um parâmetro para comparar a eficácia dos

conjuntos de teste em detectar defeitos.

Esse método foi o mesmo nas duas fases do projeto.

A eficiência é mensurada considerando os resultados obtidos com o mínimo de

recursos possíveis, como por exemplo, a relação cobertura de código e quantidade de

dados gerados.

A eficiência é evidenciada em um gerador que apresente baixa quantidade de

dados gerados e uma boa cobertura de código.

1.3 Organização do Trabalho 18

O cálculo é realizado da seguinte forma:

Conjunto "A" atuando no programa "1" cobriu "X%" de código e gerou "Y" da-

dos de teste.

O mesmo é feito com os demais conjuntos e posteriormente são comparados os

valores de forma a chegar a um resultado que possibilite identificar quais os conjuntos

com melhor ou pior resultados em relação as métricas propostas.

A eficácia é mensurada pelo fato de conseguir atingir o resultado. Isso é visível

quando os dois conjuntos de software funcionam como esperado e sem apresentar falhas.

Além da comparação entre os conjuntos de teste gerados de forma automática,

foi realizado um comparativo entre um conjunto de testes gerados de forma manual

considerando aspectos que equiparem os conjuntos de teste de forma geral. Souza e

Prado (2011).

Uma descrição mais detalhada está disponível no Capítulo 4.

1.3 Organização do Trabalho

Este capítulo apresenta o contexto no qual este trabalho se insere, as motivações

para a sua realização e seus objetivos.

No Capítulo 2 são apresentadas, terminologias adotadas pela área de testes,

as fases e etapas que envolvem o processo de testes de software e dados referentes a

automação de testes de software com ênfase em técnicas de automação e tipos de testes

existentes.

O Capítulo 3 descreve os trabalhos relacionados a este e como os mesmos

contribuíram para o desenvolvimento desta pesquisa.

No Capítulo 4 é descrito como o ambiente de experimentação foi preparado,

como o plano de experimentação foi conduzido, e quais dados e resultados foram obtidos.

Finalmente no Capítulo 5 são apresentadas a conclusão e perspectivas de traba-

lhos futuros.

CAPÍTULO 2Terminologia e Conceitos Básicos

2.1 Considerações Iniciais

Dentro do segmento teste de software existem algumas divisões de conheci-

mento que vão desde etapas e fases de aplicação dos testes, técnicas e critérios e até

ferramentas e funcionalidades que envolvem essas ferramentas. Neste capítulo são apre-

sentadas as fases do teste e as principais técnicas e critérios que podem ser utilizadas em

cada uma delas.

2.2 Dado de Teste, Caso de Teste e Conjunto de Teste

Os casos de teste são representados da seguinte forma <I;Eo> onde I é uma

entrada, também chamada de dado de teste e Eo é a saída esperada em relação a unidade

específica.

Quando uma unidade é executada com I, produz uma saída resultante Ro.

Quando Ro for igual a Eo, a unidade em teste se comportou como especificado,

caso contrário, uma falha foi revelada pelo caso de teste e pode-se dar início ao processo

de depuração para descobrir qual(is) defeito(s) originou(aram) a falha.

A identificação do Eo não é uma tarefa fácil e, em geral, requer intervenção

humana aumentando assim o custo da criação de conjuntos de teste para um grande

número de unidades, uma vez que o testador irá gastar muito tempo na seleção de entradas

e determinar a saída esperada para cada uma dessas entradas.

Os geradores automatizados geram os dados de teste (a entrada), ou seja, eles não

são capazes, em geral, de gerar automaticamente as saídas esperadas para cada entrada.

No caso dos geradores utilizados neste estudo, geram os chamados casos de teste de

regressão.

Eles geram e executam determinada unidade com I e a saída resultante Ro é

considerada a saída esperada Eo. Desse modo, o par <I;Ro> consiste em um caso de teste

de regressão criado pelos geradores de teste automatizados empregados no estudo.

2.3 Etapas do Processo de Testes 20

No restante deste texto, quando citados casos de teste gerados por geradores

automatizados, esses casos de teste são casos de teste de regressão.

É possível verificar que todos os casos de teste de regressão passam sem falhas

na versão atual da unidade em teste. Esses casos de teste são úteis quando uma unidade

passa por alguma alteração e precisa ser reavaliada.

Em seguida, os mesmos casos de teste criados a partir da versão anterior são

utilizados para verificar se a nova versão da unidade está se comportando da mesma forma

de acordo com os casos de teste anteriores.

Qualquer discrepância deve ser variada, uma vez que pode ser devido a uma

falha na versão da nova unidade, ou pode ser um problema em assumir a saída resultante

anterior como a saída esperada.

Finalmente, um conjunto de teste é um conjunto formado por nenhum ou mais

casos de teste, ou seja, o conjunto de teste pode, inicialmente, ser vazio e, com o passar

do tempo, casos de teste são construídos (de forma manual ou automática) e adicionados

ao conjunto de teste.

2.3 Etapas do Processo de Testes

Por mais que uma equipe de testes seja competente e adote critérios de testes

bem definidos, a erradicação total de defeitos no produto de software não é total e alguma

falha acaba ocorrendo posterior a conclusão do projeto.

Os defeitos não estão diretamente relacionados somente à competência ou falta

de atenção das equipes de desenvolvimento e testes. Eles podem surgir por exemplo

em decorrência de atualizações em softwares ou incompatibilidade com hardwares, em

caso de comunicação com os mesmos, ou seja, os defeitos não ocorrem somente em

decorrência de fatores internos ao processo de desenvolvimento mas também podem

ocorrer por questões externas ao processo.

O intuito da atividade de testes em softwares é identificar a presença de defeitos

para que os mesmos possam ser localizados e corrigidos. E esse processo segue as

seguintes fases:

1. Identificar dos dados de teste que será utilizado de entrada para o teste;

2. Identificar a saída esperada para cada dado de teste definido;

3. Criar casos de teste, o qual é formado pelo dado de teste e pela saída esperada;

4. Executar os casos de teste no produto em testes;

5. Comparar a saída obtida com a saída esperada para cada caso de teste;

6. Analisar os resultados obtidos e, se falhas foram detectadas, localizar e corrigir o(s)

defeito(s) que a originou.

2.4 Geração de Dados de Teste 21

A atividade de teste pode ser executada em uma sequência de três fases.

A primeira delas é o teste de unidade, no qual cada unidade do software é

testada individualmente, buscando-se evidências de que ela funciona adequadamente. A

próxima fase, o teste de integração, é uma atividade sistemática para integrar as unidades

componentes da estrutura do software, visando identificar a presença de defeitos de

interação e comunicação entre as unidades. Finalizando, no teste de sistema é verificado

se todos os elementos do sistema combinam-se adequadamente e se a função/desempenho

global do sistema é atingida (PRESSMAN; MAXIM, 2014).

Conforme comentado anteriormente, a ênfase deste trabalho é avaliar geradores

de dados de teste automáticos para a execução da fase de teste de unidade.

Dada a grande importância do teste de software, esforços vêm sendo feitos

para padronizar algumas terminologias comumente utilizadas. O padrão ISO/IEC/IEEE

24765:2010 (ISO/IEC/IEEE, 2010) consiste de um glossário de termos de engenharia

de software e, os termos abaixo, também relacionados ao tema desta pesquisa, foram

extraídos dessa referência:

1. Cobertura de Código (Test Covarage): a porcentagem que determinados elementos

do código são executados em relação ao total de elementos existente no código.

Um dos elementos mais utilizados são instruções ou linhas de código. Nesse caso,

por exemplo, quanto mais instruções são executadas pelo conjunto de teste, maior

a cobertura de código obtida;

2. Teste deMutação (Mutation Testing): É uma técnica que consiste em inserir defeitos

de forma proposital no código com intuito de checar se os dados de teste são bons a

ponto de identificar tais defeitos. Muito utilizado em experimentação para se avaliar

ou comparar a eficácia de conjuntos de teste (ANDREWS; BRIAND; LABICHE,

2005);

3. Teste aleatório (Random testing): consiste em uma técnica de teste de software

cujos programas são testados por meio da geração de entradas escolhidas ao acaso

e independentes. Os resultados da produção são comparados com as especificações

de software para verificar se a saída obtida é aprovada ou reprovada em relação

a saída esperada. Em caso de ausência de especificações, as exceções lançadas são

usadas o que significa que, se surgir uma exceção durante a execução do teste, então

é possível concluir que existe uma falha no programa.

2.4 Geração de Dados de Teste

Quando se trata de geração de dados de testes, o ideal é que todas as possibi-

lidades de domínios e subdomínios de entrada possam ser executadas. Isso, em geral, é

impraticável tendo em vista que os domínios de entrada podem ser infinitos.

2.4 Geração de Dados de Teste 22

Figura 2.1: Domínios de entrada e saída de dado programa. Adap-

tada de (JORGE, 2013).

A automação da atividade de geração de dados de teste é extremamente desejá-

vel, entretanto, existem restrições associadas a atividade de testes que impossibilitam a

automatização da atividade por completo. As restrições encontradas na literatura são:

• Correção coincidente: ocorre quando o programa apresenta, coincidentemente,

um resultado correto para uma entrada particular, mesmo a entrada executando

comandos com defeitos. Isso ocorre pois um defeito pode corrigir o erro causado

por outro e a saída obtida corresponde à esperada;

• Caminho ausente: ocorre quando uma determinada funcionalidade requerida pelo

programa deixa de ser implementada por engano e o caminho não leva a essa

funcionalidade;

• Caminho não-executável: consiste em um caminho que está presente em um grafo

e pode ser requerido por algum critério mas, em função das restrições impostas,

não existe um dado de entrada que possibilite que a sequências de comandos do

caminho seja executada;

• Mutante equivalentes: ocorre quando o mutante sempre apresenta uma saída idên-

tica à do programa original, para todo e qualquer item de dado do domínio de en-

trada.

Existem diferentes técnicas já abordadas pela literatura com a finalidade de

satisfazer esses critérios. As técnicas mais conhecidas são geração aleatória de dados,

geração com execução simbólica, geração com execução dinâmica, geração utilizando

técnicas de computação evolutiva e geração de dados sensíveis a defeitos.

No contexto da presente pesquisa, são apresentadas duas ferramentas de geração

de dados de testes de forma automática. Uma trabalha com a técnica de geração aleatória e

a outra com funcionalidades de envolvem técnicas de heurísticas de otimização dos dados.

A proposta da presente pesquisa está ligada à geração de dados de teste de forma

automática, mas a compreensão da geração de dados de teste de forma manual é de

fundamental importância para a compreensão do processo como um todo.

2.5 Variáveis 23

No mercado, ainda é uma realidade a geração de dados de testes de forma

manual. Isso ocorre quando o testador não utiliza ferramentas para a obtenção dos dados

de teste. Os dados de entrada são gerados baseados nas saídas esperadas e inseridos com

intuito de analisar o comportamento dos programas o que acaba sendo uma forma muitas

vezes tendenciosa, considerando que o produto final será executado de forma a percorrer

o caminho esperado pela equipe de desenvolvimento, ou visando a satisfazer determinado

requisito de teste.

Em geral, a geração de dados de teste de forma manual é utilizada nas seguintes

situações:

• Testes que envolvam tarefas mais intelectuais e que exijam análise e pensamento

lógico;

• Testes de usabilidade;

• Tarefas dinâmicas;

• Em sistemas que apresentam ciclo de vida curto.

A geração automatizada de dados de testes, consiste na utilização de ferramentas

que executem os testes na aplicação, por meio da implementação de scripts. Dessa forma,

a ferramenta simula uma utilização do software testado e verifica os resultados esperados.

Em geral é utilizada nas seguintes situações:

• Quando envolver tarefas repetitivas;

• Aplicações com ciclos de vida longos;

• Testes que devem ser feitos com maior frequência.

A Tabela 2.1, extraída de Micskei (2013), apresenta uma lista de geradores auto-

máticos de dados de teste para diferentes linguagens de programação. A grande maioria se

concentra na geração de testes unitários. No contexto deste trabalho, a avaliação realizada

até o momento envolveu as ferramentas Randoop e CodePro, ambas para a linguagens

Java.

2.5 Variáveis

Com base nas hipóteses foram definidas as variáveis dependentes e independen-

tes do experimento.

Variável Independente: É qualquer variável que pode ser manipulada ou contro-

lada no processo de experimentação (MAHMOOD, 2007).

As principais variáveis independentes dessa pesquisa são:

* As ferramentas de teste adotadas;

2.5 Variáveis 24

Tabela 2.1: Lista de ferramentas de geração automática de dados

de teste.

Relação de Ferramentas

Ferramenta Linguagem

AutoTest EiffelCATG JavaCAUT CCREST CEvoSuite JavaGUITAR GUI application (JFC, Web)Jalangi JavaScriptKLEE C (LLVM bitcode)LCT Java

MergePoint/Mayhem binary (32bit, Linux)PathCrawler C

Palus JavaPET, jPET Java

Pex .NET codeRandoop JavaSAGE x86 binary

Symbolic PathFinder JavaCodePro Analytix JavaCUTE, jCUTE C, Java

DART CDOTgEAr Java

DSD-Crasher JavaEuclide CEXE C

Jcrashe JavaJET Java annotated with JMLjFuzz JavaKorrat JavaTAO C

* Os critérios de teste utilizados;

*A habilidade do testador em testar adequadamente os programas;

* O tamanho e complexidade dos programas a serem testados; e

* O conjunto de testes final;

Esse fator tem dois tratamentos: manual e automatizado. As outras variáveis

foram definidas para não interferir nos resultados.

A habilidade do testador é a mesma para os 32 programas, gerando um conjunto

de testes manuais de forma a possibilitar a formulação da hipótese.

Variáveis Dependentes: São aquelas em que o resultado da manipulação das

variáveis independentes podem ser observados (MAHMOOD, 2007).

Na presente pesquisa, as variáveis dependentes foram utilizadas para definirem

a eficácia do conjunto de testes e o score de mutação por programa.

Conforme mencionada na primeira fase do projeto, e mantida na segunda fase,

o teste de mutação foi utilizado como um modelo de falha para avaliar a capacidade dos

conjuntos de teste dos conjuntos de teste sobre a detecção de um conjunto bem conhecido

de defeitos representados pelos mutantes (DELAHAYE; BOUSQUET, 2015).

2.5 Variáveis 25

Quanto maior o número de mutantes mortos em um conjunto de testes, maior a

eficácia na detecção de falhas.

As variáveis dependentes servem para descrever o custo do conjunto de testes e

o número de casos de teste por conjunto de teste.

As variáveis dependentes para descrever a força para um conjunto de teste são:

* A cobertura em um conjunto de teste por programa;

* O Score de mutação de um conjunto de testes por programa;

CAPÍTULO 3Revisão Bibliográfica

Para a obtenção dos dados necessários para a realização da pesquisa, de uma

forma geral, foram considerados artigos científicos escritos em Português ou Inglês, que

continham informações relevantes tanto em aspectos de procedimentos para a realização

dos experimentos quanto relacionados à problemática abordada.

No trabalho de Delahaye e Bousquet (2015), é proposta uma metodologia para

seleção de ferramentas que apoiam o testes de mutação. Conceitua o teste de mutação

como uma injeção de defeitos nos códigos fonte com intuito de avaliar a eficácia de um

dado conjunto de teste.

O autor realiza seus experimentos comparando diversas ferramentas de mutação

para a linguagem Java: Bacterio; Javalanche; Jester; Judy; Jumble; MAJOR; MuJava;

MuClipse; e PIT.

O autor conclui que apesar de analisar esse conjunto de ferramentas, a escolha de

uma ferramenta de testes de mutação é um desafio. Para a obtenção dos dados referentes

a presente pesquisa a ferramenta adotada foi a PIT uma vez que, segundo Delahaye e

Bousquet (2015), foi a que apresentou melhor resultado e apresenta usabilidade melhor

que das demais avaliadas.

As ferramentas se diferem em relação a determinadas características o que

dificulta a geração de critérios que sejam relevantes no momento da avaliação do conjunto

de ferramentas.

Para cobrir essas dificuldades, Delahaye e Bousquet (2015) propõe critérios

avaliativos que satisfaçam as diferenças de características tendo assim dados suficientes

para uma conclusão em relação a sua avaliação de ferramentas.

Sharma e Bajpai (2014) falam das dificuldades encontradas pelos testadores de

gerarem os testes de forma manual dando ênfase em programas grandes. Um estímulo

para um estudo mais aprofundado em relação a ferramentas geradoras de dados de testes

de forma automatizada.

Oladejo e Ogunbiyi (2014) conduziram os experimentos são voltados à avaliação

de duas técnicas de teste de software: Concolic e Combinatória. Os autores concluíram

que em vários aspectos a técnica Combinatória supera a Concolic. Parte do protocolo

27

de experimentação foi utilizado como um guia para a obtenção dos dados analisados na

presente pesquisa.

O protocolo de experimentação empregado por Kracht, Petrovic e Walcott-

Justice (2014) também serviu como guia para a obtenção dos dados analisados e os dados

da obtidos são de fundamental importância para obtenção de uma comparação entre as

ferramentas CodePro, Randoop e geração de forma manual.

Por meio desses dados foi possível a obtenção de uma conclusão mais abrangente

da presente pesquisa em relação à cobertura de códigos usando estatística por amostra-

gem.

Fraser et al. (2014) realizaram testes com 97 pessoas comparando relação a

testes manuais e testes gerados por ferramentas de geração automática. As ferramentas

de geração de dados de teste de forma automática geram até 300% mais dados em relação

a geração manual.

Em outra pesquisa realizada por (FRASER; ARCURI, 2014) foi feita uma

avaliação da ferramenta EvoSuite. Os experimentos são realizados em uma seleção

aleatória de 100 programas de código aberto ou open source. Após extrair os relatórios

de dados gerados, concluiu-se que a cobertura média de código foi de 71%. A forma com

que os autores obtêm os dados de cobertura contribuíram para a elaboração do protocolos

de experimentação, obtenção de dados e cálculos estatísticos.

Chhillar e Bala (2014) focam seus esforços em obter métodos para a geração

de dados de teste que atendam requisitos de eficácia e eficiência. Para seus estudos

são utilizados algoritmos genéticos. Apesar do conjunto de ferramentas utilizado pelos

autores não ter relação com o conjunto de ferramentas da presente pesquisa, a forma

como ele trabalha com determinadas ferramentas para evitar que os dados extraídos sejam

tendenciosos serviram para auxiliar na forma de trabalho da presente pesquisa.

Gheyi et al. (2010) realizaram uma análise de ferramentas destinadas a diversas

tarefas. São reunidos diferentes conjuntos de ferramentas e aplicados seus recursos

em 3 softwares diferentes com intuito de analisar seu comportamento. As ferramentas

estudadas foram as seguintes: Findbugs; MuClipse; Randoop; EclEmma; Cobertura;

Clover; e Metrics.

Essas ferramentas foram estruturadas formando 4 diferentes conjuntos que são

os seguintes:

1. Randoop + EclEmma + (Clover, Cobertura);

2. Findbugs + Randoop;

3. MuClipse;

4. Metrics + (Findbugs + EclEmma + [Clover, Cobertura]);

A forma como Gheyi et al. (2010) trabalharam com ferramentas em conjunto

teve impacto direto em como seriam utilizados os conjuntos de ferramentas adotados

28

na presente pesquisa no qual as ferramentas Randoop, CodePro, EclEmma e PIT foram

adotadas como foco de estudo.

No trabalho de Fraser e Arcuri (2013) foram gerados dados de teste utilizando

as abordagens da EvoSuite e de SBST, aplicados a um conjunto de 100 programas

Open Sourse escolhidos de forma aleatória. Tanto o fato do autor utilizar um conjunto

de ferramentas a fim de obter dados de forma amostral para uma avaliação quanto a

forma como foram obtidos os dados de teste foram de fundamental importância para a

elaboração da presente pesquisa.

Singh, Causevic e Punnekkat (2014) realizaram um filtro tanto no que se refere

a material bibliográfico quanto aos tipos de ferramentas disponíveis para geração de

dados de teste de forma automática. Em seu trabalho são apresentadas as strings de busca

utilizadas para a obtenção dos materiais que foram utilizados para a elaboração de uma

revisão bibliográfica.

Os autores apresentam em uma tabela a fonte onde realizou a consulta, a string

utilizada, a quantidade de materiais encontrados e a data de realização da busca.

Por fim criou-se uma planilha contendo as ferramentas e descrevendo as carac-

terísticas de cada uma, a quantidade de material bibliográfico que encontrou de cada e

citações.

A lista de ferramentas influenciou na adoção de ferramentas para a obtenção de

dados da presente pesquisa em especial Randoop que é mencionada na pesquisa.

O paradigma de linguagens de programação estruturadas e orientadas a objetos

também são levados em consideração quando se trada de testes de software e, no trabalho

de Souza e Prado (2011), esses paradigmas são tratados de forma experimental com base

em testes de software.

Souza e Prado (2011) utilizaram 32 programas do domínio de estrutura de dados

em linguagem Java Orientada a Objetos (ZIVIANI, 2011a) e versões dos mesmo 32

programas são compilados em linguagem C estruturada (ZIVIANI, 2011b).

São gerados dados de teste de forma manual para cada o conjunto de programas e

os resultados obtidos são confrontados. A adequação dos conjuntos de teste desenvolvidos

para os programas procedimentais é avaliada em relação às implementações orientadas a

objetos e vice-versa.

Os autores informam que foi possível concluir que em relação a custo e a força

dos critérios de teste entre programas procedurais e Orientados a Objetos não apresentam

diferenças significativas suficientes para afirmar que uma metodologia é melhor que a

outra em relação a esses indicadores.

O estudo dos autores foi de fundamental importância em relação a presente

pesquisa tendo em vista que os mesmos 32 programas são utilizados no experimento,

29

viabilizando a comparação dos conjuntos de teste gerados automaticamente em relação

aqueles gerados manualmente no trabalho de Souza e Prado (2011).

Smeets e Simons (2010) conduziram experimentos comparando testes gerados

de forma manual com um conjunto de 3 ferramentas para a geração de dados de teste de

forma automática. O conjunto é composto pelas ferramentas Randoop, JWalk e µJava.

Em relação a todas as pesquisas mencionadas, várias foram as contribuições con-

forme foi pontuado anteriormente. Alguns domínios de estudo foram guias importantes

para a realização da pesquisa principalmente no que está relacionado a protocolo de ex-

perimentação e embasamentos teóricos.

As características de pesquisa que mais auxiliaram na elaboração da presente

pesquisa foram:

• Comparativo entre ferramentas;

• Comparativo entre procedimentos manuais e automatizados;

• Paradigmas relacionado ao setores de TI de forma geral;

• Abordagens para trabalhar com ferramentas geradoras de dados que atuem de

maneiras diferentes;

• Elaboração e aplicação de um protocolo de experimentação.

Todo o material citado foi utilizado como base para direcionar a elaboração da

presente pesquisa, entretanto, o trabalho de (SOUZA; PRADO, 2011) foi de fundamental

importância pois o mesmo conjunto de programas foi utilizado para a elaboração dos

experimentos.

Kracht, Petrovic e Walcott-Justice (2014) realizaram os experimentos são volta-

dos à comparação de testes gerados de forma manual e testes gerados utilizando automa-

ção na geração dos dados. Em sua conclusão os autores mencionam que utilizaram duas

ferramentas de geração de dados de teste: EvoSuite e CodePro. CodePro cobre 5% mais

de código que EvoSuite que por sua vez cobre 16,4% mais código que a geração manual.

Os dados apresentados por (KRACHT; PETROVIC; WALCOTT-JUSTICE, 2014), por

serem resultados de um experimento semelhante ao desenvolvido neste trabalho, serão

apresentados ao término confrontando os dados obtidos na presente pesquisa.

A Tabela 3.1 sintetiza a metodologia e as ferramentas empregadas em cada um

dos estudos mencionados acima.

30

Tabela 3.1: Trabalhos relacionados a avaliação de ferramentas.

Principais Trabalhos RelacionadosAtigo Metodologia Ferramentas

Bacterio;Javalanche;Jesper;Judy;

Delahaye e Bousquet (2015) Este artigo propõe uma metodologia paracomparar ferramentas de mutação. Jumble;MAJOR;MuJava;MuClipse; ePIT.

Fraser et al. (2014) Avaliação da ferramenta EvoSuite em realizada de formas diferentes. EvoSuite(FRASER; ARCURI, 2014)

Findbugs;MuClipse;Randoop;

Gheyi et al. (2010) Avaliação de conjuntos de ferramentas. EclEmma;Cobertura;Clover; eMetrics.Randoop;

Smeets e Simons (2010) Comparação de testes manuais e automatizados. Jwalk; eµJava.

Kracht, Petrovic e Walcott-Justice (2014) Comparação de testes manuais e automatizados. EvoSuit; eCodePro Tools.

CAPÍTULO 4Ambiente de Experimentação

Para a realização dos experimentos, foram levados em consideração alguns

elementos tais como:

A configuração do computador utilizado para a experimentação.

Conforme informando anteriormente, o experimento foi executado em duas

partes e levando em consideração itens que podem impactar nos experimentos como por

exemplo a configuração dos computadores.

O computador utilizado para rodar os experimentos na primeira parte possuía as

seguintes configurações:

• Sistema Operacional: Windows 8.1 Pro 64 bits;

• Processador: Core I5-3337U CPU @ 1.80 GHz; e

• Memória instalada (RAM): 6,00 GB (utilizável 5,87 GHz).

Os mesmos experimentos da primeira parte foram refeitos em um computador

diferente com as seguintes configurações:

• Sistema Operacional: Linux Ubuntu, 16.04 LTS64 bits;

• HD: 1TB; e

• Memória instalada (RAM): 8GB.

Para a experimentação, o escopo foi reduzido a ferramentas que trabalhem com

a linguagem Java, tenham saída de dados no formado JUnit, permitam a utilização de

testes de mutação em conjunto, que gerem dados de testes de forma automática e que são

Sistemas Open Source.

Versão do JDK: 1.7.0. Versão do eclipse: eclipse-jee-luna-SR2-win32-x86_64.

Após filtrar a tabela inicial de acordo com as características visadas para a

experimentação restaram as ferramentas ilustradas na Tabela 4.1:

Algumas dessas ferramentas estão descontinuadas ou são incompatíveis com as

características de plataforma, versão do Eclipse ou o projeto parou de ser atualizado e em

determinados casos as informações se perderam com links quebrados.

4.1 Definição de Experimentação 32

Tabela 4.1: Lista filtrada de ferramentas de geração automática de

dados de teste.

Relação de Ferramentas

Ferramenta Linguagem

EvoSuite JavaCodePro Tools JavaPET, jPET JavaRandoop Java

Symbolic PathFinder Java

Em decorrência desses problemas, na primeira fase do experimento os geradores

adotados foram os seguintes:

• CodePro;

• Randoop;

Na segunda fase, o experimento foi incrementado com testes gerados de forma

manual e testes gerados por EvoSuite, finalizando o experimento com a seguinte lista de

ferramentas e funcionalidades:

Tabela 4.2: Lista completa de ferramentas, versões e funcionalida-

des.

Ferramenta Versão PropósitoJavaNCSS 32.53 Gerador de Métricas EstáticasEvoSuite 1.0.3 Gerador de TesteCodePro Tools 7.1.0 Gerador de TesteRandoop 3.0.1 Gerador de TestePitest 1.1.10 Teste de Mutação e de CoberturaEclipse 4.5 Ambiente de Desenvolvimento IntegradoMaven 3.3.3 Construtor de AplicaçõesJUnit 4.12 Framework para Testes UnitáriosPython 2.7,11 Linguagem de Scripts

Essas ferramentas trabalharam em conjunto seguindo uma metodologia para a

obtenção dos dados que foram analisados.

Os conjuntos de ferramentas e forma de trabalho adotados estão detalhados na

Seção 4.1.

4.1 Definição de Experimentação

Aspectos tais como o tempo gasto pela ferramenta para a cobertura do código

foram cogitados, entretanto, o tempo é uma variante relativa pelo fato das ferramentas

4.2 Metodologia 33

não fornecerem o tempo gasto de forma precisa e também pelo fado das ferramentas não

trabalham da mesma forma.

Os conjuntos foram formados da seguinte maneira:

Na primeira faze do experimento, a ferramenta EclEmma foi adotada com intuito

de realizar a mensuração de cobertura de código dos conjuntos de teste gerados pela

Randoop e CodePro.

PIT teve a finalidade de geração de mutantes nos programas utilizados no

experimento visando avaliar a capacidade dos conjuntos de teste da Randoop e da

CodePro detectar os defeitos modelados pelos operadores da PIT.

Na segunda fase, a partir da lista de programas P, foram criadas especificações

Sp para um conjunto de testes manuais M, foram usados os geradores automáticos de

dados de teste, EvoSuite(it E), CodePro Tools(C) e Randoop(R), três conjuntos de testes

forma gerados para cada programa P. Com relação a Randoop, foi fixado um número

máximo de casos de teste equivalente a quantidade de casos de teste manuais usando

técnicas de otimização. A geração aleatória foi repetida 30 vezes e as médias forma

calculadas referente aos números de casos de teste gerados. Da mesma forma foi feito com

relação ao Score de Mutação. Em relação aos testes de mutação, foi utilizada a ferramenta

Pitest(PIT) (SOUZA et al., 2012), o que possibilitou calcular a pontuação das mutações

e também a cobertura após a execução de cada conjunto de teste. Após todos os ajustes

e configurações, forma escritos scripts Python para chamar o Maven executando todo o

processo de testes e obtendo os relatórios esperados por essa execução.

Com intuito de manter um histórico que possibilite uma futura reprodução

dos experimentos foi criado um blog onde está descrito um passo a passo de como

instalar o Randoop e o CodePro no Eclipse. Este blog está acessível pelo endereço:

http://quebrandoacabecati.blogspot.com.br/

Entre a primeira e a segunda fases do projeto, a ferramenta CodePro foi descon-

tinuada pela desenvolvedora Google, mas por meio dos dados contidos no blog acima

informado a mesma pode ser utilizada para fins de comparação.

Na segunda fase, decidimos manter os dados de CodePro pelo fato de ainda ser

uma ferramenta totalmente funcional e estar disponível para o uso da comunidade.

A instalação de CodePro no Eclipse foi verificada pela última vez em

(03/09/2016) e todos os recursos para a utilização encontram-se disponíveis.

4.2 Metodologia

Na primeira fase do experimento, a comprovação de vantagens em adotar uma

determinada ferramenta, foi levada em consideração tendo como base três características

fundamentais conforme segue:

4.2 Metodologia 34

• Tamanho do conjunto de teste gerado;

• Cobertura de código; e

• Score de mutação.

O ideal seria que a ferramenta gerasse um conjunto de teste com poucos elemen-

tos, que fossem capazes de executar grande parte do código fonte e, além disso, determinar

um alto score de mutação. Quanto mais próximo ela chegar desses objetivos melhor, será

a ferramenta de geração de dado de teste.

Para a obtenção de dados estatísticos relacionados aos geradores, outras ferra-

mentas foram utilizadas em conjunto com a finalidade de gerarem relatórios.

O experimento em questão foi executado em duas fases, sendo que na primeira

fase foram utilizadas as ferramentas a seguir:

{Randoop ou CodePro} + EclEmma + PIT Test Mutation, conforme Figu-

ras 4.1e 4.2:

Figura 4.1: Conjunto de ferramentas formado com Randoop - fase

1.

O conjunto de ferramentas completo que contemplou a segunda fase dos experi-

mentos encontra-se disponível na Tabela 4.2, informando as versões e funções.

A escolha de CodePro e Randoop se deu principalmente pelo fato de trabalharem

no Eclipse de uma forma bem similar, ambas têm plugin para o Eclipse, a forma de

instalação é similar e a forma como elas apresentam os resultados em testes unitários

é similar.

Outras ferramentas com similaridade no funcionamento foram cogitadas para

fazerem parte da pesquisa mas não funcionaram. Em contato o os desenvolvedores a

resposta é que o sistema fora descontinuado e não estaria funcionando mesmo.

4.2 Metodologia 35

Figura 4.2: Conjunto de ferramentas formado com CodePro Tools

- Fase 1.

Desta forma os geradores (Randoop e CodePro) foram utilizados nos experimen-

tos da primeira fase e na segunda fase os mesmo tornaram a ser utilizados em conjunto

com EvoSuite e dados gerados de forma manual, a PIT, foi a ferramenta responsável pela

geração dos mutantes que foram utilizados para representar possíveis falhas que os produ-

tos em teste pudessem ter. E a ferramenta EclEmma que foi utilizada para mensurar qual

a porcentagem de código fonte foi efetivamente executada pelos teste gerados na primeira

fase, sendo substituída por um script Phyton na segunda fase do experimento.

Os dados foram coletados em relação a um conjunto de 32 programas do

domínio de estrutura de dados totalizando 64 compilações responsáveis pela geração dos

dados que serão utilizados para a elaboração de um relatório estatístico. Os programas

foram extraídos do livro “Projeto de Algoritmos com Implementações em Java e C++”

de Ziviani (2011a) e já foram utilizados em experimentos anteriores (SOUZA; PRADO,

2011).

Os programas utilizados para a obtenção dos resultados são utilizados em geral

em um ambiente acadêmico e os dados gerados podem não condizerem com dados

obtidos em um ambiente real de desenvolvimento, entre tanto a forma de condução de

experimentos será a mesma. Apesar disso, a complexidade dos programas em nível de

método é semelhante à complexidade de aplicações reais em sua grande maioria.

A formulação da hipótese se deu com base no objetivo do trabalho de avaliar

conjuntos de testes gerados de forma automática e complementando essa avaliação com

conjuntos de testes gerados de forma manual.

Assume-se que efetivamente um conjunto de testes pode ser avaliado em temos

de score de mutação, determinando o custo, levando em consideração o tamanho do

4.3 Plano de Experimentação 36

conjunto de testes gerado e a força que pode ser medida por meio de cobertura dos testes

de mutação. As medidas podem ser influenciadas por alguns aspectos.

Na segunda fase, foram formuladas hipóteses conforme Tabela 4.3 a seguir:

Tabela 4.3: Hipótese.

Hipotese Nula Hipotese AlternativaNão ha diferença de Eficácia entre os testes Manuais (M) Ha diferença de Eficácia entre os testes Manuais (M)e conjuntos de teste Automatizados (A). e conjuntos de teste Automatizados (A).

H10: Eficácia (M) = Eficácia (A) H11: Eficácia (M) = Eficácia (A)Não ha diferença de Custo entre os testes Manuais (M) Ha diferença de Custo entre os testes Manuais (M)e conjuntos de teste Automatizados (A). e conjuntos de teste Automatizados (A).

H20: Custo (M) = Custo (A) H21: Custo (M) = Custo (A)Não ha diferença de Strength entre os testes Manuais (M) Ha diferença de Strength entre os testes Manuais (M)e conjuntos de teste Automatizados (A). e conjuntos de teste Automatizados (A).

H30: Strength (M) = Strength (A) H31: Strength (M) = Strength (A)

4.3 Plano de Experimentação

É composto por preparação de artefatos e ferramentas, a execução das atividades

definidas na Definição de Experimentação e a validação dos dados coletados durante a

execução.

O plano de experimentação ficou estruturado da seguinte forma. Um conjunto de

32 softwares em Java que implementam estruturas de dados (ZIVIANI, 2011a).

Os softwares utilizados para a obtenção desses resultados são os mesmos que

foram aplicados por Souza e Prado (2011) em seus experimentos, mesmo se tratando

de um teste diferente do que foi realizado no artigo. Como no experimento de Souza e

Prado (2011) os conjuntos de teste foram gerados manualmente.

Na primeira fase da presente pesquisa, o comparativo contemplou somente as

ferramentas Randoop e CodePro, evoluindo na segunda fase para um comparativo entre

as ferramentas já citadas juntamente com EvoSuite e testes gerados de forma manual.

Para facilitar a execução das ferramentas e manter a organização do experimento,

para cada um desses programas foi criado um projeto Maven (Apache Software Founda-

tion, 2002) correspondente, totalizando 32 projetos.

Esse procedimento foi adotado tanto para a primeira quanto para a segunda etapa

do projeto.

Na segunda fase do experimento, o primeiro passo na execução do programa é o

cálculo de métricas estáticas em relação a cada programa. Tabela 4.4.

Para cada programa, foram calculados o número de linhas de código fonte,

excluindo-se os comentários (NCSS), o número ciclomático de complexidade (CCN), o

número de casos de teste para cada programa, Manuais(M), EvoSuite(E), CodePro(C), e

o número máximo de casos de teste a partir de M, E ou C que foram usados para fixar

4.4 Validação dos Dados 37

Tabela 4.4: Lista de programas utilizados para a geração dos ex-

perimentos.

Id Nome Descrição1 Max Programa para obter o valor máximo de um conjunto.2 MaxMin1 Programa para obter os valores máximos e mínimos de um conjunto, de uma forma não-efiente.3 MaxMin2 Programa para obter os valores máximos e mínimos de um conjunto, de uma forma mais eficiente que MaxMin1.4 MaxMin3 Programa para obter os valores máximos e mínimos de um conjunto, de uma forma mais eficiente que MaxMin2.5 Sort1 Programa para ordenar um vetor de valores inteiros.6 FibRec Programa para calcular a seqüência de Fibonacci (recursivo).7 FibIte Programa para calcular a seqüência de Fibonacci (iterativo).8 MaxMinRec Programa para obter os valores máximos e mínimos de um conjunto maxmin de forma recursiva.9 Mergesort Classificando programa pelo método mergesort.10 MultMatrixCost Programa para obter o custo minimo para multiplicar n matrizes.11 ListArray Programa para manipular uma estrutura de dados lista, desenvolvidas através de acordos.12 ListAutoRef Programa para manipular uma estrutura de dados lista, implementado através de estruturas de auto-referência.13 StackArray Programa para manipular uma estrutura de dados pilha, desenvolvidas através de acordos.14 StackAutoRef Programa para manipular uma estrutura de dados pilha, implementado através de estruturas de auto-referência.15 QueueArray Programa para manipular uma estrutura de dados fila, desenvolvidas através de acordos.16 QueueAutoRef Programa para manipular uma estrutura de dados fila, implementado através da estrutura de auto-referência.17 Sort2 Classificando programa pelos métodos de seleção, inserção, Shell Sort, quicksort e heapsort.18 HeapSort Programa para manipular filas de prioridade, implementado através de acordos.19 PartialSorting Programa de triagem para obter os elementos k primeiro de um conjunto ordenado de tamanho n.20 BinarySearch Programa que implementa os métodos de busca seqüencial e binário para recuperação de informações.21 BinaryTree Programa que implementa árvore binária e suas operações.22 Hashing1 Programa que implementa o método de hash, usando listas ligadas para resolver colisões.23 Hashing2 Programa que implementa o método de hash, usando endereçamento aberto para resolver colisões.24 GraphMatAdj Programa para Manipular Uma Estrutura de Dados do Gráfico, implementado atraves de MATRIZes de adjacência.25 GraphListAdj1 Programa para manipular uma estrutura de dados do gráfico, implementado através de listas de adjacência usando estruturas auto-referência.26 GraphListAdj2 Programa para manipular uma estrutura de dados do gráfico, implementado através de listas de adjacência usando arranjos.27 DepthFirstSearch Programa que implementa uma busca primeiro depth- num gráfico.28 BreadthFirstSearch Programa que implementa uma busca primeiro breadth- num gráfico.29 Graph Programa para obter componentes fortemente conectados de um gráfico.30 PrimAlg Programa que implementa o algoritmo de Prim para a descoberta da árvore de cobertura mínima num gráfico ponderada.31 ExactMatch Programa que implementa o algoritmo de correspondência exata para pesquisar em strings.32 AproximateMatch Programa que implementa o algoritmo aproximado de correspondência para procurar em strings.

o número máximo de casos de teste gerados por Randoop (R), o número de requisitos

exigidos para cobrir os mutantes gerados considerando todos os operadores de mutação

disponíveis na ferramenta PIT.

Os testes manuais foram obtidos por meio de (FRASER; ARCURI, 2014).

O tempo de execução para este experimento corresponde ao tempo para executar

cada gerador de teste em cada programa, bem como o tempo para executar os scripts para

coletar os relatórios de cada métrica obtida no experimento.

Os geradores de teste exceto Randoop usaram a configuração padrão.

Para Randoop foram gerados 30 conjuntos de teste diferentes para cada programa

para evitar qualquer viés, que fixa o número máximo de casos de teste gerados pela outra

ferramenta.

Assim, Randoop leva mais tempo para gerar conjuntos de teste e gerar os

relatórios dos experimentos.

4.4 Validação dos Dados

Antes de executar os scripts para a geração automática de dados, todas as fer-

ramentas foram executadas manualmente em dois programas diferentes para certificar de

que iriam obter as informações necessárias. Posteriormente, foram comparados os dados

gerados de forma manual aos gerados pelos scripts e como não apresentaram diferenças,

aumentou a confiança no roteiro iniciando assim a geração para os 32 programas.

4.5 Execução do Experimento 38

4.5 Execução do Experimento

Após levantamento de como seriam estruturados os conjuntos de ferramentas a

serem utilizadas nos experimentos, o próximo passo foi a criação dos projetos Maven para

cada software que seria testado pelas ferramentas conforme Figura 4.4.

Figura 4.3: Programas em projetos Maven.

Dentro de cada Maven Project, os programas foram inseridos na pasta

src/main/java e as classes testadas organizadas em src/test/java conforme vemos na Fi-

gura 4.5:

O próximo passo foi a realização da geração de dados de teste utilizando a

ferramenta CodePro. A ferramenta gera abaixo do programa uma nova pasta com amesma

4.5 Execução do Experimento 39

Figura 4.4: Estrutura dos programas usando o Maven.

nomenclatura do programa testado seguida pela palavra Test conforme marcação 1 da

Figura 4.5. Também mostra a quantidades de dados de teste que foram gerados para a

classe testada conforme marcação 2 da Figura 4.5.

Nesse caso foi preciso fazer algumas configurações para que os testes fossem

possíveis. Os testes contidos no projeto Test são copiados para src/test/java do projeto

origem e o Java Build Path é configurado com as seguintes bibliotecas:

• JRE System Library [jre7];

• JUnit 4;

• Maven Dependencies;

Após toda estruturação dos conjuntos de ferramentas e dos softwares gerados

é possível coletar os dados de saída dos JUnits gerados por ambas as ferramentas e

alimentar algumas planilhas que serão detalhadas na seção a seguir.

4.6 Análise de Dados Coletados 40

Figura 4.5: Forma como são gerados os testes no CodePro Tools.

4.6 Análise de Dados Coletados

A obtenção dos dados analisados foi realizada por meio de uma tabela que foi

alimentada de acordo com a execução dos experimentos.

Os primeiros dados coletados foram da ferramenta CodePro conforme Ta-

bela 4.5:

O CodePro é uma ferramenta da Google que gera os dados de teste de forma

automática por meio de uma inteligência artificial. O desenvolvedor menciona que a

ferramenta utiliza heurísticas de otimização mas não detalha como essa tecnologia é

implementada e a forma com a qual ela trabalha. O que difere essa ferramenta das demais

é o fato dela conseguir alta cobertura do código com baixa quantidade de dados de teste.

Não é necessário entrar com a quantidade de tempo que a ferramenta irá gerar os dados

de teste ou a quantidade de dados de teste a ferramenta deve gerar, ou seja, o critério

de parada de CodePro, está em gerar dados de teste até que determinada cobertura seja

atingida ou até que um certo número de iterações seja alcançado.

A segunda ferramenta analisada foi a Randoop, e os dados obtidos alimentaram

a Tabela 4.6.

4.6 Análise de Dados Coletados 41

Tabela 4.5: Tabela com os dados analisados - CodePro Tools.

Dados CodePro ToolsIdentificador Programa Cobertura (%) Qtd Casos de Teste

1 Max 45,8 62 MaxMin1 97,5 43 MaxMin2 76 44 MaxMin3 89,5 65 Sort1 19,1 46 FibRec 95 57 FibIte 87,5 28 MaxMinRec 98,3 59 Mergesor 3,8 210 MultMatrixCost 0 1611 ListArray 95,1 3912 ListAutoRef 95,1 1613 StackArray 94,3 1614 StackAutoRef 93 715 QueueArray 93,6 1616 QueueAutoRef 71,6 817 Sort2 33,3 2618 HeapSort 88,8 1119 PartialSorting 31,8 1220 BinarySearch 69,3 1121 BinaryTree 69,3 1122 Hashing1 69,3 1123 Hashing2 69,3 1124 GraphMatAdj 69,3 2225 GraphListAdj1 40,7 2426 GraphListAdj2 58,4 2227 DepthFirstSearch 58,3 2528 BreadthFirstSearch 56,9 1329 Graph 35,1 2230 PrimAlg 35,1 2231 ExactMatch 96,3 5332 AproximateMatch 100 53

Médias 66,7 15,6

Essa ferramenta gera dados de teste de forma randômica e tem a necessidade que

o usuário informe alguns dados a ela. O que difere o Randoop do CodePro tools é que o

segundo não tem necessidade de nenhuma informação nesse sentido pois a forma com a

qual trabalha é diferente.

Para que os dados obtidos entre as duas ferramentas pudessem ser comparados,

foi observado o tempo gasto aproximado pela ferramenta CodePro para gerar os dados de

teste e informado ao Randoop que gerasse os dados de teste em tempo aproximado. Para

cada programa foi dado o tempo de 1 segundo. Para que o mesmo pudesse gerar dados

realmente de forma aleatória, foram geradas chaves de números pseudo aleatórios obtidos

a partir do relógio do computador.

A seguir apresenta-se a Tabela 4.6 com os dados a serem analisados, extraídos

da Randoop:

4.6 Análise de Dados Coletados 42

Tabela 4.6: Tabela com os dados a serem analisados - Randoop.

Dados RandoopIdentificador Programa Chave Aleatória Cobertura (%) Qtd Casos de Teste

1 Max 45 52,1 4462 MaxMin1 43 37,8 1363 MaxMin2 86 100 1194 MaxMin3 70 34,2 975 Sort1 36 68,1 3356 FibRec 62 60 57 FibIte 5 100 88 MaxMinRec 3 53,1 879 Mergesor 81 91,5 5410 MultMatrixCost 75 1,6 211 ListArray 81 1,8 212 ListAutoRef 42 1,8 213 StackArray 64 2,1 214 StackAutoRef 44 100 3715 QueueArray 19 2,4 216 QueueAutoRef 0 100 5017 Sort2 32 22,7 6418 HeapSort 86 27,1 8819 PartialSorting 57 19,5 1320 BinarySearch 54 4 621 BinaryTree 67 27,1 2522 Hashing1 73 27,1 8823 Hashing2 91 88,7 5724 GraphMatAdj 38 71,9 8425 GraphListAdj1 3 65,2 5626 GraphListAdj2 60 58,4 2427 DepthFirstSearch 52 71,7 4928 BreadthFirstSearch 47 35,7 2829 Graph 67 63,7 3130 PrimAlg 71 49,8 2131 ExactMatch 44 90,8 3432 AproximateMatch 41 100 126

Médias - 48,1 68,1

As médias dos dados obtidos para a analise já foram inclusas nas tabelas

pertinentes a cada ferramenta.

Para que fosse possível a obtenção uma margem de erro foi gerado um desvio

padrão utilizando a técnica de amostragem. Após a coleta dos dados de cada ferramenta

foram realizadas análises comparativas.

Primeiramente relacionada aos dados de cobertura de ambas as ferramentas:

CodePro Tools apresentou cobertura média de código igual a 66,7% enquanto

Randoop apresentou cobertura média do código igual a 48,1%. CodePro Tools apresentou

18,6% mais cobertura de código que Randoop nos casos avaliados. Figura 4.6

O desvio padrão de cobertura de códigos para CodePro Tools ficou em 29,2%.

Randoop, apresentou desvio padrão igual a 34,4%. Randoop apresentou a diferença de

5,2% a mais de variação na cobertura de códigos o que CodePro Tools.

A segunda comparação foi relacionada a quantidade de dados de testes gerados:

CodePro Tools gerou uma média de 15,6 dados de teste por código analisado

enquanto Randoop gerou uma média de 68,1 dados de teste por programa analisado.

4.6 Análise de Dados Coletados 43

Figura 4.6: Relação Cobertura de Códigos.

Randoop gerou aproximadamente 52,5 mais dados de teste em sua média que CodePro

Tools.

Figura 4.7: Relação Dados de Teste Gerados.

Na análise do desvio padrão, a variação de CodePro Tools foi menor que a do

Randoop. CodePro Tools apresentou 13 de variação e Randoop 94,3. O desvio padrão de

Randoop apresentou 81,3 mais variação que CodePro Tools;

Para coletar dados referentes a testes de mutação, a ferramenta adotada foi o PIT

Mutation Test. O teste de mutação é uma técnica na qual são inseridos erros no código

fonte de forma proposital para que se possa avaliar a eficácia dos dados de teste gerados.

O PIT Mutation Test realiza testes de mutação nos dados de teste gerados pelas

duas ferramentas de geração automática de dados de teste.

4.6 Análise de Dados Coletados 44

O intuito da utilização dessa ferramenta é levantar a quantidade de mutantes

gerados para os dados de teste, obter a informação referente a quantidade de mutantes

mortos pela ferramenta e o score de mutação para ambas as ferramentas demonstrado nas

planilhas a seguir:

Tabela 4.7: Tabela com os dados analisados CodePro Tools e PIT

Test.

Dados CodePro Tools e PIT TestIdentificador Programa Mutantes Gerados Mutantes Mortos Escore de mutação

CodePro CodePro CodePro1 Max 20 5 25%2 MaxMin 10 4 40%3 MaxMin 8 4 50%4 Maxmin 28 8 25%5 Ordenacao 10 3 30%6 Fibonacci 15 10 67%7 Fibonacci 6 4 67%8 MaxMin 15 5 33%9 Ordenacao 31 2 6%10 AvaliaMultMatrizes 41 0 0%11 ListArray 26 3 12%12 Lista 26 3 12%13 Pilha 20 1 5%14 Pilha 8 7 88%15 Fila 20 3 15%16 Fila 8 3 38%17 Ordenacao 41 2 5%18 FPHeapMax 0 0 0%19 FPHeapMin 0 0 0%20 Tabela 0 0 0%21 ArvoreBinaria 41 18 44%22 TabelaHash 41 19 46%23 TabelaHash 41 18 44%24 Grafo 54 19 35%25 Grafo 37 15 41%26 Grafo 41 17 41%27 Grafo 47 23 49%28 CasamentoExato 42 7 17%29 Grafo 34 12 35%30 Grafo 34 12 35%31 CasamentoExato 83 35 42%32 CasamentoAproximado 83 35 42%

Médias 31 7 35%

Neste cenário, ocorreu a obtenção das seguintes métricas:

CodePro Tools apresentou uma média de geração de mutantes igual a 31 en-

quanto Randoop, apresentou a média de geração de mutantes igual a 34, dando uma di-

ferença média igual a 3 mutantes a mais gerados em Randoop conforme consta na Fi-

gura 4.8:

CodePro Tools apresentou desvio padrão por amostragem de 19,8 enquanto

Randoop apresentou desvio padrão por amostragem de 20,3 com diferença de variação

de 0,5 a mais para Randoop.

4.6 Análise de Dados Coletados 45

Tabela 4.8: Tabela com os dados analisados Randoop e PIT Test.

Dados Randoop e PIT TestIdentificador Programa Mutantes Gerados Mutantes Mortos Escore de mutação

Randoop Randoop Randoop1 Max 20 3 15%2 MaxMin 10 3 30%3 MaxMin 8 2 25%4 Maxmin 28 5 18%5 Ordenacao 20 2 20%6 Fibonacci 0 0 0%7 Fibonacci 6 6 100%8 MaxMin 15 5 33%9 Ordenacao 31 13 42%10 AvaliaMultMatrizes 41 0 0%11 ListArray 26 0 0%12 Lista 26 0 0%13 Pilha 20 0 0%14 Pilha 8 7 88%15 Fila 20 0 0%16 Fila 8 6 75%17 Ordenacao 41 0 0%18 FPHeapMax 41 9 22%19 FPHeapMin 41 9 22%20 Tabela 58 2 1%21 ArvoreBinaria 41 7 17%22 TabelaHash 41 9 22%23 TabelaHash 41 0 0%24 Grafo 54 33 61%25 Grafo 37 24 65%26 Grafo 41 18 44%27 Grafo 55 36 65%28 CasamentoExato 42 0 0%29 Grafo 34 0 0%30 Grafo 34 0 0%31 CasamentoExato 83 27 33%32 CasamentoAproximado 83 43 52%

Médias 34 5 22%

Figura 4.8: Relação Quantidade de Mutantes Gerados.

4.6 Análise de Dados Coletados 46

Em relação a mutantes mortos por ambas as ferramentas os resultados foram os

seguintes:

CodePro Tools apresentou média de mutantes mortos igual a 7 enquanto Ran-

doop apresentou a média de 5. CodePro Tools matou uma média de 2 mutantes a mais

que Randoop conforme vemos na Figura 4.9:

Figura 4.9: Relação Quantidade de Mutantes Mortos.

CodePro Tools apresentou desvio padrão por amostragem em relação a mutantes

mortos igual a 9,5 e Randoop apresentou desvio padrão por amostragem igual a 11,8 com

diferença de variação de 2,3 a mais para Randoop.

Em relação aos dados obtidos referentes a Score de Mutação, CodePro Tools

apresentou Score Médio igual a 35% enquanto Randoop apresentou score de mutação

igual a 22%. A diferente foi de 13% a mais para CodePro Tools que para Randoop

conforme vemos na Figura 4.10:

CodePro Tools apresentou desvio padrão por amostragem em relação a score de

mutação igual a 0,2% enquanto Randoop apresentou score de mutação igual a 0,3%.

Na segunda fase do experimento, os dados coletados foram inseridos em duas

tabelas diferentes conforme segue:

Caracterizando os programas utilizados no experimento, a partir da Tabela 4.9,

pode-se ver que são programas de uma forma geral simples, implementados com 1 a

3 classes (1,5 em média), 6,2 métodos em média apresentando cerca de 40,5 linhas de

código.

A coluna CCM representa a complexidade máxima ciclomática encontrada nos

métodos de um programa, e CCA é a complexidade média ciclomática.

CCM varia de 2 (mínimo) a 9(no máximo) de complexidade ciclomática, em

média 4.8.

4.6 Análise de Dados Coletados 47

Figura 4.10: Relação Score de Mutação.

Tabela 4.9: Tabela - Informações Estáticas dos Programas Java.

Informações Estáticas dos Programas JavaID Programa NCSS CCM CCA M E C R R Limit #Req #Mut1 Max 8 3 3.0 3 6 3 5.3 6 4 142 MaxMin1 13 4 4.0 5 6 3 5.0 6 8 213 MaxMin2 14 4 4.0 5 5 4 4.2 5 8 214 MaxMin3 32 9 9.0 5 10 5 8.0 10 16 615 Sort1 11 4 4.0 3 4 4 3.5 4 10 216 FibRec 8 2 2.0 3 4 2 4.0 4 6 127 FibIte 8 2 2.0 3 4 2 4.0 4 6 128 MaxMinRec 26 5 5.0 7 3 4 6.7 7 13 419 Mergesort 22 6 4.0 6 1 2 4.0 6 16 5610 MultMatrixCost 18 6 6.0 5 4 6 4.7 6 14 7511 ListArray 20 3 1.8 14 7 7 6.4 14 12 2912 ListAutoRef 23 2 1.3 7 3 6 3.3 7 12 2113 StackArray 20 3 1.8 17 10 8 8.1 17 12 2714 StackAutoRef 27 3 1.4 10 65 7 4.8 10 17 2715 QueueArray 24 3 2.0 14 7 9 6.8 14 19 4016 QueueAutoRef 32 3 1.6 10 5 8 4.8 10 23 3217 Sort2 74 6 3.4 15 7 26 19.5 26 49 14118 HeapSort 59 5 2.7 21 6 25 14.2 25 40 11619 PartialSorting 62 5 2.5 25 14 26 15.6 26 42 12020 BinarySearch 32 8 3.5 10 8 10 5.1 10 21 5521 BinaryTree 85 7 3.0 14 10 5 6.7 14 48 14522 Hashing1 61 5 2.1 11 7 13 6.1 13 35 8823 Hashing2 88 7 3.2 11 10 26 11.9 26 51 16224 GraphMatAdj 60 5 2.9 19 1 22 13.1 22 42 13425 GraphListAdj1 66 4 1.6 18 5 22 12.7 22 34 9526 GraphListAdj2 88 6 2.2 19 4 23 11.9 23 51 11327 DepthFirstSearch 65 4 1.6 1 2 22 14.7 22 33 9428 BreadthFirstSearch 65 4 1.6 5 3 22 14.7 22 33 9429 Graph 65 4 1.6 4 3 22 14.7 22 33 9430 PrimAlg 40 7 2.6 1 2 20 19.0 20 31 7131 ExactMatch 55 8 6.3 16 4 53 53.0 53 40 20532 AproximateMatch 24 7 7.0 8 5 14 14.0 14 19 88

Avg 6.2 4.8 3.1 9.8 5.5 13.5 10.3 15.3 24.9 72.7SD 5.3 1.9 1.8 6.4 3.0 11.3 9.2 10.3 15.0 50.6

4.6 Análise de Dados Coletados 48

Tabela 4.10: Cobertura e Declaração de Mutação - Score por

Teste Gerado.

Cobertura e Declaração de Mutação - Score por Teste GeradoCobertura por Conjunto Teste Score de Mutação por Conjunto de Teste

ID M E C R M E C R1 75.0 100.0 50.0 93.3 85.7 71.4 28.57 38.62 87.5 100.0 87.5 94.2 81.0 66.7 52.38 25.73 87.5 100.0 87.5 91.7 81.0 28.6 52.38 24.94 93.8 100.0 75.0 84.8 72.1 26.2 13.11 11.25 90.0 100.0 50.0 60.7 81.0 81.0 42.86 17.66 83.3 100.0 83.3 98.9 100.0 100.0 83.33 95.87 83.3 100.0 83.3 98.9 100.0 75.0 83.33 95.88 92.3 100.0 23.1 88.5 80.5 19.5 7.32 18.29 93.8 93.8 12.5 66.9 91.1 21.4 5.36 17.910 92.9 92.9 92.9 90.5 38.7 30.7 48.00 27.811 100.0 100.0 75.0 71.7 65.5 69.0 24.14 36.112 100.0 100.0 91.7 95.0 71.4 66.7 52.38 58.313 100.0 100.0 100.0 81.7 74.1 74.1 44.44 61.114 100.0 100.0 94.1 88.4 66.7 77.8 62.96 63.015 78.9 100.0 73.7 68.4 57.5 85.0 22.50 39.616 100.0 100.0 78.3 89.0 68.8 65.6 34.38 64.017 97.9 70.8 64.6 64.0 85.8 35.5 32.62 21.018 97.5 80.0 85.0 56.9 76.7 39.7 43.97 19.919 28.6 97.6 28.6 57.4 29.2 45.8 6.67 22.420 100.0 100.0 71.4 52.5 69.1 67.3 23.64 15.021 81.3 58.3 37.5 46.5 55.9 21.4 8.97 14.322 100.0 100.0 77.1 85.0 59.1 58.0 28.41 45.723 80.8 94.2 82.7 92.4 47.5 51.2 30.86 47.524 100.0 0.0 83.3 83.6 73.1 0.0 52.24 52.925 97.1 64.7 82.4 79.5 68.4 37.9 45.26 43.526 96.1 78.4 68.6 60.5 73.5 30.1 35.40 30.927 60.6 30.3 81.8 74.3 30.9 10.6 30.85 33.4

28 39.4 18.2 81.8 74.3 13.8 11.7 30.85 33.429 84.8 18.2 81.8 74.3 38.3 10.6 30.85 33.430 93.8 43.8 50.0 28.1 38.0 5.6 5.63 1.431 97.5 72.5 100.0 96.1 40.0 21.0 51.22 41.532 94.7 100.0 100.0 92.3 29.5 31.8 37.50 33.0Avg 87.8 81.7 73.0 77.5 63.9 44.9 36.0 37.0SD 16.9 29.1 22.6 17.3 22.0 27.2 20.0 22.1

CCA varia de 1,25 (mínimo) a 9 (máximo) de complexidade ciclomática, em

média 3,1.

As duas últimas colunas apresentam o número de requisitos de teste exigidos

para critério de cobertura e critérios de teste de mutação. No caso de experimento de

mutação, foram usados todos os operadores de mutação implementados no PIT.

As colunas rotuladas M, E e C correspondem ao número de casos de teste gerados

manualmente M, automaticamente por EvoSuite E, e automaticamente por CodePro C.

A coluna Limit R é o valor máximo entre M, E e C e é utilizada para limitar o

número de casos de teste aleatórios do Randoop, permitindo assim gerar o estudo.

A coluna R corresponde ao número médio de testes aleatórios gerados para cada

programa com Randoop. Padrão de 30 testes por programa.

Observou-se que o conjunto de testes manuais teve em média 9,8 casos de teste.

4.6 Análise de Dados Coletados 49

EvoSuite gerou em média 6,5 casos de teste, CodePro gerou 13,5 casos de teste

e Randoop gerou 10,3 casos de teste em média.

Especialmente para EvoSuite e CodePro, considerou-se este conjunto de casos

de teste gerenciáveis no sentido de que se o testador quer verificar se eles estão corretos,

é uma tarefa viável.

Além disso, o desvio padrão do conjunto de testes M e E é menor que os

apresentados por C e R.

Portanto, em relação a custo, devemos aceitar a alternativa H21 da hipótese em

relação a custo de testes gerados de forma manual e automatizada.

A Tabela 4.10 apesenta os dados referentes a declaração de cobertura e o score

de mutação.

A partir da Tabela 4.10, os resultados dos conjuntos de melhor a pior resultado

ficaram na seguinte ordem M, E, R e C.

Em média M obtitda de uma cobertura de 87,8% com um desvio padrão (SD) de

16,9%;

E obtida uma cobertura de 81,7% e (SD) de 29,1%;

R obtida uma cobertura de 77,5% e (SD) de 17,3%; e

C obtida uma cobertura de 73,0% e (SD) de 22,6%.

Mas há situações específicas em que um conjunto de testes apresentam desem-

penho melhor que outros

Em negrito na Tabela 4.10 estão conjuntos de teste que apresentaram melhor

desempenho.

Quando a cobertura foi igual, também foram negritados os valores nas células.

Observando o padrão, E gerou mais conjuntos de teste com 100% de cobertura

seguido por M.

Apenas em 27, 28 e 31, it C obteve melhores resultados. Eles estão entre os

programas mais complexos e ambos os conjuntos de teste M e E não conseguiram superar

C.

EvoSuite não conseguiu gerar casos de teste para o programa 22 e não foi

possível identificar a razão para isso.

No caso de Score de mutação, os valores obtidos não foram muito altos. Mais

uma vez M obteve um melhor resultado médio com score de mutação de 63%, seguido de

E com um resultado de mutação de 44,9%, seguido de R, com 37%, e C com 36%.

A diferença média que representa o score de mutação é significante embora o

desvio padrão para todos os conjuntos de teste é de cerca de 20%.

Uma possível causa dessa diferença é que em caso de score de mutação, para

distinguir o comportamento entre o programa original e seus mutantes, PIT usa as

4.7 Ameaças a Validade 50

afirmações presentes em cada caso de teste. Estas pontuações são realmente muito baixas,

considerando que normalmente é fácil matar 80% dos mutantes.

Quando o testador escreve casos de teste de forma manual, ele tem conhecimento

sobre o programa e seus métodos. Ele verifica se o resultado é correto e avalia o

comportamento de um método ou se o mesmo corresponde a um método vazio.

Por outro lado, geradores automatizados em geral, omitem algumas informações

como por exemplo se um método está vazio. Além disso, PIT mede a cobertura e gera

mutantes de bytecode.

No caso de CodePro, que gera dados de teste a partir do código fonte, quando

uma classe não declarar explicitamente o construtor padrão, nenhum caso de teste é

gerado para testá-lo, mas PIT funciona em bytecode. Ele vai encontrar a construção

padrão no bytecode, e irá gerar requisitos de teste e mutantes para ele.

Considerando as hipóteses estabelecidas, observou-se uma diferença na eficácia

nos conjuntos de teste gerados de forma manual e automatizada. Os resultados referentes a

scores de mutação para os conjuntos de teste gerados de forma manual apresentam melhor

resultado na detecção de falhas modeladas por operadores de mutação. Neste sentido, a

hipótese H11 foi aceita em relação a eficácia. Em termos de força, os conjuntos de teste

apresentaram valores bem próximos e não foi possível confirmar que não há diferença na

força, sendo aceita a hipótese H31 em relação a eficácia.

4.7 Ameaças a Validade

A pesquisa é voltada a avaliar um grupo de ferramentas e extrair dados referente

ao comportamento dessas ferramentas com o intuito de facilitas a escolha de um usuário

por uma ferramenta que atenda melhor as suas necessidade.

Levando em consideração essa informação, desde que se tenham duas ou mais

ferramentas para em funcionamento perfeito os dados podem ser extraídos e comparados

o que reduz a possibilidade de refutar uma provável hipótese.

Mesmo assim, alguns fatores são considerados de rico a validade dos experimen-

tos como por exemplo:

• A falta de conhecimento relacionado as funcionalidades das ferramentas por parte

do testador;

• O fato de uma ferramenta ser totalmente descontinuada no decorrer do projeto

inviabilizando a execução dos experimentos;

• A incompatibilidade de uma ferramenta com uma plataforma específica ou até

mesmo que não se adapte as ferramentas utilizadas na extração dos dados.

4.8 Considerações Finais 51

Algumas ferramentas foram descontinuadas já no início do projetos e outras no

decorrer do mesmo. Quando mantemos as mesmas carateristas do grupo de ferramentas

os dados podem ser obtidos da mesma forma, mas em caso de alguma alteração no grupo

de ferramentas, podemos inviabilizar o uso de uma determinada ferramenta.

4.8 Considerações Finais

De acordo com os dados extraídos dos testes preliminares realizados, CodePro

Tools apresenta maior cobertura de código que Randoop conforme Figura 5.5.

A variação relacionada a cobertura de códigos de CodePro Tools foi inferior a

variação de Randoop.

Randoop gerou uma quantidade de casos de testes muito superior a CodePro

Tools, entretanto, Randoop não permite a inclusão de tempo inferior a 1 segundo o que

pode impactar na quantidade de casos de testes gerados.

Em geral a ferramenta CodePro Tools gera os casos de teste em um prazo inferior

ao mencionado conforme visto na Figura 5.6.

CodePro Tools também apresentou uma variação muito inferior a Randoop em

relação à quantidade de casos de teste.

Mesmo adotando um padrão em relação ao tempo de geração de casos de teste,

Randoop variou mais em relação à quantidade de casos de teste gerados.

Em relação a testes de mutação, foi possível concluir que Randoop gerou mais

mutantes que CodePro Tool conforme Figura 5.8, entretanto, CodePro Tools teve uma

variação menor em relação a quantidade de mutantes gerados que Randoop.

Randoop apresenta uma quantidade maior de mutantes mortos que CodePro

Tools o que é facilmente justificado em relação a quantidade de mutantes gerados

conforme podemos ver na Figura 5.9, onde são apresentadas as quantidades e na figura

5.10 com o score de mutação.

Os dados acima mencionados foram elaborados para uma análise inicial e

utilizados na primeira fase do projeto. Para a segunda fase, alguns dos procedimentos

mudaram com intuito de acrescentar ao comparativo dados de testes gerados de forma

manual juntamente com dados gerados pela ferramenta EvoSuite obtendo assim uma

gama maior de dados foram avaliados.

CAPÍTULO 5Conclusão

Na primeira fase dos experimentos, pode-se concluir que CodePro Tools apre-

senta melhores resultados que Randoop em relação a geração geração de casos de teste

mas quando o fator é testes de mutação Randoop apresentou melhores resultados.

A presente pesquisa apresenta aspectos para avaliar conjuntos de testes gerados

de forma manual e gerados por meio de geradores automáticos em 32 programas de

estrutura de dados.

Foram utilizados três geradores de teste automáticos diferentes. Em geral, exis-

tem algumas diferenças em relação ao número de casos de teste gerados, devido às estra-

tégias de otimização adotadas por cada gerador. Randoop por exemplo limita a quantidade

de casos de teste de acordo com valores inseridos em uma de suas condições de parada.

Nesse caso, foi adotada a condição tempo, rodando o programa 60 segundos por pro-

grama. Em 60 segundos no menor programa ele gerou 30 mil casos de teste. Em termos

de cobertura, analisando as médias, os conjuntos de teste manuais obtiveram melhorem

melhores resultados.

Os conjuntos de teste de EvoSuite tem 100% de cobertura em 17 dos 32

programas, seguido de testes manuais.

Em termos de eficácia, os conjuntos de teste manuais obtiveram melhor score de

mutação em quase todos os programas.

Apenas em 9 programas a pontuação ficou abaixo de conjuntos de teste automa-

tizados, atingindo um score de mutação de 63,9% em média.

O segundo melhor conjunto de testes com melhor score de mutação foi o de

EvoSuite com uma pontuação de 44,9%, em média.

A presente pesquisa abre possibilidades para vários domínios diferentes de novas

pesquisas que poderão ser feitas em um futuro. Tendo em vista que no decorrer desta

pesquisa algumas ferramentas novas surgiram, e ao mesmo tempo algumas deixaram de

ser atualizadas, para trabalhos futuros poderão ser feitos nos comparativos, seguindo os

mesmos critérios em uma quantidade maior de ferramentas e obtendo um conjunto de

possibilidades maior que os apresentados até o momento.

5.1 Contribuições 53

Outra possibilidade seria o fato de trabalhar as ferramentas geradoras em con-

junto com a finalidade de obter valores combinados ou até mesmo uma combinação entre

todos os geradores.

Além das possibilidades já informadas, existem outras possibilidades seguindo o

mesmo contexto de geradores automatizados de dados de teste que podem ser trabalhados

como a adoção de ferramentas descontinuadas para a criação de uma nova ferramenta

que se adeque as características abordadas na atualidade ou até mesmo a criação de uma

ferramenta que contemple o melhor obtido entre as ferramentas já avaliadas.

Finalizando, por meio dos dados obtidos o gerador que apresenta os melhores

resultados é EvoSuite cobrindo 4,2% mais linhas de código que Randoop e 8,7% a mais

que CodePro Tools.

Randoop fica em segunda posição cobrindo 4,5% a mais de linhas de código que

CodePro Tools.

5.1 Contribuições

Outros autores realizaram trabalhos avaliando ferramentas de geração automá-

tica de testes, mas a forma com que conduziram seus experimentos não foi igual a da

presente pesquisa.

A princípio uma das maiores contribuições visíveis no projeto é a formação de

grupos de ferramentas que trabalhem em conjunto formando um conjunto que permita um

estudo mais aprofundado em relação aos aspectos apresentados no mesmo.

Outra contribuição está na montagem do protocolo de experimentação onde

temos dados que foram avaliados e podem servir como referencia para futuras pesquisas.

Dentro do contexto estudado, temos dados que evidenciam a qualidade de

um determinado grupo de ferramentas. Esses dados também podem ser levados em

consideração em relação a contribuições da presente pesquisa.

5.2 Trabalhos Futuros

A presente pesquisa abre ramificações para outras pesquisas como por exemplo a

avaliação de ferramentas de geração de testes de mutação, aprimoramento de ferramentas

já existentes no mercado, criação de uma ferramenta nova composta pelas melhores

características avaliadas até o momento, avaliação de aspectos complementares entre as

ferramentas, a abrangência de uma quantidade maior de linguagens de programação, entre

outros aspectos.

5.2 Trabalhos Futuros 54

Para um trabalho futuro dentro desse mesmo seguimento o mais interessante

seria o uso de uma quantidade maior de ferramentas de geração automática de testes em

uma quantidade maior de programas.

Referências Bibliográficas

ANDREWS, J. H.; BRIAND, L. C.; LABICHE, Y. Is mutation an appropriate tool for testingexperiments. ICSE’05, May 15–21, 2005, St. Louis, Missouri, USA. Copyright 2005 ACM1-58113-963-2/05/0005, 2005.

Apache Software Foundation. Apache Maven Project. 2002. Página Web. Disponível em:https://maven.apache.org/. Acesso em: 10/02/2016.

BACHIEGA, T. et al. Complementary aspects of automatically and manually generatedtest case sets. In: ACM. Workshop on Automated Software Testing – A-TEST’2016.Seattle, WA, EUA: ACM Press, 2016. Aceito para publicação.

BARBOSA, E. F.; MALDONADO, J. C.; VINCENZI, A. M. R. Introdução ao teste desoftware. 2000.

CHHILLAR, R. S.; BALA, A. A review on existing techniques for generating automatic testcase for object oriented software. International Journal of Mathematics and ComputerResearch, 2014.

DELAHAYE, M.; BOUSQUET, L. Selecting a software engineering tool: lessons learntfrom mutation analysis. Software: Practice and Experience, 2015.

FRASER, G.; ARCURI, A. 1600 faults in 100 projects: Automatically finding faults whileachieving high coverage with evosuite. 2013.

FRASER, G.; ARCURI, A. A large-scale evaluation of automated unit test generationusing evosuite. ACM Trans. Softw. Eng. Methodol, 2014.

FRASER, G.; ARCURI., A. Evosuite at the sbst 2016 tool competition. In Proceedings ofthe 9th International Workshop on Search-Based Software Testing, pages 33-36, NewYork, NY, USA, 2016. ACM., 2016.

FRASER, G. et al. Does automated unit test generation really help software testers? acontrolled empirical study. ACM Transactions on Software Engineering and Methodology,2014.

GHEYI, R. et al. Análise conjunta das ferramentas. 2010. Disponível em: <http:/-/engenhariadesoftwareufcg.googlecode.com/svn/trunk/documentosEscritos/PDFs/p17-.pdf>.

GOOGLE. Codepro analytix evaluation guide. Página Web - https://google-web-toolkit.googlecode.com/files/CodePro-EvalGuide.pdf Acesso em: 04/07/2016., 2010.

Referências Bibliográficas 56

ISO/IEC/IEEE. Systems and software engineering – vocabulary. ISO/IEC/IEEE

24765:2010(E), n. 24765:2010(E), p. 1–418, dez. 2010.

JORGE, R. F. Estudo, definição e implementação de técnicas para a geração de dadosde teste a partir de gui. Instituto de Informática - Universidade Federal de Goiás, 2013.,2013.

KRACHT, J. S.; PETROVIC, J. Z.; WALCOTT-JUSTICE, K. R. Empirically evaluatingthe quality of automatically generated and manually written test suites. InternationalConference on Quality Software, 2014.

MA, Y.-S.; OFFUTT, J.; KWON., Y. R. Mujava: an automated class mutation system:Research articles. STVR - Software Testing, Verification and Reliability, 15(2):97-133,2005., 2005.

MAHMOOD, S. A systematic review of automated test data generation techniques. Schoolof Engineering – Blekinge Institute of Technology, Ronneby, Sweden, out. 2007., 2007.

MICSKEI, Z. Code-based test generation. 2013. Página Web. Disponível em:http://mit.bme.hu/~micskeiz/pages/code_based_test_generation.html.Acesso em: 10/02/2016.

OLADEJO, B. F.; OGUNBIYI, D. T. An empirical study on the effectiveness of automatedtest case generation techniques. American Journal of Software Engineering andApplications, 2014.

PACHECO, C.; ERNST., M. D. Randoop: Feedback-directed random testing for java. InCompanion to the 22Nd ACM SIGPLAN Conference on Object-oriented ProgrammingSystems and Applications Companion, OOPSLA ’07, pages 815-816, New York, NY,USA, 2007. ACM., 2007.

PRESSMAN, R. S.; MAXIM, B. Software Engineering – A Practitioner’s Approach. 8. ed.[S.l.]: McGraw-Hill Education, 2014.

SHARMA, P.; BAJPAI, N. Testing approaches to generate automated unit test cases.International Journal of Computer Science and Information Technologies, v. 5 (3), 2014.

SIMONS., A. J. Jwalk: A tool for lazy, systematic testing of java classes by designintrospection and user interaction. Automated Software Engg., 14(4):369-418, Dec. 2007.,2007.

SINGH, I.; CAUSEVIC, A.; PUNNEKKAT, S. A mapping study of automation support toolsfor unit testing. Mälardalen University School of Innovation, Design and Engineering,2014.

SMEETS, N.; SIMONS, A. J. H. Automated unit testing with randoop, jwalk and µjavaversus manual junit testing. 2010.

SMEETS, N.; SIMONS., A. J. H. Automated unit testing with randoop, jwalk and mujavaversus manual junit testing. Research reports, Department of Computer Science,University of Sheffield/University of Antwerp, Sheffield, Antwerp, 2011., 2011.

Referências Bibliográficas 57

SOLINGEN V. BASILI, G. C. R. van; ROMBACH., H. D. Goal question metric (gqm)approach. John Wiley & Sons, Inc., 2002., 2002.

SOUZA, S. R. S.; PRADO, M. P. An experimental study to evaluate the impact of theprogramming paradigm in the testing activity. CLEI ELECTRONIC JOURNAL, XX, 2011.

SOUZA, S. R. S. et al. An experimental study to evaluate the impact of the programmingparadigm in the testing activity. CLEI Electronic Journal, 15(1):1-13, Apr. 2012. Paper 3.,2012.

ZIVIANI, N. Projeto de Algoritmos com Implementações em Java e C++. [S.l.]: CengageLearning, 2011.

ZIVIANI, N. Projeto de Algoritmos com Implementações em Pascal e C. 3. ed. [S.l.]:Cengage Learning, 2011.