I had the same question, and after reading the comments, here is what I think now (with due respect to the previous answers):
I think the problem may be that both of us allegedly took the goal of unit tests - to prove the correctness of the code and applied this goal to the tests themselves. This is as beautiful as possible, except for the purpose of unit tests not to prove the correctness of the code .
As with all non-trivial endeavors, you can never be 100% sure. The correct goal of unit tests is to reduce errors , not eliminate them. In particular, as others have noted, when you make changes later, it can accidentally break something. Unit tests are just one tool to reduce errors and, of course, should not be the only one. Ideally, you combine unit testing with code review and robust QA to reduce errors to an acceptable level.
Unit tests are much simpler than your code; it's impossible to make your code as simple as unit test if your code does something meaningful. If you write “small, granular” code that is easy to prove correct, then your code will consist of a huge number of small functions, and you still have to determine if they all work correctly.
Since unit tests are inevitably simpler than those they test, they are less likely to have errors. Even if some of your unit tests are buggy, in general, they will still improve the quality of your main code base. (If your unit tests are so flawed that this is not true, then probably your main code base is also a bunch, and you are completely screwed. I think we all accept the basic level of competency.)
If you want to apply the second level of unit testing to validate your unit tests, you can do this, but it will decrease. To look at this fake:
Suppose unit testing reduces production errors by 50%. Then you write meta-object tests (unit tests for finding errors in unit tests). Say it detects problems with your unit tests, reducing production errors by up to 40%. But it took 80% of the time to write meta-unit tests, as was done to write unit tests. For 80% of the effort, you got another 20% of the gain. Writing meta-unit tests may give you another 5 percentage points, but now it took 80% of the time needed to write tests on the meta-module, so for 64% of the effort to write unit tests (which you gave 50%) 5%. Even with significantly more liberal numbers, this is not an effective way to spend time.
In this scenario, it’s clear that moving to the time of writing unit tests is not worth the effort.