Functional vs non-functional testing
Both types of testing are a vital part of a complete testing protocol. While it is functional testing that determines the efficacy of an application, it is non-functional testing that determines, for the most part, user experience. Nevertheless, these two types of testing do overlap.
In fact, there isn't really an absolute dividing line. Nonfunctional testing checks things like recoverability after a crash, maintainability and operational readiness. But, when you get into things like reliability and dependability, it can become a matter of function. Functional testing does enter into areas like dependability. For example cross-platform runtime systems can greatly affect the functionality of an application when poor coding causes unreliable interface leading to erratic function or even unworkability. Of course, this can affect the execution of test cases as well as usability testing, but it comes down to a matter of function. Interface testing is a type of functional testing.
Nonfunctional testing is important because software doesn't exist in isolation. It must interact with the environment in which it operates and the more it relies on outside resources, the greater the possibility that there will be a glitch somewhere.
Functional testing provides assurance that the application itself can perform as intended. It can be something as simple as a smoke test, just run the application and see what happens. There is sanity testing, a rather colourful name which means testing the application to see if it is “sane” after defects have been fixed. In other words, it is testing to make sure that no unanticipated problems have been caused by the changes.
All in all, functional and non-functional testing are two sides of the same testing coin. Their purposes may be different in detail, but they exist to ensure the highest quality product possible.