Pós-Graduação em Ciência da Computação – UFPE
Defesa de Tese de Doutorado Nº 547

Aluno: Leuson Mario Pedro da Silva
Orientador: Prof. Paulo Henrique Monteiro Borba
Co-orientador: Prof. Thorsten Berger (Ruhr-Universität Bochum)
Título: Detectando, Entendendo e Resolvendo Conflitos de Build e Teste
Data: 24/02/2022
Hora/Local: 14h – Interessados em assistir entrar em contato com o aluno
Banca Examinadora:

Prof. Márcio Lopes Cornélio (UFPE / Centro de Informática)
Prof. Breno Alexandro Ferreira de Miranda (UFPE / Centro de Informática)
Prof. Everton Leandro Galdino Alves (UFCG / Centro de Engenharia Elétrica e Informática)
Prof. Márcio de Oliveira Barros (UNIRIO / Centro de Ciências Exatas e Tecnologia)
Prof. Rodrigo Bonifácio de Almeida (UnB / Departamento de Ciência da Computação)


RESUMO:

Durante o desenvolvimento colaborativo de software, desenvolvedores geralmente adotam práticas de criação e integração (merge) de ramos de desenvolvimento quando trabalham em suas contribuições, permitindo que eles contribuam para um projeto de software independentemente. Apesar destes benefícios, estas práticas vem com um custo, a necessidade de integrar software e resolver conflitos de merge, que frequentemente ocorrem na prática. Enquanto técnicas modernas de merge, tais como merge estruturado ou 3-way, podem automaticamente resolver muitos destes conflitos, elas falham quando o conflito surge no nível semântico conhecidos como conflitos semânticos. Estes conflitos são revelados por falhas durante o processo de build e execução de testes do código integrado conhecidos como conflitos de build e teste, respectivamente. Detectar estes conflitos semânticos requer um entendimento do comportamento do software, o que está além da capacidade da maioria das ferramentas de integração de código e assistentes. Para resolver a necessidade de melhores ferramentas assistentes, nós investigamos a ocorrência de conflitos semânticos identificando suas causas e propondo ferramentas que possam apoiar os desenvolvedores quando eles enfrentam estes conflitos durante integrações de código em cenários de merge. Inicialmente, nós realizamos um estudo identificando a frequência, estrutura e padrões de resolução adotados em conflitos de build analisando empiricamente  451 projetos Java open-source. Como resultado, nós provemos um catálogo de conflitos com 239 ocorrências divididos em seis categorias. A maioria dos conflitos de build são causados por declarações não-resolvidas, removidas ou renomeadas por um desenvolvedor mas referenciadas por outra pessoa. Além disso, analisando alguns destes conflitos, nós também reportamos um catálogo de padrões de resolução. Por exemplo, conflitos causados por ações de renomeações são frequentemente resolvidas por meio da atualização da referência não-resolvida, enquanto que declarações removidas são frequentemente reintroduzidas. Ferramentas de reparo automático podem se beneficiar deste último catálogo para resolver conflitos automaticamente; nós ilustramos isto com uma implementação de prova de conceito de uma ferramenta que recomenda soluções para três categorias de conflitos de build. Para avaliar a ocorrência de conflitos de teste, nós adotamos uma abordagem diferente, pois estes conflitos envolvem a semântica de um programa. Consequentemente, eles não podem ser detectados durante a fase de compilação do processo de build. Desta forma, inicialmente, nós realizamos um segundo estudo investigando sua ocorrência, explorando a criação automática de testes unitários como especificações parciais para detectar conflitos. Baseando-se em um conjunto de dados de mais de 80 mudanças mútuas em elementos de classes de 51 cenários de merge com ground-truth, nós manualmente analisamos e investigamos se conflitos de teste existiam. Em seguida, nós exploramos sistematicamente a detecção de conflitos por meio de ferramentas de geração de testes, como também a adoção de Transformações de Testabilidade visando aumentas a testabilidade do código em análise. Como resultado, nós apresentamos um catálogo de 28 conflitos de testes, dos quais 9 foram detectados por nossa abordagem. Nossos resultados mostram que a melhor abordagem para detectar conflitos envolve a combinação das ferramentas Differential EvoSuite e EvoSuite aplicadas com Transformações de Testabilidade. Como contribuição final, nós apresentamos SAM, uma ferramenta de merge semântica baseada na geração de testes unitários, que avisa desenvolvedores sobre proeminentes conflitos em cenários de merge em andamento. No geral, nossos resultados se atentam a uma lacuna na literatura sobre a ocorrência de conflitos de integração de código semânticos durante o desenvolvimento de software. Baseado no tipo de conflito, nós investigamos suas causas e opções para lidar com eles. Enquanto conflitos de build podem ser detectados e solucionados por uma ferramenta de reparo automático, conflitos de teste poderiam ser detectados por uma ferramenta de merge semântica baseada na geração de testes unitários.

Palavras-chave: Integração de código. Conflitos semânticos. Desenvolvimento colaborativo.

Comentários desativados