Python – programming is fun again
knivets.com
knivets.com
I still personally just aim for a combination of auto-verified 100% coverage, and an intuitive sense of whether it's real testing or "call this to get it in the coverage report" testing; I also try to keep functions/methods short enough, and overall systems simple enough, to be able to think about the various code paths and ensure I have tests to cover them all.
I don't and never have worried about whether I'm appropriately type-checking everything, and in fact that idea is antithetical to why I work in Python (i.e., Python is a "care about the interfaces, not about the types" language). I have seen people coming from Java-land who write tons of "if not isinstance(some_var, some_type)" checks, but sooner or later they get over it and learn that these things are rarely if ever actually necessary.