In the previous section, we saw how to use tests to design our application itself, exposing clear goals and forcing us to think about how the application should behave.
Once we start thinking a bit about what a test is actually doing, it slowly becomes clear why that works well: the tests are going to interact with the system under test. The way they are going to interact with the system they have to test is usually through the interface that the system exposes.
This means that the capabilities we are going to expose to any black-box test are the same capabilities that we are going to expose to any other user of the system under test.
If the system under test is the whole application, as in the case of the previous section, then it means that to write the test we will be forced to reason about the capabilities and the interface we are going to expose to our users themselves. In practice, having to write a test for that layer forces us to make clear the...