There's the beginnings of an algebraic type system hiding in 10 (do Get["TypeSystem`"], then try RandomData[Vector[Atom[Integer]]). So generating synthetic data for a function with a given signature is already possible. Now we need to be able to express invariants etc, and then minimize counterexamples.