What is a non-functional requirement (NFR)?
A non-functional requirement is some requirement that represents a constraint on the system being defined. This is in contrast to a functional requirement, which describes how something is intended to be used to achieve a goal of value to the user (as described by use cases). The usual glib statement is that functional requirements describe capabilities, and non-functional requirements describe constraints.
Typical types of non-functional requirement relate to topics such as: performance; throughput; latency; resolution; accuracy; security. For more formal discussion of what constitutes a non-functional requirement, see the description on Wikipedia.
An example of an NFR for our vending machine might be: "The vending machine shall be able to deliver an item to the purchaser within 6 seconds of the right money having been inserted in the machine".
Capturing non-functional requirements
Non-functional requirements are usually captured as a simple list of the qualities the system 'shall' exhibit. Often they will be grouped by category to make them easier to navigate. So for example the security NFRs might be grouped together in one place, with the performance and throughput NFRs grouped in another.
Associating non-functional requirements with functional requirements
The functional requirements are the realisation of the system. Hence when building the code that implements the use cases, the developers need to take account of the non-functional requirements as part of their implementation. Hence it is useful to build a cross-correlation between the individual use cases and the NFRs that apply to them.
The Use Case Editor makes this cross correlation possible, by allowing you to select which non-functional requirements need to be tested for each use case that is implemented in the system.