Our great sponsors

Another strategy is exhaustive generation. There, all possible values for some type are generated in some welldefined order  typically from "small" to "large" values, and with some upper bound, as once you go past booleans the number of values for most types are (countably) infinite. For example, trying all the integers between 20 and 20 in "zig zag" order 0,1,1,2,2,.... SmallCheck for Haskell and SciFe for Scala do this, but this approach is not so wellknown. It's a shame as random and exhaustive generation are complementary  if you think of generating values as exploring some large space to find failing tests, random generation is a serendipitous type of exploration, while exhaustive generation is diligently mapping out all the paths in some area.