50.053 Software Testing and Verification

Home / Education / Undergraduate / Courses / 50.053 Software Testing and Verification

Course Information

The course will introduce the fundamental concepts behind various automated testing algorithms and introduce basic concepts behind verification (specifically, model checking). The focus of the
course will be more on the design of test algorithms than the usage of testing tools. At the end of the course, students are expected to gain knowledge on how to test arbitrarily complex systems. The course will provide a brief recap on the testing introduced earlier e.g., coverage-based testing and unit testing. Subsequently, it will dive deep into the systematic test generation strategies. The concluding week of the course will involve discussion of some selected and impactful recent research on software testing and draw an unusual synergy between the model checking (verification) and testing. The course will involve the development of a medium scale software project prototype from scratch (w/o libraries, w/o plugins) and the software prototype will be tested via the systematic testing mechanisms learned in the course. The software prototypes will be exchanged among different groups to mimic the testing culture in industry.


Learning Objectives

  1. Design and implement software test generation algorithm from scratch.
  2. Apply key ideas to design directed testing methodologies.
  3. Learning and applying techniques to systematically test the software security.
  4. Learning techniques to apply formal verification techniques on small to medium scale software.
  5. Learning techniques to test software systems without oracles.
  6. Learning techniques to test stateful software systems and ML-based software systems.

Measurable Outcomes

  1. Build test generation techniques for complex software systems
  2. Prototype software testing algorithms to validate medium scale software systems
  3. Engineer test generation algorithms to direct towards faults and certain code
  4. Build models and properties of software systems for verification
  5. Build test generation algorithms for software systems without ground truth
  6. Build blackbox software testing techniques for validating protocols and data-driven systems
  7. Engineer software testing techniques to check regression errors

Textbook(s) and/or Other Required Material

Required Texts and Readings
There are no textbooks for this course. The following book can be used as a reference for the course:
“Software Testing and Analysis: Process, Principles, and Techniques”, Mauro Pezze and Michal Young,
Chapters 1, 2, 4, 5, 6, 7, 9, 11, 12, 13, 14, 16.


  • Dependency analysis, Slicing and data flow analysis.
  • Introduces specification based testing techniques, e.g., grammar-based testing.
  • Directed testing methodologies e.g., using the dependency analysis.
  • Basic mutation testing and higher order mutation testing.
  • Simulated annealing, genetic algorithm, others.
  • Change directed search, change directed symbolic execution.
  • Rationale behind the success of fuzzing in software security: Mutational and Generational Fuzzing. Hybrid Fuzzing.
  • Model checking algorithm (Explicit State Model checking and SAT-based Software Model Checking).
  • Metamorphic testing, differential testing etc.
  • Testing Machine Learning Systems, Testing stateful systems.

Course Instructor(s)

Prof Sudipta Chattopadhyay

Image Credit