Verification and validation are not the same thing, although they are often confused.
Boehm succinctly expressed the difference as: • Verification: Are we building the product right? • Validation: Are we building the right product? "Building the product right" checks that the
specifications are correctly implemented by the system while "building the right product" refers back to the ''user's needs''. In some contexts, it is required to have written requirements for both as well as formal procedures or protocols for determining compliance. Ideally,
formal methods provide a mathematical guarantee that software meets its specifications. Building the product right implies the use of the Requirements Specification as input for the next phase of the development process, the design process, the output of which is the Design Specification. Then, it also implies the use of the Design Specification to feed the construction process. Every time the output of a process correctly implements its input specification, the software product is one step closer to final verification. If the output of a process is incorrect, the developers have not correctly implemented some component of that process. This kind of verification is called "artifact or specification verification".
Software verification It would imply to verify if the specifications are met by running the software but this is not possible (e.g., how can anyone know if the architecture/design/etc. are correctly implemented by running the software?). Only by reviewing its associated artifacts, can someone conclude whether or not the specifications are met.
Artifact or specification verification The output of each software development process stage can also be subject to verification when checked against its input specification (see the definition by CMMI below). Examples of artifact verification: • Of the design specification against the requirement specification: Do the architectural design, detailed design and database logical model specifications correctly implement the functional and non-functional requirements specifications? • Of the construction artifacts against the design specification: Do the source code, user interfaces and database physical model correctly implement the design specification?
Software validation Software validation checks that the software product satisfies or fits the intended use (high-level checking), i.e., the software meets the user requirements, not as specification artifacts or as needs of those who will operate the software only; but, as the needs of all the stakeholders (such as users, operators, administrators, managers, investors, etc.). There are two ways to perform software validation: internal and external. During internal software validation, it is assumed that the goals of the stakeholders were correctly understood and that they were expressed in the requirement artifacts precisely and comprehensively. If the software meets the requirement specification, it has been internally validated. External validation happens when it is performed by asking the stakeholders if the software meets their needs. Different software development methodologies call for different levels of user and stakeholder involvement and feedback; so, external validation can be a discrete or a continuous event. Successful final external validation occurs when all the stakeholders accept the software product and express that it satisfies their needs. Such final external validation requires the use of an
acceptance test which is a
dynamic test. However, it is also possible to perform internal static tests to find out if the software meets the requirements specification but that falls into the scope of static verification because the software is not running.
Artifact or specification validation Requirements should be validated before the software product as a whole is ready (the waterfall development process requires them to be perfectly defined before design starts; but iterative development processes do not require this to be so and allow their continual improvement). Examples of artifact validation: • User Requirements Specification validation: User requirements as stated in a document called User Requirements Specification are validated by checking if they indeed represent the will and goals of the stakeholders. This can be done by interviewing the stakeholders and asking them directly (static testing) or even by releasing prototypes and having the users and stakeholders to assess them (dynamic testing). • User input validation: User input (gathered by any peripheral such as a keyboard, bio-metric sensor, etc.) is
validated by checking if the input provided by the software operators or users meets the domain rules and constraints (such as data type, range, and format).
Validation vs. verification According to the
Capability Maturity Model (CMMI-SW v1.1), • Software Validation: The process of evaluating software during or at the end of the development process to determine whether it satisfies specified requirements. [IEEE-STD-610] • Software Verification: The process of evaluating software to determine whether the products of a given development phase satisfy the conditions imposed at the start of that phase. [IEEE-STD-610] Validation during the software development process can be seen as a form of User Requirements Specification validation; and, that at the end of the development process is equivalent to Internal and/or External Software validation. Verification, from CMMI's point of view, is evidently of the artifact kind. In other words, software verification ensures that the output of each phase of the software development process effectively carries out what its corresponding input artifact specifies (requirement -> design -> software product), while software validation ensures that the software product meets the needs of all the stakeholders (therefore, the requirement specification was correctly and accurately expressed in the first place). Software verification ensures that "you built it right" and confirms that the product, as provided, fulfills the plans of the developers. Software validation ensures that "you built the right thing" and confirms that the product, as provided, fulfills the intended use and goals of the stakeholders. This article has used the strict or
narrow definition of verification. From a testing perspective: • Fault – wrong or missing function in the code. • Failure – the manifestation of a fault during execution. The software was not effective. It does not do "what" it is supposed to do. • Malfunction – according to its specification, the system does not meet its specified functionality. The software used excessive resources (too much time or CPU cycles, too much memory, too many I/O operations, etc.); it had side effects (heat/voltage/vibration risks to systems, heat/current/force risks to users; it was not usable, not reliable, etc. It does not do something "how" it is supposed to do it. ==Related concepts==