principle of software testing explained