Skip to main content

No project description provided

Project description

GitHub PyPI - Python Version

genut-py

genut-py is a semi-automatic unit test generator for Python

Description

Unit tests are crucial in software development.

However, writing unit tests is a laborious task and it often requires more efforts than implementing a new feature.

Before writing unit tests, we often know that our implementation certainly works correctly by executing a program with some actual inputs and observing its outputs.

Our program utilizes the execution to generate unit tests.

By adding decorators to target functions or methods, some inputs are selected from the execution based on its coverage, and then, unit tests in pytest format are generated automatically.

The generated tests is relatively easy to interpret as the inputs are "actual" data.

manual semi-automatic automatic
methods hand-craft retrieve from execution fuzz, smt-solver
tools genut-py UnitTestBot, Pynguin
interpretability high medium low
developper's burden high low low
coverage low medium high

Example

Generate Unit Tests of Functions

from genut_py import GenUT


@GenUT
def compare(x, y):
    if x < y:
        return -1
    if x == y:
        return 0
    if x > y:
        return 1
    assert False


for i in range(10):
    for j in range(10):
        compare(i, j)

In default settings, the script below will be generated as compare_test_class.py under .genut directory by running the script above.

from ..examples.function import compare


class TestCompare:
    def test_compare_0():
        x = 0
        y = 0

        actual = compare(x,y)
        expected = 0

        assert actual == expected

    def test_compare_1():
        x = 0
        y = 1

        actual = compare(x,y)
        expected = -1

        assert actual == expected

    def test_compare_2():
        x = 1
        y = 0

        actual = compare(x,y)
        expected = 1

        assert actual == expected

Generate Unit Tests of Methods

from genut_py import GenUT


class User:
    def __repr__(self):
        return f"User(name={self.name.__repr__()}, age={self.age.__repr__()})"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    @GenUT
    def is_adult(self):
        if self.age >= 20:
            return f"{self.name} is adult"
        return f"{self.name} is child"


user = User(name="John", age=19)
user.is_adult()
user2 = User(name="Tom", age=25)
user2.is_adult()

In default settings, the script below will be generated as user_is_adult_test_class.py under .genut directory by running the script above.

from ..examples.method import User


class TestUserIsAdult:
    def test_user_is_adult_0():
        user = User(name="John", age=19)

        actual = user.is_adult()
        expected = "John is child"

        assert actual == expected

    def test_user_is_adult_1():
        user = User(name="Tom", age=25)

        actual = user.is_adult()
        expected = "Tom is adult"

        assert actual == expected

Getting Started

Installation

pip install genut-py

Development

Format & Lint

# under /
make check

Generate Docs

# under /docs
poetry run make html

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

genut_py-0.1.1.tar.gz (6.0 kB view hashes)

Uploaded Source

Built Distribution

genut_py-0.1.1-py3-none-any.whl (7.1 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page