We have already seen that in test-driven development, it is common to start development by designing and writing acceptance tests to define what the software should do and then dive into the details of how to do it with lower-level tests. That frequently is the foundation of Acceptance Test-Driven Development (ATDD), but more generally, what we are trying to do is to define a Fitness Function for our whole software. A fitness function is a function that, given any kind of solution, tells us how good it is; the better the fitness function, the closer we get to the result.
Even though fitness functions are typically used in genetic programming to select the solutions that should be moved forward to the next iteration, we can see our acceptance tests as a big fitness function that takes the whole software as the input and gives us...