This book is based on a series of lectures given at Maynooth University and Zhejiang University. It provides a textbook for a number of courses, describing the fundamentals of software testing. The material has been developed over the past ten years, and reflects both the experience of 20 years in industry from one of the authors, and the authors’ joint experience in lecturing. There is no one standard textbook on software testing, and this book is the result of many years of extracting and interpreting test techniques from a wide and varied number of sources. These include testing classics such as The Art of Software Testing by Myers, Software Testing by Roper, Testing Object- Oriented Systems by Binder, and Introduction to Software Testing by Ammann and Offutt; standard software engineering textbooks such as Software Engineering by Pressman , and Software Engineering by Sommerville; software process books such as Software Testing in the Real World by Kit and extreme Programming explained by Beck; and ISO and IEEE standards related to software quality and testing. Software testing is a challenging task–it is as important for businesses and government as it is for research institutions. It is still as much an art as a science: there are no accepted standards or norms for applying the various techniques, and interpretation is required. There is no well established research on the effectiveness of the different approaches. The techniques are easy to understand, but generally difficult to apply to real-world software. By providing extensive worked examples, this book aims to provide a solid basis for both understanding, and applying, various test techniques In the second edition, many of the examples have been updated, and the sections on Integration Testing and System Testing have been expanded. The examples have been updated to work with the latest version of the tools used, and a companion website is provided (www.softwaretestingbook.org). The software tools used in this book are merely representative–they have not been selected as the best example of each, but rather as good examples of the range of capabilities that such tools exhibit. The key goal of the book is that the reader should understand the principles of software testing, and be able to apply them in practice. The book does not endorse or recommend any particular tool. Only a subset of the tool features are covered in this book: the reader should refer to the tool-specific documentation for more details.