In the end, we want to have a fully featured test suite that describes how the system works. This specification will be the best documentation available for your system, as it will get verified every time a developer commits code to the solution. It will provide a layer of protection indicating that the functionality stays the same throughout the application life cycle.
The main challenge with functional testing will always be to create a test suite that runs fast enough and provides predictable results so we can trust the process. Functional tests are the hardest to write in plenty, and they still make a fast-running and stable test suite. We need to manage this in order to stay sane and keep providing value.