Pyster
Pyster is a coverage-driven automatic unit test generator for Python projects.
Pre-request
- Python 3
-
Coverage.py (
pip3 install coverage
) -
pytest (
pip3 install pytest
)
Usage
# Stage 1: Init pyster config file
python3 -m pyster.init \
--project_path <path-to-project> \
--module_name <module-for-testing> \
--path_runtime <runtime-analysis-code>
# Stage 2: Generate unit tests
python3 -m pyster.gen \
--project_path <path-to-project> \
--module_name <module-for-testing> \
--user_tests <list-of-existing-test-files> \
--timeout <timeout-limit> \
--coverage <coverage-target>
# Run Stage 1 and Stage 2 together:
python3 -m pyster \
--project_path <path-to-project> \
--module_name <module-for-testing> \
--path_runtime <runtime-analysis-code> \
--user_tests <list-of-existing-test-files> \
--timeout <timeout-limit> \
--coverage <coverage-target>
Test
pytest tests
Sample execution
# Phase 1
python3 -m pyster.init --project_path tests/foobar --module_name foobar.foobar
# Phase 2
python3 -m pyster.gen --project_path tests/foobar --module_name foobar.foobar -t 1 -c 80
Pyster Logic
The graph above is a high-level summary of Pyster's workflow.
Pyster contains two phases:
-
Phase 1: Type Analysis (
init
stage)- Input:
-
project_path
: Absolute/relative path to project folder -
module_name
: Name of Python module for generating tests -
path_runtime
(optional): User-written Python file (e.g. existing test files) that makes use of functions in the selected module.
-
- Output:
-
module_name.json
: A configuration file containing all information used to randomly generate function calls. (All function signatures and their argument types, constructor of user-defined classes, etc.) This file can be further modified by user to provide more detailed type-related information.
-
- Input:
-
Phase 2: Test Generation (
gen
stage)- Input:
-
timeout
: Pyster terminates aftertimeout
seconds. -
coverage
: Pyster terminates after test cases reachcoverage
code coverage rate. -
user_tests
(optional): If current module already has test suite,user_tests
can be provided as a list of files so that Pyster will not generate tests covering lines already tested.
-
- Output:
- A runnable
module_nameTest.py
file containing all automatically generated unit tests as well as command-line output of coverage report.
- A runnable
- Input: