To produce better quality software at reasonable cost, we propose requirements-based testing, in which testing is driven directly from the requirements and faults that prevent the product from meeting its requirements are detected. Our approach makes use of requirements in the form of goals and scenarios. From these we generate test scenarios that drive the system under test through particular paths of the scenarios, and a test harness that verifies the system follows the particular path and meets its conditions. Because our test scenarios are derived directly from the requirements, a major benefit of the process of writing test scenarios is the identification of poorly formulated requirements. We applied our approach to a sample software system and to mutants of it generated by MuJava. Our approach was effective at finding implementation faults that caused the system to diverge from the requirements.