Developers cope with the complexity of modern software systems and speed up the development process by increasingly relying on the functionalities provided by off-the-shelf components and frameworks. However, understanding how to properly use APIs of large libraries is non-trivial and requires extensive developer learning effort. With the rise of the open source movement since previous decade, an increasing quantity of source code has become available in public, and software developers have resorted to study and reuse existing source code to alleviate the aforementioned problems. However, manually exploring such source code, that is not necessarily designed in a reusable fashion, to find sufficient and adequate code examples for a given API is a difficult and time consuming activity. In response to the increasing need of meaningful code examples, research has been focusing on finding or generating relevant examples to assist developers during software development. Nevertheless, to extract usage examples for an API, existing approaches assume the availability of a reasonable sample of client code which use the API. However, this is a big assumption for newly released API libraries, non-widely used APIs, and private ones. This research reuses the important information that is naturally present in test cases of an API to circumvent lack of usage examples for that API when other sources of client code are lacking. For this purpose, I explore how each API method may contribute to a different part of a test scenario to identify the most representative API uses within a test case. Then, I investigate how test scenarios are organized to realize the type of relation among different API uses within a test scenario. The findings inspire the proposed approach for automatically synthesizing API usage examples from unit test cases. I implemented this approach in a prototype to evaluate its ability to automatically generate useful usage examples for real software systems that are unit tested during the software development. I compared the output of the prototype to both human-written examples as well a baseline approach. My studies show that the examples generated with the proposed approach is relatively similar to examples that are constructed from test cases manually. That is, when there is no other source of client code except unit test cases, the proposed approach facilitates providing API usage examples which are helpful for both the API developers and the API clients.

Gli sviluppatori affrontano la complessità dei sistemi software moderni affidandosi a componenti e framework off-the-shelf. Tuttavia, capire come utilizzare propriamente le loro API non è banale e richiede un impegno non indifferente. Con la nascita e la diffusione del movimento open source, è disponibile una quantità sempre crescente di codice sorgente. Gli sviluppatori hanno tentato di studiare e riutilizzare il codice esistente per alleviare i problemi sopra menzionati. Tuttavia, esplorare manualmente il codice sorgente al fine di localizzare un quantitativo sufficiente e adeguato di esempi sul come utilizzare una determinata API, è difficile e dispendioso in termini di tempo. In risposta alla necessità sempre crescente di ottenere esempi di codice significativi, i ricercatori si sono concentrati sul problema di trovare o generare esempi rilevanti al fine di assistere lo sviluppatore. Tuttavia, per estrarre esempi di utilizzo di una API, gli approcci esistenti assumono la disponibilità di un client di esempio che utilizza l’API. Questa è una assunzione forte per le API delle nuove librerie rilasciate, le API non molto utilizzate e quelle private. Per questo motivo, vista la mancanza di esempi di utilizzo di una determinata API all’interno del client code, questa ricerca riutilizza le informazioni presenti nei casi di test utilizzati dalla API stessa. A tal fine, in questa tesi, ho esplorato come ogni metodo presente nella API contribuisca a una diversa parte di uno scenario di test al fine di identificare il metodo più importante all’interno di un singolo caso di test. Ho quindi analizzato come gli scenari di test sono organizzati al fine di identificare le relazione tra le varie API utilizzate. I risultati di questa analisi hanno ispirato l’approccio proposto nella tesi, il quale sintetizza esempi di utilizzo delle API a partire dai test di unità. L’approccio presentato è stato implementato in un software prototipale al fine di valutare la capacità di generare esempi di uso utili atti a capire l’utilizzo di sistemi software reali. L’output prodotto è stato confrontato sia con approcci classici presentati in letteratura, sia con esempi d’uso scritti manualmente dagli sviluppatori. I miei studi hanno mostrato come gli esempi generati con l’approccio corrente siano simili a quelli prodotti manualmente dai casi di test. Quindi, quando non è presente del codice client che utilizza la libreria, ad eccezione dei casi di test, l’approccio proposto facilita l’estrazione di un insieme di esempi relativi all’utilizzo di una API. Tali esempi sono utili sia ai client, sia agli sviluppatori della API stessa.

Mining unit test cases to synthesize API usage examples automatically

GHAFARI, MOHAMMAD

Abstract

