Skip to main content
Archived

This project has been archived by its maintainers, and is no longer receiving any updates.

Props

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)

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.obj = BinaryTree

To Do

Metadata

Release files for props 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for props 0.0.1
File Size Uploaded
props-0.0.1.tar.gz 4.5 kB Details

Release files / props-0.0.1.tar.gz

Download URL props-0.0.1.tar.gz
Size 4.5 kB
Tags Source
SHA-256 checksum
How to use checksums
974b5089892a1adcc23b65f46baefb5343960a87d6d5b5d0a3359c1023642df2
BLAKE2b-256 checksum
How to use checksums
2e4c4fa0601e021a70e97533c26e728b61cd8c033d889bd36595857a91420a20
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

This release

0.0.1 This release

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page