PayCheck is a half-baked implementation of ScalaCheck, which itself is an implementation of QuickCheck for Haskell. PayCheck is useful for defining a specification of what a function should do, rather than testing its results for a given input.

Thanks to gcross for some of the more recent changes

Installing PayCheck <code> sudo easy_install paycheck </code> That’s it. Get going.

A Quick Example Let’s steal an example right from ScalaCheck. Here are the string functions ported to PayCheck. See what’s going on? We’re defining the types of the parameters in with_checker, then values of that type are getting passed to the function. <code> import unittest from paycheck import with_checker class TestStrings(unittest.TestCase): """ More-or-less a direct port of the string testing example from the ScalaCheck doc at: http://code.google.com/p/scalacheck/ """ @with_checker(str, str) def test_starts_with(self, a, b): self.assertTrue((a+b).startswith(a)) @with_checker(str, str) def test_ends_with(self, a, b): self.assertTrue((a+b).endswith(b)) # Is this really always true? @with_checker(str, str) def test_concat(self, a, b): self.assertTrue(len(a+b) > len(a)) self.assertTrue(len(a+b) > len(b)) @with_checker(str, str) def test_substring2(self, a, b): self.assertEquals( (a+b)[len(a):], b ) @with_checker(str, str, str) def test_substring3(self, a, b, c): self.assertEquals((a+b+c)[len(a):len(a)+len(b)], b) if __name__ == '__main__': unittest.main() </code> Then give the ol’ test a run. You’ll likely see a problem: <code> $ python test_strings.py F.... ====================================================================== FAIL: test_concat (__main__.TestStrings) ---------------------------------------------------------------------- Traceback (most recent call last): File "paycheck/checker.py", line 11, in wrapper test_func(self, *v) File "test_strings.py", line 20, in test_concat self.assertTrue(len(a+b) > len(a)) AssertionError: Failed for input ('UGzo2LP<(9Gl_*o*GH$H<+{wPiNk?', '') ---------------------------------------------------------------------- Ran 5 tests in 0.051s FAILED (failures=1) </code> As predicted, test_concat has bombed; note that PayCheck is nice enough to tell you which inputs caused the problem. In this case, we see that propety test_concat fails for the empty string, which is caused by the fact that we used “>” instead of “>=”.