This document provides an overview of testing and discusses four main purposes of testing: assertion, design, communication, and discovery. It discusses using tests for assertion to ensure code behaves as expected. Tests can also be used as a design tool, such as with test-driven development (TDD) or behavior-driven development (BDD). Well-named tests improve communication by clearly describing intended behavior. Characterization tests are used for discovery when working with legacy code without tests, to understand what the code is doing before changing it. The document provides examples of using tests for each purpose.