Simple Science

Ciência de ponta explicada de forma simples

# Informática# Engenharia de software

Apresentando o Synbciatr: Um Novo Método para Reparar Código de Teste

O Synbciatr conserta automaticamente casos de teste desatualizados no desenvolvimento de software.

― 8 min ler


Synbciatr: CorrigindoSynbciatr: CorrigindoCódigo de TesteAutomaticamenteteste desatualizados.Uma solução automatizada para casos de
Índice

No desenvolvimento de software, é super importante que as atualizações do código de teste aconteçam junto com as mudanças no código de produção. Mas, na prática, muitas vezes as atualizações de teste demoram a acompanhar, o que pode fazer com que os projetos não compilem corretamente ou enfrentem outros problemas. Existem métodos que usam modelos de linguagem pra ajudar a consertar testes que ficaram desatualizados por causa dessas discrepâncias, especialmente pra problemas relacionados à sintaxe. Mas um desafio é que a informação necessária pra consertar esses testes geralmente não tá disponível de forma direta, dificultando a obtenção de correções precisas em projetos grandes.

Esse artigo apresenta uma nova abordagem chamada Synbciatr, que foi criada pra reparar automaticamente casos de teste obsoletos. O método foca em construir contextos relevantes a partir de todo o repositório de código pra ajudar no processo de reparo.

A Necessidade de Reparar Código de Teste

Quando um software é atualizado, isso pode mudar várias partes do código, e os testes que conferem essas mudanças também precisam ser atualizados. Se o código de teste associado não acompanhar as mudanças do código de produção, pode acabar não funcionando direito e gerando erros.

Muitas técnicas existentes tentaram resolver a necessidade de atualizar o código de teste. Geralmente, elas dependem de modelos de linguagem, que conseguem processar o código e sugerir correções. Mas esses modelos costumam ter dificuldade com repositórios maiores, onde o contexto do que precisa ser consertado não é facilmente identificado.

Os Desafios em Reparar Testes

Quando os desenvolvedores consertam manualmente os casos de teste, eles reúnem informações sobre as partes relevantes do código que mudaram. No entanto, ao usar métodos automatizados, o contexto necessário pra consertar os testes nem sempre é claro. Os métodos atuais costumam focar só nas partes específicas do código que mudaram, deixando de lado o contexto importante.

Um dos problemas mais comuns é quando a assinatura de um método muda. Isso se refere às mudanças no nome, tipo de retorno ou tipos dos parâmetros de um método. Essas mudanças podem levar a erros de compilação se os testes relacionados não forem atualizados também. Além disso, simplesmente inserir as assinaturas originais e novas em um modelo de linguagem muitas vezes não resulta em correções eficazes porque o contexto certo está faltando.

Pra consertar esses casos com precisão, capturar e fornecer o contexto adequado, que chamamos de Contextos Orientados a Reparos de Teste (TROCtx), é fundamental.

Introduzindo o Synbciatr

O Synbciatr oferece uma nova maneira de reparar automaticamente testes que se tornaram obsoletos devido a mudanças nas assinaturas de métodos. Seu objetivo principal é reunir contextos relevantes do repositório de código e usá-los pra informar o modelo de linguagem na tarefa de reparo. Pra isso, três tipos de TROCtx são definidos: contextos de classe, contextos de uso e contextos de ambiente.

Tipos de Contextos

  1. Contextos de Classe (ClassCtx) fornecem informações sobre as novas classes introduzidas na assinatura do método atualizado.
  2. Contextos de Uso (UsageCtx) focam em como o método atualizado está sendo chamado ao longo do código.
  3. Contextos de Ambiente (EnvCtx) trazem detalhes sobre o ambiente ao redor onde o método opera, incluindo classes pai e código relacionado.

Cada um desses tipos de contexto desempenha um papel importante em garantir que o modelo de linguagem tenha informações suficientes pra reparar os testes com precisão.

Como o Synbciatr Funciona

O processo seguido pelo Synbciatr envolve várias etapas-chave. Primeiro, ele coleta os TROCtx necessários de todo o repositório de código através de uma análise estática, que envolve examinar o código sem executá-lo. Usando uma ferramenta chamada Language Server, o Synbciatr pode solicitar informações sobre os vários contextos.

Coleta de Contexto

Durante a coleta de contexto, o Synbciatr analisa as mudanças feitas no método em questão e identifica identificadores relevantes que correspondem aos novos e antigos parâmetros do método. Após identificar esses identificadores, o Synbciatr solicita detalhes do Language Server sobre eles.

Reclassificando Contextos

Depois de coletar os contextos, o Synbciatr usa algo chamado Neural Rerankers pra priorizar quais contextos são mais relevantes pra tarefa em questão. Isso é feito criando consultas baseadas no código de teste original e usando-as pra avaliar a relevância dos contextos coletados. Os contextos melhor ranqueados são então selecionados pra serem usados pelo modelo de linguagem.

Gerando o Prompt de Reparação

Uma vez que os contextos relevantes foram reunidos e priorizados, o Synbciatr prepara um prompt completo pro modelo de linguagem. Esse prompt inclui as informações necessárias, como as mudanças feitas no método, o código de teste original e os TROCtx identificados. Assim, o modelo de linguagem tem todo o contexto que precisa pra gerar uma versão reparada do caso de teste.

Avaliando a Eficácia do Synbciatr

Pra ver como o Synbciatr se sai, o método foi testado em comparação com abordagens existentes. Um conjunto de dados especial foi criado, consistindo em vários casos de teste que se tornaram obsoletos devido a mudanças em seus métodos associados. Os principais objetivos eram ver com que frequência o Synbciatr conseguia reparar testes com precisão e comparar seu desempenho com dois outros métodos.

