Functional tests focus on proving the system exhibits the behavior requested by the customer. A system's functional behavior can be detailed in a series of use cases, as is the practice with a use-case-driven process like the RUP, or as a set of user stories when following an agile method such as XP.
The ability of the system to meet the customer's business requirements is obviously a key concern. The owners of the system use functional tests to assess the application's conformance to their requirements as part of their acceptance tests.
Under XP, the customer works with the development team to generate an automated suite of acceptance tests. Larger projects following the RUP are likely to use a QA team to build test scripts from the system's use cases.
Functional testing is a black-box technique, and for business systems relies on test cases that exercise system functionality via the user interface, although testing of batch functionality is also a concern.
Tools offer several approaches for automating the functional testing of systems via the user interface. One approach uses event capture and replay to rerun recorded keystroke sequences against the GUI. However, this approach is fragile and susceptible to even very small changes in the system's user interface.
Another approach is to take control of the user interface programmatically using a script. This approach is the subject of the next section, which introduces the functional testing tool HttpUnit.