1. Read the requirements about a certain functionality.
2. Apply techniques like boundary value analysis, equivalence partitioning, ... on the described functionality.
3. Build abstract test cases (containing at least preconditions, test steps and expected results) around the classes identified in step 2
4. Build concrete test cases (fill the abstract test cases with "real" data for input and expected results)