Simple Science

Scienza all'avanguardia spiegata semplicemente

# Informatica# Ingegneria del software

Sfruttare i LLM per una generazione migliore degli oracle di test

Questo studio esamina il ruolo dei LLM nel creare test oracoli efficaci per il software.

― 7 leggere min


LLM trasformano laLLM trasformano lacreazione degli oracoliper i test.efficiente.oracoli di test superiori in modoLa ricerca mostra che i LLM generano
Indice

Il testing del software è fondamentale per trovare bug nei programmi. Una parte chiave di questo processo è l'oracolo di test, che aiuta a determinare se il software funziona correttamente. Anche se ci sono metodi automatici per creare questi oracoli di test, molti di essi producono troppi risultati errati. I modelli di linguaggio di grandi dimensioni (LLM) hanno mostrato promesse in vari compiti software come scrivere codice, creare casi di test e correggere bug, ma non è stata fatta molta ricerca sulla loro efficacia nel generare oracoli di test affidabili.

In questo studio, vediamo se gli LLM possono produrre oracoli di test corretti, vari e forti che possano individuare bug unici. Abbiamo addestrato sette diversi LLM utilizzando vari prompt su un dataset chiamato SF110. Identificando la combinazione di modello e prompt più efficace, abbiamo sviluppato un nuovo metodo per generare oracoli di test. Per vedere quanto bene funziona questo metodo, lo abbiamo testato su 25 grandi progetti Java. Abbiamo considerato non solo la correttezza ma anche la diversità e la forza degli oracoli generati, confrontando i nostri risultati con altri metodi come EvoSuite e TOGA.

Importanza degli Oracoli di Test

Gli oracoli di test sono cruciali nel testing del software perché definiscono il comportamento atteso del software. Un test suite è composta da casi di test, dove ogni caso testa una parte specifica del programma. L'oracolo di test verifica se il programma ha agito come previsto. Ci sono due principali tipi di oracoli di test:

  1. Oracoli di Asserzione: Questi controllano se l'output del programma è corretto.
  2. Oracoli di Eccezione: Questi controllano se il programma identifica correttamente gli errori.

Affinché gli oracoli di test siano efficaci, devono non solo essere corretti ma anche forti. Un oracolo corretto significa che corrisponde al comportamento atteso senza sollevare falsi allarmi. Un oracolo forte può rilevare quando il programma fa qualcosa di sbagliato. È importante avere entrambe le qualità per garantire una rilevazione accurata dei bug.

Sebbene creare manualmente oracoli di test sia più efficace, richiede molto tempo e impegno. Per affrontare questo problema, i ricercatori hanno cercato modi per automatizzare questo processo.

Metodi Utilizzati per la Generazione di Oracoli

Ci sono stati diversi approcci per creare oracoli di test automaticamente, utilizzando tecniche di elaborazione del linguaggio naturale e matching di pattern. Alcuni metodi generano oracoli basati su commenti e documentazione. Questi possono produrre sia oracoli di asserzione che di eccezione.

Recentemente, le reti neurali sono state applicate nella generazione di oracoli. Il metodo TOGA ha mostrato prestazioni migliori rispetto ai metodi precedenti. Tuttavia, ha ancora limitazioni, generando oracoli di asserzione corretti solo nel 38% dei casi, con un alto tasso di falsi positivi sia per gli oracoli di asserzione che per quelli di eccezione. Questo evidenzia la necessità di ulteriori progressi nella creazione di oracoli di test automatici affidabili.

Esplorare gli LLM per la Generazione di Oracoli di Test

Gli LLM stanno ricevendo attenzione per vari compiti di ingegneria del software, incluso il testing. I tentativi precedenti di utilizzare gli LLM per generare casi di test hanno affrontato sfide nel raggiungere una buona copertura dei test. Alcuni studi hanno mostrato un successo limitato nel generare prefissi di test per grandi programmi Java. Altri hanno provato a utilizzare gli LLM per produrre sia prefissi di test che oracoli di test ma non hanno valutato la qualità degli oracoli generati per la rilevazione dei bug.

Nella nostra ricerca, abbiamo diviso il compito. Abbiamo utilizzato metodi ben consolidati come EvoSuite per creare prefissi di test e ci siamo concentrati esclusivamente sull'uso degli LLM per generare oracoli di test. Abbiamo messo a punto sette diversi LLM di codice utilizzando vari prompt che fornivano diverse quantità di contesto sul software in fase di test.

I Modelli Utilizzati

Abbiamo esplorato diversi LLM pre-addestrati, ognuno con dimensioni e capacità variabili. I modelli che abbiamo esaminato includono:

  1. CodeGPT: Un modello più piccolo che ha mostrato buoni risultati in Java.
  2. CodeParrot: Questo modello rende bene nonostante sia leggero.
  3. CodeGen: Disponibile in varie dimensioni, questi modelli sono bravi a capire il codice.
  4. PolyCoder: Un'altra famiglia di modelli addestrati su un'ampia gamma di linguaggi di programmazione.
  5. Phi-1: Anche se principalmente addestrato su Python, questo modello ha performato bene nelle nostre valutazioni per Java.

Preparazione dei Dati di Addestramento

Per addestrare i nostri modelli, abbiamo utilizzato il dataset SF110, che include numerosi progetti Java con casi di test generati da EvoSuite. Abbiamo elaborato questi dati per creare tuple che includevano il prefisso di test, il metodo da testare e l'oracolo corrispondente. Questo dataset è stato poi suddiviso in sottoinsiemi di addestramento, test e validazione per garantire una valutazione equa dei nostri metodi.

Progettazione di Prompt Efficaci