Developers cope with the complexity of modern software systems and speed up the development process by increasingly relying on the functionalities provided by off-the-shelf components and frameworks. However, understanding how to properly use APIs of large libraries is non-trivial and requires extensive developer learning effort. With the rise of the open source movement since previous decade, an increasing quantity of source code has become available in public, and software developers have resorted to study and reuse existing source code to alleviate the aforementioned problems. However, manually exploring such source code, that is not necessarily designed in a reusable fashion, to find sufficient and adequate code examples for a given API is a difficult and time consuming activity. In response to the increasing need of meaningful code examples, research has been focusing on finding or generating relevant examples to assist developers during software development. Nevertheless, to extract usage examples for an API, existing approaches assume the availability of a reasonable sample of client code which use the API. However, this is a big assumption for newly released API libraries, non-widely used APIs, and private ones. This research reuses the important information that is naturally present in test cases of an API to circumvent lack of usage examples for that API when other sources of client code are lacking. For this purpose, I explore how each API method may contribute to a different part of a test scenario to identify the most representative API uses within a test case. Then, I investigate how test scenarios are organized to realize the type of relation among different API uses within a test scenario. The findings inspire the proposed approach for automatically synthesizing API usage examples from unit test cases. I implemented this approach in a prototype to evaluate its ability to automatically generate useful usage examples for real software systems that are unit tested during the software development. I compared the output of the prototype to both human-written examples as well a baseline approach. My studies show that the examples generated with the proposed approach is relatively similar to examples that are constructed from test cases manually. That is, when there is no other source of client code except unit test cases, the proposed approach facilitates providing API usage examples which are helpful for both the API developers and the API clients.
BONARINI, ANDREA
BARESI, LUCIANO
21-dic-2015
Gli sviluppatori affrontano la complessità dei sistemi software moderni affidandosi a componenti e framework off-the-shelf. Tuttavia, capire come utilizzare propriamente le loro API non è banale e richiede un impegno non indifferente. Con la nascita e la diffusione del movimento open source, è disponibile una quantità sempre crescente di codice sorgente. Gli sviluppatori hanno tentato di studiare e riutilizzare il codice esistente per alleviare i problemi sopra menzionati. Tuttavia, esplorare manualmente il codice sorgente al fine di localizzare un quantitativo sufficiente e adeguato di esempi sul come utilizzare una determinata API, è difficile e dispendioso in termini di tempo. In risposta alla necessità sempre crescente di ottenere esempi di codice significativi, i ricercatori si sono concentrati sul problema di trovare o generare esempi rilevanti al fine di assistere lo sviluppatore. Tuttavia, per estrarre esempi di utilizzo di una API, gli approcci esistenti assumono la disponibilità di un client di esempio che utilizza l’API. Questa è una assunzione forte per le API delle nuove librerie rilasciate, le API non molto utilizzate e quelle private. Per questo motivo, vista la mancanza di esempi di utilizzo di una determinata API all’interno del client code, questa ricerca riutilizza le informazioni presenti nei casi di test utilizzati dalla API stessa. A tal fine, in questa tesi, ho esplorato come ogni metodo presente nella API contribuisca a una diversa parte di uno scenario di test al fine di identificare il metodo più importante all’interno di un singolo caso di test. Ho quindi analizzato come gli scenari di test sono organizzati al fine di identificare le relazione tra le varie API utilizzate. I risultati di questa analisi hanno ispirato l’approccio proposto nella tesi, il quale sintetizza esempi di utilizzo delle API a partire dai test di unità. L’approccio presentato è stato implementato in un software prototipale al fine di valutare la capacità di generare esempi di uso utili atti a capire l’utilizzo di sistemi software reali. L’output prodotto è stato confrontato sia con approcci classici presentati in letteratura, sia con esempi d’uso scritti manualmente dagli sviluppatori. I miei studi hanno mostrato come gli esempi generati con l’approccio corrente siano simili a quelli prodotti manualmente dai casi di test. Quindi, quando non è presente del codice client che utilizza la libreria, ad eccezione dei casi di test, l’approccio proposto facilita l’estrazione di un insieme di esempi relativi all’utilizzo di una API. Tali esempi sono utili sia ai client, sia agli sviluppatori della API stessa.
Tesi di dottorato
File allegati
File Dimensione Formato  
Thesis-Ghafari.pdf

solo utenti autorizzati dal 26/11/2016

Dimensione 535.24 kB
Formato Adobe PDF
535.24 kB Adobe PDF   Visualizza/Apri

I documenti in POLITesi sono protetti da copyright e tutti i diritti sono riservati, salvo diversa indicazione.

Utilizza questo identificativo per citare o creare un link a questo documento: https://hdl.handle.net/10589/114511