An excellent topic - probably the best one I have seen for a long time
I think of correctness in terms of the formal (axiomatic) definition. "Partial Correctness" guarantees that the software (or unit being tested) behaves correctly, "total correctness" guarantees partial correctness (it behaves correctly) AND that it terminates.
I have used JUnit quite a lot - good for unit testing but often you need other testing too to test the integration of all the units of functionality together rather than just unit testing.
I have done a reasonable amount of formal specification before (memories of Z), it is OK but I don't think as useful in the "real world" practical application