Both the state of the art and the state of the practice of testing are flawed.
Theory (the state of the art) presents us with a rich set of approaches for removing errors from software, but very little advice on how to pick and choose from that set. In fact, theory often suggests eschewing much of testing, using such formal approaches as proof of correctness instead.