Critical thinking in software testing