On Fri, Aug 15, 2014 at 12:02:21PM +0200, Dennis Brakhane wrote:
Unit testing your own code is the only way you can "guarantee" that your code runs correctly.
That is actually backwards. Unit testing cannot guarantee the code is correct. If you have 1000 tests, all that you have proved is that the code works for those 1000 cases. It tells you nothing about all the uncounted billions of other cases you haven't written tests for. Given some set of tests which pass, you can be confident that your code gets at least those things correct (assuming the tests are themselves correct -- you write tests for your tests, don't you? *wink*). But that's all. As Dijkstra said, “Program testing can be used to show the presence of bugs, but never to show their absence.” To put it another way, there could be a million bugs hiding in all the corners of your code that you don't test, and you can never test *everything*. Static typing is complementary to unit testing. Static typing can eliminate a lot of the unit tests that you otherwise would have to write. For example, you might have unit tests that try to demonstrate that given arguments of type float, the function will return a float; given Fraction arguments, the function returns a Fraction; and so on. A static type checker can *prove* that[1] instead of merely testing it with a few dozen examples and hoping the result generalises to all the billions of other floats and Fractions not tested. Static typing is actually a form of automated correctness testing. [1] Assuming you trust that the checker itself is bug free. -- Steven