Techniques and Strategies for Testing Component-Based Software and Product Lines