Software is complex stuff. Even relatively straightforward applications that do only a few things can have a dizzying number of possible “journeys” for users to take. Ideally, every one of those journeys is tested under all possible circumstances to ensure the software works as expected and doesn’t crash, pop-up useless error messages, or provide wrong answers.