This course discusses software faults and techniques to reduce faults and improve software quality. Software systems are some of the most complex human artifacts ever built and also some of the most critical means to ensure our safety, well being, and prosperity. This course teaches techniques to ensure software systems perform their function correctly. Topics include software specifications, goals of testing, techniques of test data selection, test oracle design, test data analysis, test lifecycle and quality impacts of testing.