Tests are simply one way of adding redundancy to your code with the idea that reification of a concept is less likely to be incorrect if it is implemented in two different ways. There are other ways to add this redundancy, for example assertions (assuming you have a tool that does model-checking) or static type system annotations.
in reply to Testing 1...2...3...
Whenever you add redundancy, you also add inertia -- resistance to change -- because now each change that you make must be made in (at least) two places: ideally two different ways in those two places.
use-case testing is almost always necessary because it is unlikely that any specification can fully capture the nuances of the requirements. Unit testing is somewhat more fungible.
Opinions my own; statements of fact may be in error.