Skip to main content

QuickCheck for Python

This project has been archived.

The maintainers of this project have marked this project as archived. No new releases are expected.

Project description

Property-based testing for Python à la QuickCheck.

for_all

for_all takes a list of generators (see below) and a property. It then tests the property for arbitrary values of the generators.

Here’s an example testing the commutative and associative properties of ints:

for_all(int, int)(lambda a, b: a + b == b + a)
for_all(int, int)(lambda a, b: a * b == b * a)
for_all(int, int, int)(lambda a, b, c: c * (a + b) == a * c + b * c)

Properties

Properties are functions which take instances of generators and return True if their condition is met:

def prop_associative(a, b, c):
    return a + (b + c) == (a + b) + c

for_all(int, int, int)(prop_associative)
for_all(float, float, float)(prop_associative)  # Warning: float isn't actually associative!

Properties can also fail early by raising AssertionError:

def prop_list_append_pop(list, element):
    if element not in list:
        list.append(element)
        assert element in list
        list.pop()
        return element not in list
    return element in list

for_all(list, int)(prop_list_append_pop)

Generators

Note: These are not the same as Python generators. We should rename them. Generaters? Blech.

A generator is a specification of a set of possible Python objects. A generator is either:

  • One of the following built-in types:

    • None, bool, int, float, long, complex, str, tuple, set, list, or dict

  • A class that implements the ArbitraryInterface

  • Or constructed using the generator combinators.

Combinators

  • maybe_a

    • Generates either an arbitrary value of the specified generator or None.

  • maybe_an

    • An alias for maybe_a. Provided for syntactic convenience.

  • one_of

    • Generates an arbitrary value of one of the specified generators.

  • tuple_of

    • Generates a tuple by generating values for each of the specified generators.

  • set_of

    • Generates a homogeneous set of the specified generator. You can generate non-homogeneous sets using set.

  • list_of

    • Generates a homogeneous list of the specified generator. You can generate non-homogeneous lists using list.

  • dict_of

    • Generates a homogeneous dict of the specified generators using kwargs. You can generate non-homogeneous dicts using dict.

arbitrary

arbitrary takes a generator and returns a single instance of the generator.

ArbitraryInterface

We provide a mixin with one classmethod, arbitrary, which raises NotImplementedError. To implement generators for your own classes, please inherit from ArbitraryInterface and provide an implementation for arbitrary.

Here’s an example implementation of a Binary Tree class:

class BinaryTree(ArbitraryInterface):
    ...
    @classmethod
    def arbitrary(cls):
        return arbitrary(one_of(Leaf, Node))

class Leaf(BinaryTree):
    ...
    @classmethod
    def arbitrary(cls):
        return cls(...)  # an instance of Leaf.

class Node(BinaryTree):
    ...
    @classmethod
    def arbitrary(cls):
        return cls(
            ...
            # This is equivalent:
            arbitrary(BinaryTree),
            # to this:
            BinaryTree.arbitrary()
        )  # an instance of Node with two subtrees.

AbstractTestArbitraryInterface

We also provide an AbstractTestArbitraryInterface with you can mixin to your test cases for each class that implements ArbitraryInterface to ensure the arbitrary method is implemented:

class TestBinaryTree(AbstractTestArbitraryInterface,
                     TestCase):
    def setUp(self):
        self.cls = BinaryTree

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

props-0.0.4.tar.gz (5.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

props-0.0.4-py3-none-any.whl (5.9 kB view details)

Uploaded Python 3

File details

Details for the file props-0.0.4.tar.gz.

File metadata

  • Download URL: props-0.0.4.tar.gz
  • Upload date:
  • Size: 5.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for props-0.0.4.tar.gz
Algorithm Hash digest
SHA256 353f653a1dbf7103b3df146234999dac4bb3350aed352b56061a095719138afd
MD5 abfec064f6419b1e3ed7740588ec38fb
BLAKE2b-256 6d69cc4da89454561dfdca9059309a28cbac7173e6bfb80d782358aa7a32e2cb

See more details on using hashes here.

File details

Details for the file props-0.0.4-py3-none-any.whl.

File metadata

  • Download URL: props-0.0.4-py3-none-any.whl
  • Upload date:
  • Size: 5.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for props-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 581931e71d7d249194bee83ef9543e06c05c0b54eb7201a943dbb9ac1ba9ce1f
MD5 9537103c0ba7f6b6516dc87d145dba6b
BLAKE2b-256 38a549736357833f32c4097399774209ef65dd90a3b5113c12978b1ff3b294d0

See more details on using hashes here.

Supported by

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