This course exposes students to the fundamental principles and processes of software testing. The aim is to increase the student’s productivity as software engineers, and improve the reliability of the code they produce. The course starts by introducing how to examine testability of system requirements. The course then concentrates on code testability, which is essential to ensure automated regression testing. Students will actively learn a variety of strategies to systematically find software bugs and defects. The most recently developed techniques for automated testing, static analysis and passive monitoring are thoroughly covered in this course.