There is also generative testing, which can be a good middle-ground between hand-crafted tests and fuzzing. You can think of it as a fuzzer with more guidance regarding input generation, and can uncover edge-cases that a fuzzer would take forever to discover. I tend to think of those 3 approaches as complementary.
Example in Clojure: https://github.com/clojure/test.check
Re:Fuzzing FFmpeg for fun and profit
by andrewchambers on Sunday November 01, 2015 @11:46PM
(#10490035)
And then after that you need to go into formal proofs.
So when asked, "Why fuzz test?" I can answer, "remember when you wrote fifteen test cases and wondered to yourself whether you needed a sixteenth? But then you decided that it would take more work than it's worth to do that. -- Well, now we can tell the computer to just keep trying stuff until it finds unique cases."