Functional testing of a system involves tests that evaluate functions that the system should perform. Functional requirements may be described in work products such as business requirements specifications, epics, user stories, use cases, or functional specifications, or they may be undocumented. The functions are “what” the system should do. Tests should perform at all test levels.
Non-functional testing of a system evaluates characteristics of systems and software such as usability, performance efficiency, or security. Non-functional testing is the testing of “how well” the system behaves.
White-box testing derives tests based on the system’s internal structure or implementation. Internal structure may include code, architecture, workflows, and data flows within the system.
When changes are made to a system, either to correct a defect or because of new or changing functionality, should be done testing to confirm that the changes have fixed the defect or implemented the functionality correctly and have not caused any unforeseen adverse consequences.
When applying experience-based test techniques, the test cases are derived from the tester’s skill and intuition and their experience with similar applications and technologies. These techniques can help identify tests that were not easily identified by other more systematic techniques.