Any nontrivial program contains some errors in the source code. These "bugs" are annoying for users if they lead to application crashes and data loss, and they are worrisome if they lead to privacy leaks and security exploits. The economic damage caused by software bugs can be huge, and when software controls safety critical systems such as automotive software, then bugs can kill people. The primary tool to reveal and eliminate bugs is software testing: Testing a program means executing it with a selected set of inputs and checking whether the program behaves in the expected way; if it does not, then a bug has been detected. The aim of testing is to find as many bugs as possible, but it is a difficult task as it is impossible to run all possible tests on a program. The challenge of being a good tester is thus to identify which are the best tests that help us find bugs, and to execute them as efficiently as possible. In this chapter, we explore different ways to measure how "good" a set of tests is, as well as techniques to generate good sets of tests.
Fraser, G., & Rojas, J. M. (2019). Software testing. In Handbook of Software Engineering (pp. 123–192). Springer International Publishing. https://doi.org/10.1007/978-3-030-00262-6_4