Abbiamo creato sei prompt diversi per mettere a punto gli LLM, aggiungendo gradualmente più contesto:

  1. P1: Solo il prefisso di test.
  2. P2: Prefisso di test e documentazione del metodo.
  3. P3: Prefisso di test e firma del metodo.
  4. P4: Prefisso di test, documentazione e firma del metodo.
  5. P5: Prefisso di test e l'intero codice del metodo.
  6. P6: Prefisso di test, documentazione e intero codice del metodo.

Abbiamo scoperto che fornire più informazioni di base migliorava l'accuratezza, ma a volte modelli più grandi non performavano meglio di quelli più piccoli quando messi a punto correttamente.

Valutazione dei Modelli

Una volta messi a punto i modelli, abbiamo testato le loro prestazioni su 25 progetti Java che erano nuovi per i modelli. Abbiamo generato oracoli di test per ogni progetto e li abbiamo validati eseguendo i test. L'accuratezza è stata misurata in base a quanti oracoli generati hanno superato i test.

Confronto con Altri Metodi

Abbiamo confrontato i nostri oracoli generati dagli LLM con quelli generati da TOGA e EvoSuite. L'obiettivo era vedere quanti oracoli corretti ogni metodo riuscisse a generare e quanto bene potessero rilevare i bug.

Risultati e Conclusioni

Efficacia degli LLM

I nostri risultati suggeriscono che gli LLM possono effettivamente produrre oracoli di test forti e corretti. Infatti, il miglior LLM ha generato significativamente più oracoli di asserzione e di eccezione corretti rispetto a TOGA. Questo significa che usare gli LLM migliora il processo di generazione di oracoli di test affidabili.

Diversità degli Oracoli Generati

Un altro aspetto importante che abbiamo esaminato è stata la diversità. Gli oracoli generati dagli LLM hanno mostrato una vasta gamma di stili di asserzione, rendendoli adatti a completare gli oracoli tradizionalmente scritti dagli sviluppatori. Questa diversità è cruciale per rilevare bug che potrebbero essere trascurati da approcci più uniformi.

Forza degli Oracoli nella Rilevazione dei Bug

La forza degli oracoli creati dagli LLM è stata valutata attraverso il testing di mutazione. Questo processo prevede di apportare piccole modifiche al codice per creare "mutanti" e vedere se gli oracoli di test possono rilevare queste modifiche. I nostri risultati hanno indicato che gli oracoli generati dagli LLM erano in grado di identificare molti bug unici che altri non potevano.

Sfide e Limitazioni

Nonostante i risultati promettenti, alcune sfide rimangono. Ad esempio, circa il 5% delle asserzioni generate non compilava a causa di piccoli errori di sintassi. Inoltre, una piccola frazione degli output generati erano falsi positivi, asserzioni che indicavano un problema quando non ce n'era uno.

Direzioni Future

In futuro, affinare i modelli per ridurre errori di compilazione e falsi positivi sarà una priorità. Un altro ambito di attenzione è trovare modi per utilizzare documentazione di miglior qualità, che potrebbe migliorare gli oracoli generati.

Conclusione

Gli LLM hanno un grande potenziale per migliorare la generazione di oracoli di test nel testing del software. La nostra ricerca mostra che possono produrre oracoli di test più corretti, diversi e forti rispetto ai metodi precedenti. Affrontando le sfide esistenti e continuando a perfezionare queste tecniche, possiamo fare progressi significativi verso processi di testing del software più affidabili. Questo lavoro getta le basi per futuri progressi nella generazione automatica di oracoli di test.

Fonte originale

Titolo: TOGLL: Correct and Strong Test Oracle Generation with LLMs

Estratto: Test oracles play a crucial role in software testing, enabling effective bug detection. Despite initial promise, neural-based methods for automated test oracle generation often result in a large number of false positives and weaker test oracles. While LLMs have demonstrated impressive effectiveness in various software engineering tasks, including code generation, test case creation, and bug fixing, there remains a notable absence of large-scale studies exploring their effectiveness in test oracle generation. The question of whether LLMs can address the challenges in effective oracle generation is both compelling and requires thorough investigation. In this research, we present the first comprehensive study to investigate the capabilities of LLMs in generating correct, diverse, and strong test oracles capable of effectively identifying a large number of unique bugs. To this end, we fine-tuned seven code LLMs using six distinct prompts on the SF110 dataset. Utilizing the most effective fine-tuned LLM and prompt pair, we introduce TOGLL, a novel LLM-based method for test oracle generation. To investigate the generalizability of TOGLL, we conduct studies on 25 large-scale Java projects. Besides assessing the correctness, we also assess the diversity and strength of the generated oracles. We compare the results against EvoSuite and the state-of-the-art neural method, TOGA. Our findings reveal that TOGLL can produce 3.8 times more correct assertion oracles and 4.9 times more exception oracles. Moreover, our findings demonstrate that TOGLL is capable of generating significantly diverse test oracles. It can detect 1,023 unique bugs that EvoSuite cannot, which is ten times more than what the previous SOTA neural-based method, TOGA, can detect.

Autori: Soneya Binta Hossain, Matthew Dwyer

Ultimo aggiornamento: 2024-12-09 00:00:00

Lingua: English

URL di origine: https://arxiv.org/abs/2405.03786

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

Licenza: https://creativecommons.org/licenses/by/4.0/

Modifiche: Questa sintesi è stata creata con l'assistenza di AI e potrebbe presentare delle imprecisioni. Per informazioni accurate, consultare i documenti originali collegati qui.

Si ringrazia arxiv per l'utilizzo della sua interoperabilità ad accesso aperto.

Altro dagli autori

Articoli simili