A quantized LLM driven framework for automated software testing
Ahmed, Rashed (2026)
Diplomityö
Ahmed, Rashed
2026
School of Engineering Science, Tietotekniikka
Kaikki oikeudet pidätetään.
Julkaisun pysyvä osoite on
https://urn.fi/URN:NBN:fi-fe2026042935854
https://urn.fi/URN:NBN:fi-fe2026042935854
Tiivistelmä
Unit testing remains one of the most expensive recurring activities in software development, especially in small teams where test maintenance competes with feature delivery. Although automated test generation has improved, many approaches remain difficult to operationalize in everyday workflows because outputs are brittle, execution reliability is inconsistent, and cloud-dependent inference introduces confidentiality and reproducibility concerns. This thesis addresses that gap by implementing and evaluating a local, reproducible framework for LLM-assisted unit test generation for Python repositories.
The framework combines repository file discovery, sandboxed module isolation, promptdriven test generation with a fine-tuned and quantized Qwen2.5-Coder-1.5B model, AST-based post-processing, pytest execution under Coverage.py, and iterative refinement using error feedback. The implementation is available in both command-line and web-based forms, with persistent run artefacts, per-file reports, and explicit handling of difficult cases through skip and mark-complete controls.
Empirical evaluation is based on eight recorded runs and 22 non-skipped file-level evaluations. The mean per-file statement coverage is 93.82%, with median 100%, minimum 83%, and maximum 100%. The strict pytest pass rate is 81.8% (18/22), while operational completion reaches 90.9% (20/22) when marked-complete outcomes are included. Refinement is required for 4/22 files, with a mean of 0.27 refinement attempts. Results show that the framework can reliably bootstrap compact executable tests on small modules in an offline setting. The main remaining limitation is oracle-level assertion mismatch rather than syntax or import failure, indicating that future improvements should prioritize semantic guidance and stronger correctness signals during refinement. The workflow supports transparent replay, inspection, and iterative configuration tuning. Ohjelmistotestaus on keskeinen ohjelmistojen laadun ja luotettavuuden varmistamisessa, mutta yksikkötestien kirjoittaminen ja ylläpito on edelleen aikaa vievää. Perinteiset automaattiset menetelmät voivat parantaa kattavuutta, mutta niiden tuottamat testit eivät aina ole suoraan käytännössä hyödynnettäviä. Myös kielimallipohjaisessa testigeneroinnissa on haasteita, kuten suoritettavuusongelmat, epävarmat odotusarvot sekä toistettavuus- ja tietosuojaongelmat pilvipohjaisissa ratkaisuissa. Tässä diplomityössä tarkastellaan, miten Python-projekteille voidaan rakentaa käytännöllinen, paikallisesti toimiva ja toistettava LLM-avusteinen testigenerointiprosessi.
Työssä toteutetaan päästä päähän -kehys, joka etsii lähdetiedostot, generoi PyTest-testit hienosäädetyllä ja kvantisoidulla Qwen2.5-Coder-1.5B -mallilla, validoi ja normalisoi tulokset AST-pohjaisilla tarkistuksilla, suorittaa testit Coverage.py-mittauksella eristetyssä hiekkalaatikossa sekä iteratiivisesti jalostaa epäonnistuvia testejä pytest-palautteen perusteella. Kehys on toteutettu sekä komentoriviputkena että Flask-pohjaisena verkkosovelluksena, joka tallentaa lokit, välitulokset ja tiedostokohtaiset raportit.
Arviointi perustuu kahdeksaan tallennettuun ajokertaan ja 22 ei-ohitettuun tiedostotason arviointiin. Tiedostokohtainen statement-kattavuus on keskimäärin 93.82% (mediaani 100%, minimi 83%, maksimi 100%). Tiukan pytest-kriteerin mukainen läpäisyosuus on 81.8% (18/22). Kun marked-complete-tilat huomioidaan, operatiivinen valmistumisaste nousee 90.9%:iin (20/22). Jalostusta tarvittiin 4 tiedostossa 22:sta, ja jalostuskierroksia oli keskimäärin 0.27 tiedostoa kohden. Tulokset osoittavat, että kehys tuottaa paikallisesti ajettavia, kompakteja testejä tehokkaasti erityisesti pienille Python-moduuleille. Keskeinen jäljelle jäävä rajoite liittyy odotusarvojen semanttiseen oikeellisuuteen, ei niinkään syntaksi- tai tuontivirheisiin.
The framework combines repository file discovery, sandboxed module isolation, promptdriven test generation with a fine-tuned and quantized Qwen2.5-Coder-1.5B model, AST-based post-processing, pytest execution under Coverage.py, and iterative refinement using error feedback. The implementation is available in both command-line and web-based forms, with persistent run artefacts, per-file reports, and explicit handling of difficult cases through skip and mark-complete controls.
Empirical evaluation is based on eight recorded runs and 22 non-skipped file-level evaluations. The mean per-file statement coverage is 93.82%, with median 100%, minimum 83%, and maximum 100%. The strict pytest pass rate is 81.8% (18/22), while operational completion reaches 90.9% (20/22) when marked-complete outcomes are included. Refinement is required for 4/22 files, with a mean of 0.27 refinement attempts. Results show that the framework can reliably bootstrap compact executable tests on small modules in an offline setting. The main remaining limitation is oracle-level assertion mismatch rather than syntax or import failure, indicating that future improvements should prioritize semantic guidance and stronger correctness signals during refinement. The workflow supports transparent replay, inspection, and iterative configuration tuning.
Työssä toteutetaan päästä päähän -kehys, joka etsii lähdetiedostot, generoi PyTest-testit hienosäädetyllä ja kvantisoidulla Qwen2.5-Coder-1.5B -mallilla, validoi ja normalisoi tulokset AST-pohjaisilla tarkistuksilla, suorittaa testit Coverage.py-mittauksella eristetyssä hiekkalaatikossa sekä iteratiivisesti jalostaa epäonnistuvia testejä pytest-palautteen perusteella. Kehys on toteutettu sekä komentoriviputkena että Flask-pohjaisena verkkosovelluksena, joka tallentaa lokit, välitulokset ja tiedostokohtaiset raportit.
Arviointi perustuu kahdeksaan tallennettuun ajokertaan ja 22 ei-ohitettuun tiedostotason arviointiin. Tiedostokohtainen statement-kattavuus on keskimäärin 93.82% (mediaani 100%, minimi 83%, maksimi 100%). Tiukan pytest-kriteerin mukainen läpäisyosuus on 81.8% (18/22). Kun marked-complete-tilat huomioidaan, operatiivinen valmistumisaste nousee 90.9%:iin (20/22). Jalostusta tarvittiin 4 tiedostossa 22:sta, ja jalostuskierroksia oli keskimäärin 0.27 tiedostoa kohden. Tulokset osoittavat, että kehys tuottaa paikallisesti ajettavia, kompakteja testejä tehokkaasti erityisesti pienille Python-moduuleille. Keskeinen jäljelle jäävä rajoite liittyy odotusarvojen semanttiseen oikeellisuuteen, ei niinkään syntaksi- tai tuontivirheisiin.
