2.1 The requirements say it all2.1.1 Step 1: Understanding the requirements, inputs, and outputs2.1.2 Step 2: Explore what the program does for various inputs2.1.3 Step 3: Explore possible inputs and outputs, and identify partitions2.1.4 Step 4: Analyze the boundaries2.1.5 Step 5: Devise test cases2.1.6 Step 6: Automate the test cases2.1.7 Step 7: Augment the test suite with creativity and experience2.2 Specification-based testing in a nutshell2.3 Finding bugs with specification testing2.4 Specification-based testing in the real world2.4.1 The process should be iterative, not sequential2.4.2 How far should specification testing go?2.4.3 Partition or boundary? It does not matter!2.4.4 On and off points are enough, but feel free to add in and out points2.4.5 Use variations of the same input to facilitate understanding2.4.6 When the number of combinations explodes, be pragmatic2.4.7 When in doubt, go for the simplest input2.4.8 Pick reasonable values for inputs you do not care about2.4.9 Test for nulls and exceptional cases, but only when it makes sense2.4.10 Go for parameterized tests when tests have the same skeleton2.4.11 Requirements can be of any granularity2.4.12 How does this work with classes and state?2.4.13 The role of experience and creativityExercisesSummary