Conjunto de Dados de Referência

Um conjunto de dados de referência foi criado filtrando e refinando amostras existentes de projetos Java populares no GitHub. Após limpar o conjunto de dados, um total de 137 amostras permaneceu, que eram diversas em seus tipos de mudanças sintáticas.

Métricas de Desempenho

Várias métricas foram usadas pra avaliar o desempenho do Synbciatr. Essas métricas incluíam:

  • Taxa de Aprovação de Sintaxe (SPR): Isso mede quantos dos casos de teste gerados passam na validação de sintaxe.
  • CodeBLEU: Essa métrica verifica a similaridade dos casos de teste gerados com a verdade fundamental, que é a saída esperada.
  • Correspondência de Intenção: Essa métrica avalia se a intenção por trás do caso de teste original foi preservada na versão reparada.

Os resultados mostraram que o Synbciatr superou os dois métodos de base em todas as métricas testadas, demonstrando sua capacidade de reparar testes obsoletos com precisão.

Abordando o Impacto do TROCtx

Parte da avaliação focou em quão grande foi a diferença que os TROCtx construídos fizeram no desempenho geral do Synbciatr. Ao comparar o Synbciatr com o Naivellm, que não usa TROCtx, ficou claro que a inclusão de contexto reduziu significativamente o número de saídas incorretas, conhecidas como alucinações.

Reduzindo Alucinações

Alucinações se referem a instâncias onde o modelo de linguagem gera código que faz referência a métodos, variáveis ou classes que não existem no contexto. Ao fornecer TROCtx relevantes, o Synbciatr conseguiu reduzir bastante o número desses casos.

Analisando Falhas

Apesar do sucesso, houve algumas instâncias em que o Synbciatr não conseguiu reparar casos de teste conforme o esperado. A análise revelou várias razões comuns para essas falhas:

  1. Classes Não Importadas: Em alguns casos, o código gerado fazia referência a classes que não estavam importadas, levando a erros.
  2. Mudanças Complexas: Às vezes, as mudanças no método focal eram tão intricadas que os contextos atuais não conseguiam acomodar, levando a alucinações desatualizadas.
  3. Falhas na Construção de Contexto: Houve casos em que o Language Server não conseguiu coletar os contextos necessários devido a problemas de configuração do repositório.

Considerações de Eficiência

O processo de coleta de TROCtx adiciona um tempo extra à operação geral de reparo de testes com o Synbciatr em comparação com o Naivellm. Mas, o retorno por esse tempo extra é uma precisão melhor e menos erros nos testes gerados. O tempo médio que o Synbciatr levou pra gerar reparos foi considerado aceitável pros desenvolvedores.

Conclusão

Em conclusão, o Synbciatr apresenta um método útil pra reparar automaticamente casos de teste obsoletos causados por mudanças no código de produção. Ao coletar e utilizar efetivamente o contexto relevante, mostrou-se superior aos métodos existentes, produzindo reparos em testes mais precisos e bem-sucedidos. Os resultados positivos ilustram o potencial de usar um contexto bem construído pra melhorar as capacidades de modelos de linguagem em tarefas de desenvolvimento de software. Essa abordagem não só alivia as dificuldades enfrentadas pelos desenvolvedores, mas também contribui pra a confiabilidade e eficácia geral das práticas de testes de software.

Fonte original

Título: Fix the Tests: Augmenting LLMs to Repair Test Cases with Static Collector and Neural Reranker

Resumo: During software evolution, it is advocated that test code should co-evolve with production code. In real development scenarios, test updating may lag behind production code changing, which may cause compilation failure or bring other troubles. Existing techniques based on pre-trained language models can be directly adopted to repair obsolete tests caused by such unsynchronized code changes, especially syntactic-related ones. However, the lack of task-oriented contextual information affects the repair accuracy on large-scale projects. Starting from an obsolete test, the key challenging task is precisely identifying and constructing Test-Repair-Oriented Contexts (TROCtxs) from the whole repository within a limited token size. In this paper, we propose SYNTER (SYNtactic-breaking-changes-induced TEst Repair), a novel approach based on LLMs to automatically repair obsolete test cases via precise and concise TROCtxs construction. Inspired by developers' programming practices, we design three types of TROCtx: class context, usage context, and environment context. Given an obsolete test case to repair, SYNTER firstly collects the related code information for each type of TROCtx through static analysis techniques automatically. Then, it generates reranking queries to identify the most relevant TROCtxs, which will be taken as the repair-required key contexts and be input to the large language model for the final test repair. To evaluate the effectiveness of SYNTER, we construct a benchmark dataset that contains a set of obsolete tests caused by syntactic breaking changes. The experimental results show that SYNTER outperforms baseline approaches both on textual- and intent-matching metrics. With the augmentation of constructed TROCtxs, hallucinations are reduced by 57.1%.

Autores: Jun Liu, Jiwei Yan, Yuanyuan Xie, Jun Yan, Jian Zhang

Última atualização: 2024-11-04 00:00:00

Idioma: English

Fonte URL: https://arxiv.org/abs/2407.03625

Fonte PDF: https://arxiv.org/pdf/2407.03625

Licença: https://creativecommons.org/licenses/by/4.0/

Alterações: Este resumo foi elaborado com a assistência da AI e pode conter imprecisões. Para obter informações exactas, consulte os documentos originais ligados aqui.

Obrigado ao arxiv pela utilização da sua interoperabilidade de acesso aberto.

Mais de autores

Artigos semelhantes