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

129 lines
3.9 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.
If either or both file exist, the mutation run for the matching test suite will be skipped and the saved values will be
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
both generations, the Wilcoxon paired test p-value, the Cohen's d effect size and its interpretation.