This document discusses structural and functional testing. Structural testing generates test cases based on the internal structure of a program, while functional testing generates test cases based on the program's functionality without considering internal structure. Some types of structural testing include statement coverage, branch coverage, path coverage, and conditional coverage. Types of functional testing include equivalence class partitioning and boundary value analysis. Testing has limitations in that it can find errors but not prove their absence, does not help find root causes, and only identifies known issues without uncovered defects.