Modeling variable identifiers to improve the adoption of automatically generated unit tests

Detalhes bibliográficos
Autor(a) principal: Oliveira, José Afonso Henriques de
Data de Publicação: 2021
Tipo de documento: Dissertação
Idioma: eng
Título da fonte: Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
Texto Completo: http://hdl.handle.net/10451/59303
Resumo: Tese de Mestrado, Engenharia Informática (Engenharia de Software), 2021, Universidade de Lisboa, Faculdade de Ciências
id RCAP_a1524a0d3bbfbef68ce1da7abee546f8
oai_identifier_str oai:repositorio.ul.pt:10451/59303
network_acronym_str RCAP
network_name_str Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
repository_id_str 7160
spelling Modeling variable identifiers to improve the adoption of automatically generated unit testsAutomatizaçãoTestes de SoftwareInteligência ArtificialLegibilidade do códigoTeses de mestrado - 2021Domínio/Área Científica::Engenharia e Tecnologia::Engenharia Eletrotécnica, Eletrónica e InformáticaTese de Mestrado, Engenharia Informática (Engenharia de Software), 2021, Universidade de Lisboa, Faculdade de CiênciasO software é uma ferramenta utilizada de forma recorrente no nosso dia-a-dia, tanto na indústria como por particulares. Isto acontece, graças aos benefícios adquiridos com recurso ao uso destas ferramentas, mais concretamente, como a facilidade de utilização e o custo reduzido. Quando falamos de aplicações de software, podemos catalogá-las em dois grandes grupos, o software para uso pessoal, como a aplicação de notícias que utilizamos no dia-a-dia, até a sistemas bastante complexos como o módulo de navegação para o avião, mais conhecido como piloto automático. Apesar destes dois grupos de sistemas possuírem complexidades distintas, as técnicas utilizadas durante o desenvolvimento são bastantes idênticas, sendo o principal ponto de divergência a qualidade e o rigor que é aplicado durante os testes da aplicação. De forma a compreender a importância dos testes da aplicação, é necessário avaliar o impacto que uma falha poderá implicar em cada um dos sistemas. Comparando o impacto que poderá resultar de um erro, é expectável que a repercussão de um erro no sistema de navegação do avião seja bastante mais crítico, do que uma falha na aplicação que apresenta as notícias do dia ou até mesmo na box de televisão. Infelizmente ao longo da história do desenvolvimento de software, têm existido alguns exemplos onde a qualidade dos testes não permitiu detetar alguns problemas ainda durante a sua fase de desenvolvimento. Um desses exemplos, aconteceu nos aviões Boeing 737 Max do qual resultaram dois acidentes fatais e que levaram à perda de 356 vidas humanas. Após o acidente, foi conduzida uma investigação que revelou que as causas do acidente estavam relacionadas com um dos módulos no sistema de segurança do aparelho. Este módulo tinha a responsabilidade de inclinar o aparelho no sentido descendente, caso o avião estivesse a realizar uma subida com uma velocidade excessivamente rápida e que se pudessem traduzir no risco de estolar 1 [1]. Para tentar mitigar situações indesejáveis como estas, é recomendado que os programadores sigam as boas práticas e que criem testes exaustivos, especialmente em programas que sejam considerados como críticos, permitindo que sejam identificados o maior número de problemas ainda durante o processo de desenvolvimento do projeto, permitindo assim melhorar a qualidade do projeto e mantendo os custos do mesmo reduzidos. Uma outra fase do ciclo de vida do software, onde os testes desempenham um papel bastante importante, é durante a manutenção do projeto. Durante o processo de manutenção, podem ser corrigidos problemas que foram encontrados, ou até mesmo alteração de requisitos por parte do negócio, sendo um exemplo desta alteração a inclusão de um novo método de pagamento no portal de vendas da empresa. Esta fase da manutenção é perigosa e é preciso ter cuidado com as alterações que se faz no código, podendo estas correções levar à regressão de funcionalidades, ou até mesmo à introdução de novos pontos de falha. Uma das técnicas utilizadas para combater estas adversidades, é a utilização de um conjunto de testes de regressão. Estes testes devem ter como objetivo cobrir o máximo de requisitos funcionais para que os programadores possam verificar se as modificações que aplicaram ao código, comprometeu alguma das funcionalidades que seria esperado para cada um dos módulos do sistema. Apesar dos testes serem um requisito essencial para o desenvolvimento de um software com qualidade, esta nem sempre é uma tarefa fácil de realizar. A operação de criação de testes, é uma atividade que requer o seu tempo para que o programador consiga contextualizar-se com o problema e que identifique quais são o conjunto de testes mais relevantes para o problema em questão. Do ponto de vista da gestão do projeto, o tempo que o programador requer para o desenvolvimento dos testes com qualidade, reflete-se num aumento do custo do projeto e que deverá ser tomado em consideração desde o seu princípio. Para agilizar a criação dos testes de software, a literatura propõe a utilização de ferramentas de geração automática de testes, reduzindo assim os custos do seu desenvolvimento. O EvoSuite [2] e o Randoop [3] são dois exemplos de ferramentas que permitem colaborar no processo de mitigação desses custos através da criação automática de um conjunto de testes unitários, com o objetivo de exercitar uma elevada parte do código fonte e em alguns casos até mesmo a sua totalidade. Estas ferramentas permitem ainda a adaptação dos critérios que deverão ser utilizados para a criação do teste unitário conforme as regras definidas pela equipa de qualidade. Ao longo dos tempos, estas ferramentas têm demonstrado o seu potencial em aplicações reais [4, 5], desvendando falhas que se escondiam no código e que não eram identificadas pelos testes manuais. Quando o software se encontra em desenvolvimento, parte-se do pressuposto que um dia mais tarde, será necessário realizar tarefas de manutenção sobre a aplicação. Esta manutenção poderá ser aplicada por razões como a alteração de requisitos por parte do negócio, implementar novas funcionalidade que não estavam previstas no início do projeto, ou até mesmo para a correção de erros que tenham sido identificadas durante o desenvolvimento. Quando os testes são desenhados, eles devem refletir o comportamento do módulo que se pretende validar. Considerando um exemplo em concreto, imagine-se que o módulo em desenvolvimento faz as funções de uma calculadora básica com a funcionalidade de somar e subtrair e que estas funcionalidades estão exercitadas por testes. Contudo, o modelo de negócio decidiu que o produto precisava de uma melhoria nas funcionalidades e que agora a calculadora deveria fazer operações de multiplicação e divisão. Para que o programador consiga realizar as alterações de uma forma racional, é vital que este tenha conhecimento do comportamento do sistema, antes de aplicar as alterações evitando assim danos no sistema. Para compreender o comportamento do sistema, existem algumas técnicas que poderão ser utilizadas, como a leitura e interpretação da documentação funcional, a leitura e interpretação do fluxo do código, ou até mesmo através da consulta dos testes unitários existentes. Sendo que os testes unitários desempenham um papel importante na interpretação do comportamento do sistema, torna-se uma necessidade criar testes que sejam de fácil interpretação. Tal como Daka et al. [6] mencionou, existem um conjunto de características relevantes para medir a qualidade de um teste unitário, como o número de linhas do teste, o comprimento do nome identificador e a quantidade de identificadores únicos. Do ponto de vista dos testes unitários gerados de uma forma automatizada, pecam no ponto de vista da legibilidade. Tal como Daka et al. mencionou, os testes gerados automaticamente utilizam nomes para os identificadores que refletem um nível fraco de legibilidade. Para a melhoria desta legibilidade nos identificadores, propomos a realização de um estudo exploratório, com o intuito de construir um conjunto de características para o estudo das técnicas utilizadas pelos humanos para nomear os identificadores. Partindo depois desta primeira análise, continuamos com a realização de um segundo estudo onde são analisados os identificadores gerados pelas ferramentas EvoSuite e Randoop. Através dos resultados adquiridos em ambos os estudos, é realizada uma análise detalhada sobre os dados obtidos, onde são identificadas as diferenças que existem entre os identificadores escritos por humanos e os identificadores atribuídos pelas ferramentas. Foi possível também contribuir com um modelo, com a capacidade de catalogar um identificador em dois grupos, o grupo de identificadores gerado manualmente e o grupo de identificadores gerados automaticamente, com uma precisão que ronda os 98%. Para além deste modelo, é proposto uma nova implementação de algoritmo evolucionário para a geração de identificadores de uma forma automatizada. Este algoritmo destaca-se comparativamente às técnicas das ferramentas EvoSuite e Randoop, devido à capacidade de tornar os identificadores mais parecidos com os identificadores que um humano escolheria, resultando assim em identificadores mais legíveis.Software is a tool used on a recurring basis in our day-to-day, both in industry and by individuals. This is thanks to the benefits gained from the use of these tools, more specifically, such as ease of use and reduced cost. When it comes to software, we can categorize them into two large groups of applications, software for personal use, such as the news application we use daily, to quite complex systems such as the navigation module for the plane, more known as autopilot. Although these two groups of systems have different complexities, they use a very similar technique during development. The main point of divergence being the quality and rigor that is applied during the testing phase. To mitigate undesirable situations where the software does not behave as intended, it’s recommended that programmers follow the best practices and create exhaustive tests in programs that are critical. The creation of this tests favors the developers by finding the greatest number of faults during the development phase of the project, improving the quality of the project and maintaining the costs reduced. To speed up the creation of software tests, the literature proposes the use automatic generated tests to ease the process of creating and reducing development costs. EvoSuite [2] and Randoop [3] are two examples for this type of tools that allow the mitigation of these costs through the automatic creation of a set of unit tests, with the objective of exercising a large part of the source code and in some cases even its entirety. Over time, these tools have demonstrated its potential in real applications [4, 5], uncovering flaws that were hidden in the code and that were not identified by manual tests. Despite the advantages of the automatically generated unit tests, they have some downsides that need to be improved to increase the adoption. Daka et al. [6] has proposed a set of relevant characteristics to measure the quality of a unit test, such as the number of lines in a test, the length of the identifier name and the amount of unique identifiers and by measuring these characteristics in an automatically generated tests, the authors identified that automated unit tests generated fail in terms of readability. To improve the readability for this tests, we propose an exploratory study to build a set of characteristics relevant of how humans name identifiers. Following up, we continue with a second analysis and compare the human names with the identifiers generated by the EvoSuite and Randoop tools. It was also possible to contribute with a model, with the ability to predict if an identifier looks like a manual identifiers or to a generated identifier, with an accuracy of around 98%. In addition to this model, a new implementation of an evolutionary algorithm is proposed to generate identifiers in an automated way. This algorithm stands out compared to the techniques of the EvoSuite and Randoop tools, due to the ability to make identifiers more like the identifiers that a human would choose, thus resulting in more readable identifiers.Campos, José Carlos Medeiros deRepositório da Universidade de LisboaOliveira, José Afonso Henriques de2023-09-14T15:39:49Z202120212021-01-01T00:00:00Zinfo:eu-repo/semantics/publishedVersioninfo:eu-repo/semantics/masterThesisapplication/pdfhttp://hdl.handle.net/10451/59303enginfo:eu-repo/semantics/openAccessreponame:Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)instname:Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informaçãoinstacron:RCAAP2023-11-08T17:08:20Zoai:repositorio.ul.pt:10451/59303Portal AgregadorONGhttps://www.rcaap.pt/oai/openaireopendoar:71602024-03-19T22:09:13.888309Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos) - Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informaçãofalse
dc.title.none.fl_str_mv Modeling variable identifiers to improve the adoption of automatically generated unit tests
title Modeling variable identifiers to improve the adoption of automatically generated unit tests
spellingShingle Modeling variable identifiers to improve the adoption of automatically generated unit tests
Oliveira, José Afonso Henriques de
Automatização
Testes de Software
Inteligência Artificial
Legibilidade do código
Teses de mestrado - 2021
Domínio/Área Científica::Engenharia e Tecnologia::Engenharia Eletrotécnica, Eletrónica e Informática
title_short Modeling variable identifiers to improve the adoption of automatically generated unit tests
title_full Modeling variable identifiers to improve the adoption of automatically generated unit tests
title_fullStr Modeling variable identifiers to improve the adoption of automatically generated unit tests
title_full_unstemmed Modeling variable identifiers to improve the adoption of automatically generated unit tests
title_sort Modeling variable identifiers to improve the adoption of automatically generated unit tests
author Oliveira, José Afonso Henriques de
author_facet Oliveira, José Afonso Henriques de
author_role author
dc.contributor.none.fl_str_mv Campos, José Carlos Medeiros de
Repositório da Universidade de Lisboa
dc.contributor.author.fl_str_mv Oliveira, José Afonso Henriques de
dc.subject.por.fl_str_mv Automatização
Testes de Software
Inteligência Artificial
Legibilidade do código
Teses de mestrado - 2021
Domínio/Área Científica::Engenharia e Tecnologia::Engenharia Eletrotécnica, Eletrónica e Informática
topic Automatização
Testes de Software
Inteligência Artificial
Legibilidade do código
Teses de mestrado - 2021
Domínio/Área Científica::Engenharia e Tecnologia::Engenharia Eletrotécnica, Eletrónica e Informática
description Tese de Mestrado, Engenharia Informática (Engenharia de Software), 2021, Universidade de Lisboa, Faculdade de Ciências
publishDate 2021
dc.date.none.fl_str_mv 2021
2021
2021-01-01T00:00:00Z
2023-09-14T15:39:49Z
dc.type.status.fl_str_mv info:eu-repo/semantics/publishedVersion
dc.type.driver.fl_str_mv info:eu-repo/semantics/masterThesis
format masterThesis
status_str publishedVersion
dc.identifier.uri.fl_str_mv http://hdl.handle.net/10451/59303
url http://hdl.handle.net/10451/59303
dc.language.iso.fl_str_mv eng
language eng
dc.rights.driver.fl_str_mv info:eu-repo/semantics/openAccess
eu_rights_str_mv openAccess
dc.format.none.fl_str_mv application/pdf
dc.source.none.fl_str_mv reponame:Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
instname:Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informação
instacron:RCAAP
instname_str Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informação
instacron_str RCAAP
institution RCAAP
reponame_str Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
collection Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
repository.name.fl_str_mv Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos) - Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informação
repository.mail.fl_str_mv
_version_ 1799134648238866432