This repository has been archived on 2024-10-22. You can view files and clone it, but cannot push or open issues or pull requests.
kse-02/README.md

141 lines
4.1 KiB
Markdown
Raw Normal View History

2023-11-13 12:47:53 +00:00
# Project 02 - Python test generator
### About the Project
This project has the goal of writing a search based automated test generator for Python.
It is part of the Knowledge Search & Extraction - 2023 course from the Università della Svizzera italiana.
In this repository, you can find the following files:
- `benchmark/` folder: which contains the benchmark of functions under test to be instrumented
2023-11-13 12:47:53 +00:00
Note: Feel free to modify this file according to the project's necessities.
2023-11-13 13:45:51 +00:00
## Environment setup
2023-11-13 12:47:53 +00:00
2023-12-26 12:55:44 +00:00
To install the required dependencies the Python version manager `pyenv` must be installed and in `$PATH`.
To set up a Python 3.11 virtualenv to execute parts 1, 2, and 3 of the project run:
2023-11-13 13:45:51 +00:00
```shell
deactivate || true # deactivate existing environment
pyenv install -s 3.11
pyenv shell 3.11
python3.11 -m venv env
2023-11-13 13:45:51 +00:00
source env/bin/activate
2023-12-26 12:55:44 +00:00
pip3.11 install -r requirements_3.11.txt
```
To set up Python 3.7 (last version supported by `mut.py`) to execute part 4 of the project run:
```shell
deactivate || true # deactivate existing environment
pyenv install -s 3.7
pyenv shell 3.7
python3.7 -m venv env37
2023-12-26 12:55:44 +00:00
source env37/bin/activate
pip3.7 install -r requirements_3.7.txt
2023-11-13 13:45:51 +00:00
```
## Instrumentation (Part 1)
2023-12-26 12:55:44 +00:00
To generate the instrumented code for all the files in the benchmark run the commands:
```shell
deactivate || true
pyenv shell 3.11
source env/bin/activate
python3.11 ./instrument.py
```
The generated files are created in the directory `instrumented`. Each file name matches the file name of the
corresponding source file in `benchmark`.
2023-12-26 12:55:44 +00:00
## Test case generation using the fuzzer (Part 2)
To generate test cases for all files in the benchmark using the fuzzer run the commands:
```shell
deactivate || true
pyenv shell 3.11
source env/bin/activate
python3.11 ./fuzzer.py
```
The test suite is created in the directory `fuzzer_tests`. One test file is generated for each file present in the
`benchmark` directory. Run the command with the `-h` options for more details on partial generation.
The test suite can be then executed over the benchmark code with the commands:
```shell
deactivate || true
pyenv shell 3.11
source env/bin/activate
python3.11 -m unittest discover fuzzer_tests
```
## Test case generation using the genetic algorithm (Part 3)
2023-12-26 12:55:44 +00:00
To generate test cases for all files in the benchmark using the genetic algorithm run the commands:
```shell
deactivate || true
pyenv shell 3.11
source env/bin/activate
python3.11 ./genetic.py
```
2023-12-26 12:55:44 +00:00
The test suite is created in the directory `tests`. One test file is generated for each file present in the
2023-12-11 14:43:53 +00:00
`benchmark` directory. Run the command with the `-h` options for more details on partial generation.
2023-12-26 12:55:44 +00:00
The test suite can be then executed over the benchmark code with the commands:
```shell
deactivate || true
pyenv shell 3.11
source env/bin/activate
python3.11 -m unittest discover tests
```
## Mutation testing (Part 4)
To run `mut.py` use Python 3.7 and run:
```shell
# Reset Python to 3.7 version
deactivate || true
pyenv shell 3.7
source env37/bin/activate
python3.7 muttest.py
2023-12-26 12:55:44 +00:00
```
The script will consider the tests in `fuzzer_tests` and `tests` and run mutation testing on them, collecting the
mutation score for each run in `out/mutation_results_fuzzer.csv` and `out/mutation_results_genetic.csv` respectively.
2023-12-27 15:07:31 +00:00
If either or both file exist, the p run for the matching test suite will be skipped and the saved values will be
2023-12-26 12:55:44 +00:00
used.
The script additionally generates two plots for the distribution and average of mutation scores per kind of generation
and benchmark file. These two plots are saved in `out/mutation_scores.png` and `out/mutation_scores_mean.png`
respectively. `out/stats.csv` is also generated and will contain a statistical comparison between the mutation score
distribution for the fuzzer-generated and genetic-generated test of each benchmark file, including the average score for
2023-12-27 15:07:31 +00:00
both generations, the Wilcoxon paired test p-value, the Cohen's d effect size and its interpretation.
# Report
To compile the report run:
```shell
cd report
pdflatex -interaction=nonstopmode -output-directory=. main.tex
pdflatex -interaction=nonstopmode -output-directory=. main.tex
```
The report is then located in `report/main.pdf`.