Because of the boundaries and assumptions that we've just been looking at, we need to design our suite of tests so that:
The full set of our tests, when combined, actually gives us all the knowledge we want to gain.
Each individual test only gives us knowledge within its boundaries and assumptions; so how do we overlap those boundaries, so that they reliably inform us about the real behavior of the entire system? The answer to this question may also affect the design of the software system being tested, because some designs are harder to completely test than others.
The question of test design leads us into the many methods of testing being practiced today, so let's here examine end to end testing, integration testing, and unit testing.