What is the difference between verification and validation?
- Verification: review documents, designs, code — nothing executes. Checks "are we building the product right?"
- Validation: actually running the software — tests, UAT, real use. Checks "are we building the right product?"
- Matching the spec doesn't mean solving the real problem. Validation catches that gap.
The long answer
Verification is entirely static — no code runs. You check documents, designs, requirements, code reviews, pull requests, walkthroughs. The question is: does this match what was specified? Internal check, no customer needed.
Validation is dynamic — code actually executes. Unit tests, integration tests, system tests, UAT — all validation. The question is: does the running software actually solve the user’s real problem? A product can pass every verification check and still fail validation if the requirements themselves were wrong.
UAT (User Acceptance Testing) is the classic validation activity — real stakeholders use the actual product before release to confirm it solves their real need.
Concrete pairing: a peer reviewing your Playwright pull request against the ticket, no browser opens — verification. Your GitHub Actions pipeline then running that suite against a real browser — validation, because it executes. UAT with actual stakeholders clicking through the feature before release — also validation, the highest-stakes version of it.
Mixing up the two phrases. Memory anchor: verification = "building the product **right**" (right = correctly, matches spec). Validation = "building the **right** product" (right = the correct one, solves real need).