Building Blocks for Effective Software Testing