World’s largest virtual agentic engineering & quality conference
Acceptance testing validates software against business requirements before release. Learn the types, acceptance criteria, entry and exit gates, and examples.

Harshit Paul
Author

Shahzeb Hoda
Reviewer
Published on: November 29, 2025
Last Updated on: August 10, 2026
OVERVIEW
Software can pass every unit and integration test and still be wrong.
In the Stack Overflow Developer Survey 2025, the biggest single frustration, cited by 66% of developers, is dealing with AI solutions that are "almost right, but not quite". The same survey reports that more developers distrust the accuracy of AI tools (46%) than trust it (33%).
Acceptance testing is the stage built to catch that gap, because it judges a build against business requirements instead of against technical specifications.
It sits at the end of the Software Development Life Cycle, after system testing and before release. The people running it work from requirements rather than from the code, which is why acceptance testing is treated as a form of black box testing. What it produces is a go or no-go decision, not a defect count.
Key Takeaways
Acceptance testing is the final test level, where software is validated against business requirements and user needs instead of technical specifications. Business stakeholders and end users run it after system testing to decide whether a release is fit to ship, which makes it a formal go or no-go gate rather than another defect hunt.
What Are the Types of Acceptance Testing?
How Do You Write an Acceptance Test?
Express each acceptance criterion as an observable outcome, usually in Given/When/Then form, then write one test per criterion that asserts on business-visible state. Teams that keep criteria, test cases, and sign-off evidence in one workspace, as TestMu AI's Test Manager does, can show which requirements have linked tests and which have none before the release meeting starts.
Acceptance testing is a formal process that checks whether a system meets user needs, business requirements, and agreed acceptance criteria, so that customers and users can decide whether to accept it. It is the last test level before release, and unlike earlier levels it is judged by the people who asked for the software rather than by the people who built it.
That difference in who judges is the whole point. System testing asks whether the product matches its specification. Acceptance testing asks whether the specification was right. A build can satisfy every written requirement and still be rejected because the requirement did not describe the work the user actually does.

Each level below acceptance testing is run by the team that built the software, against a document that team also worked from. Acceptance testing is the first point where someone outside that loop checks the result, which is why it is the last gate rather than simply another layer.
Acceptance tests are typically run twice: once when system testing exits, and once against a release candidate in an environment that mirrors production. The team running them includes end users and business stakeholders, with QA facilitating, and often business analysts, support staff, or a contract owner depending on which type of acceptance test is in play. Because the tests exercise functional testing behaviour through the interface rather than the internals, no knowledge of the implementation is required.
Defects that survive earlier test levels are the expensive ones, because they are defects of intent rather than of code.
Capgemini's World Quality Report 2025-26 states that although 94% of organizations review production data, nearly half struggle to turn insights into actionable strategies for quality enhancement.
So the quality signal often arrives only after real users have hit the problem, which is the position acceptance testing exists to avoid.
Concretely, acceptance testing earns its place by doing these things:
There are seven recognised types. Most releases need two or three of them, and picking the wrong one is how teams end up running a second regression cycle and calling it acceptance.
UAT puts representative end users in front of the build and asks them to complete real tasks against the agreed criteria. It answers whether the software supports the job the user actually does, which is a different question from whether each feature works. For the full process, participant selection, and UAT-specific exit criteria, see the guide to user acceptance testing.
BAT checks the release against business objectives rather than against user stories. A build can pass UAT and fail BAT: every screen behaves correctly, yet the workflow does not produce the commercial outcome the project was funded to deliver. Running it well needs someone who understands the domain and the revenue model, not just the specification.
CAT validates delivered software against criteria written into a contract or a service level agreement, which typically fixes the testing window, the scope, and what counts as a defect after handover. Because payment or milestone acceptance often depends on the result, the evidence has to be dated and traceable rather than anecdotal.
RAT confirms the software complies with the laws and standards of every market it ships into, which vary by country. A payment page, for example, is checked against Payment Card Industry Data Security Standard requirements covering access control, storage of cardholder data, and encryption in transit. A release that passes everywhere else can still be blocked here.
OAT is a form of non-functional testing that asks whether the system can be operated, not whether it is correct: backup and restore, failover, monitoring, recoverability, and maintainability. It is usually owned by operations rather than QA. The detail lives in the guide to operational testing.
Alpha testing happens inside the organisation, in a development or test environment, with the build team close enough to reproduce and fix issues quickly. It targets overall performance, functionality, and usability under controlled conditions. Phases, entry gates, and tooling are covered in the alpha testing guide.
Beta testing releases the build to external users on their own hardware, networks, and configurations. Its value is exactly what a controlled environment cannot give you: the combinations nobody thought to provision. See the beta testing guide for recruitment, lifecycle, and how to triage field feedback.
Rather than choosing by definition, choose by what changed in the release:
| What changed in this release | Acceptance test type | Who signs off | Evidence needed to exit |
|---|---|---|---|
| A user-facing journey such as checkout, onboarding, or search | UAT | Product owner and representative end users | Every in-scope acceptance criterion passing on the target browsers and devices |
| A new revenue or business workflow | BAT | Business stakeholder or process owner | The business outcome demonstrated end to end, not just the screens |
| A supplier deliverable or SLA milestone | CAT | Contract owner | Each contractual criterion evidenced, dated, and traceable to a test run |
| Payments, personal data, or accessibility behaviour | RAT | Compliance or legal owner | The applicable standard verified separately for each target market |
| Infrastructure, backup, failover, or a runbook | OAT | Operations or site reliability | Recovery, monitoring, and maintainability checks passing in a production-like environment |
| A build going to an internal audience first | Alpha testing | QA and development | Controlled-environment defects triaged, fixed, and retested |
| A build going to external users before general availability | Beta testing | Product management | Field feedback triaged and every release blocker closed |
Acceptance criteria are the conditions a build must satisfy to be accepted. They are agreed before development starts, not written afterwards to match what was built, and each one has to be observable: if two people can disagree about whether a criterion passed, it is not a criterion yet.
Two formats cover most cases. Given/When/Then describes one scenario as a precondition, an action, and an expected outcome, which suits anything with a workflow. A rule-based list states conditions the feature must always meet, which suits constraints such as field validation or supported configurations. Criteria and the tests that prove them are related but distinct artifacts, a distinction worth reading up on in acceptance criteria vs acceptance tests, with worked samples in these acceptance criteria examples.
Whichever format you use, the criteria for a release usually span these categories:
Entry and exit criteria keep the acceptance phase from starting too early or ending by exhaustion. They act as the gates on either side of the phase:

Start only when all of the following are true:
Exit when the evidence supports a decision, not when the calendar runs out:
The hard part is usually evidence rather than execution. TestMu AI's Test Manager is built around that gap: it converts user stories and Gherkin scenarios into structured test cases, links each case back to the requirement it proves, and produces a requirements coverage report showing which requirements have linked tests and which have none.
Defects sync two-way with Jira or Azure DevOps carrying steps, expected versus actual, and environment, and reports export for stakeholder review and release sign-off. So the release meeting opens with coverage numbers instead of opinions.
The docs on test run creation and management walk through setting up a cycle. If you need a ready-made structure for recording results, use the user acceptance testing template.
The sequence below is deliberately front-loaded. Most acceptance phases that go badly go badly in step one.

Take a single user story from a storefront backlog: as a returning shopper, I want to search the catalogue so that I can find a product without browsing categories. On its own that sentence is not testable. Turning it into acceptance criteria means naming the precondition, the action, and the outcome you can observe.
Written as a Gherkin feature file, the criteria for that story look like this:
Feature: Catalogue search
Scenario: A shopper finds a product that exists in the catalogue
Given the shopper is on the storefront home page
When they search for "iPhone"
Then at least one product result is shown
And the first result title contains "iPhone"
Scenario: A shopper searches for a product that does not exist
Given the shopper is on the storefront home page
When they search for "zzzznotaproduct"
Then no product results are shown
And a message explaining that nothing matched is displayedThree things make this an acceptance test rather than a functional test that happens to use Gherkin. It is written in the language of the business, so a product owner can approve it without reading code. It asserts on what the shopper sees, not on which API returned what. And the second scenario exists because "search works" is not a requirement anyone can sign, whereas "a search that matches nothing tells the shopper so" is.
A failure here is also read differently. If the first scenario fails, that is a defect. If the product owner reads the second scenario and says the message should also suggest alternatives, that is a missing requirement discovered at the only stage designed to catch it.
Note: Run acceptance suites across 3,000+ browser and OS combinations, and validate mobile releases on 10,000+ real Android and iOS devices. Try TestMu AI for free!
Acceptance testing does not become automated testing, but the stable part of it should be. Once criteria are agreed and stop changing every sprint, they make an unusually good regression gate, because they are the assertions the business actually cares about. Deciding what belongs on each side of that line matters more than which framework runs it.
A workable split: automate criteria that are deterministic, repeat every release, and have an unambiguous pass condition. Keep exploratory judgement, usability opinion, first-time workflow validation, and contractual sign-off manual, because those need a person to render the verdict. Writing the criteria before the code, so they drive development rather than describe it, is the practice known as acceptance test driven development.
Each Gherkin step maps to a step definition. Using Cucumber with Playwright, the feature file above becomes:
// features/step_definitions/search.steps.js
const { Given, When, Then } = require('@cucumber/cucumber');
const { expect } = require('@playwright/test');
// The storefront renders more than one search box (desktop and mobile headers),
// so scope to the first or Playwright strict mode fails the step.
const searchBox = (page) => page.locator('input[name="search"]').first();
Given('the shopper is on the storefront home page', async function () {
await this.page.goto('https://ecommerce-playground.lambdatest.io/');
});
When('they search for {string}', async function (term) {
await searchBox(this.page).fill(term);
await searchBox(this.page).press('Enter');
await this.page.waitForLoadState('domcontentloaded');
});
Then('at least one product result is shown', async function () {
await this.page.waitForSelector('.product-thumb');
expect(await this.page.locator('.product-thumb').count()).toBeGreaterThan(0);
});
Then('the first result title contains {string}', async function (term) {
const title = await this.page.locator('.product-thumb .title a').first().innerText();
expect(title.toLowerCase()).toContain(term.toLowerCase());
});
Then('no product results are shown', async function () {
await this.page.waitForSelector('.content-products');
expect(await this.page.locator('.product-thumb').count()).toBe(0);
});
Then('a message explaining that nothing matched is displayed', async function () {
const results = await this.page.locator('.content-products').innerText();
expect(results).toContain('There is no product that matches the search criteria.');
});Note what the assertions check: the count of results a shopper can see and the text of the first one. An assertion on an internal search endpoint would pass while the results list rendered empty, which is exactly the class of defect acceptance testing exists to stop.
Compatibility criteria are the reason this suite belongs on a grid rather than a laptop. The step definitions above never mention a browser, so moving them to the cloud is a change to the hooks alone. A Before hook connects to the grid and hands each scenario a page:
// features/support/hooks.js
const { Before, After, setDefaultTimeout } = require('@cucumber/cucumber');
const { chromium } = require('playwright');
setDefaultTimeout(60 * 1000);
const capabilities = {
browserName: 'Chrome',
browserVersion: 'latest',
'LT:Options': {
platform: 'Windows 10',
build: 'Acceptance Suite',
name: 'Catalogue search acceptance criteria',
user: process.env.LT_USERNAME,
accessKey: process.env.LT_ACCESS_KEY,
network: true,
video: true,
console: true
}
};
Before(async function () {
this.browser = await chromium.connect({
wsEndpoint:
'wss://cdp.lambdatest.com/playwright?capabilities=' +
encodeURIComponent(JSON.stringify(capabilities))
});
this.page = await this.browser.newPage();
});
After(async function () {
await this.page.close();
await this.browser.close();
});TestMu AI's Automation Cloud runs existing Selenium, Cypress, Playwright, and Puppeteer suites across 3,000+ real browser and OS combinations in parallel. Every session captures network logs, console logs, video, and a command-by-command replay, which is the evidence an acceptance result needs to be auditable.

That record is what turns a green tick into something a stakeholder can audit later: the command that failed, the network call behind it, and the video of what the user would have seen.
One caveat worth respecting for acceptance work specifically: leave auto-healing off. It is heuristic, so on a strict acceptance suite it can heal onto a similar-but-wrong element and let a genuine regression through. Prefer stable selectors, and see automating acceptance tests for mobile apps for the mobile equivalent.
Not every acceptance test should be automated, and the manual half has an infrastructure problem of its own: a business analyst signing off a release needs the browser and device the customer actually uses, not the one on their desk.
TestMu AI's real-time testing is built for that walkthrough. A stakeholder opens the exact browser and operating system their users run, drives the flow by hand, and shares the live session so the sign-off conversation happens inside the environment rather than over a screenshot.
When something fails acceptance, one-click bug logging captures and annotates the screen and pushes it to any of 65+ trackers including Jira, Azure DevOps, GitHub Issues, and Linear, with browser, operating system, resolution, and a session recording attached. That attachment is usually the difference between a fixed defect and a "cannot reproduce" reply. Sessions launch straight from a test case, and the manual outcome logs back into the test management cycle.
Mobile and ChromeOS coverage here runs on emulators and simulators. Hardware-dependent criteria such as biometrics or camera behaviour belong on the real device cloud, which offers 10,000+ real Android and iOS devices.
Start by picking the exact device and operating system version your acceptance criteria name, rather than whatever hardware the reviewer happens to own:

The session then runs on real hardware, with device logs, screenshots, developer tools, and geolocation testing on hand for criteria that are locale-specific:

This walkthrough covers getting started with real-time testing on real devices:
Subscribe to the TestMu AI YouTube channel for tutorials on Selenium testing, Playwright, and CI/CD.
Tool choice follows the criteria, not the other way round. Four open-source options cover most of what acceptance suites need:
For a wider comparison, including how commercial platforms handle stakeholder participation and sign-off tracking, see the roundup of UAT testing tools.
Requirements that are not specific enough to test. If the requirement says the report should load quickly, acceptance becomes an argument. Fix it upstream by refusing to accept a criterion that has no observable outcome, and by writing the threshold into the criterion: the report renders within three seconds on the agreed configurations.
Stakeholder time, not tester time, is the constraint. Acceptance depends on people whose day job is not testing, and a phase scheduled without their availability slips or gets rubber-stamped. Book the participants when you book the environment, keep sessions short and scenario-led, and automate the repeat criteria so the human hours go to judgement rather than to regression.
Disagreement over what counts as a defect. Late in a release, the difference between a defect and a change request decides who pays for it. Agreeing that definition in the test plan, and tying each acceptance test to the criterion it proves, turns that conversation into a lookup instead of a negotiation.
Acceptance used as a second regression cycle. When the phase becomes a re-run of system testing, it consumes stakeholder goodwill and finds nothing new. Keep the scope tied to the acceptance criteria for what changed, and let test coverage reporting show that earlier levels already covered the rest.
Start with your next release: take the user stories that changed, write one observable acceptance criterion for each, and use the decision table above to pick which acceptance test type each one needs. That single pass usually exposes two or three requirements that nobody can state precisely, which is the cheapest possible moment to find them.
From there, put the criteria somewhere they can be traced to results rather than in a spreadsheet that ages badly, automate the ones that stop changing, and run the manual walkthrough on the configurations your users actually have. The test case generation docs cover turning user stories and Gherkin scenarios into linked test cases, and KaneAI extracts acceptance criteria from a PRD or ticket into scenarios when you want the product owner authoring them rather than waiting on an automation engineer. If acceptance is a recurring part of your role, the TestMu AI certifications cover the testing foundations underneath it.
Author
Harshit Paul is Director of Product Marketing at TestMu AI (formerly LambdaTest), with over 8 years of experience in product and growth marketing for developer and QA tools, leading the Agentic AI in Quality Engineering space. He has authored 80+ technical articles for TestMu AI on software testing and automation, and hosted webinars on Selenium, automation testing, browser compatibility, DevOps, and continuous testing. He has led go-to-market and technical marketing initiatives across software testing products, contributing to SEO, content strategy, and developer marketing. He began his career as a certified Salesforce developer at Wipro Technologies, where he worked for 2 years before moving into marketing. Harshit holds a degree in computer programming from Vivekananda Institute of Professional Studies.
Reviewer
Shahzeb Hoda is the Associate Director of Marketing and a Community Contributor at TestMu AI, leading strategic initiatives in developer marketing, content, and community growth. With 10+ years of experience in quality engineering, software testing, automation testing, and e-learning, he has authored and reviewed 70+ technical articles on software testing and automation. Shahzeb holds an M.Tech in Computer Science from BIT, Mesra, and is certified in Selenium, Cypress, Playwright, Appium, and KaneAI. He brings deep expertise in CI/CD pipeline automation, cross-browser testing, AI-driven testing practices, and framework documentation. On LinkedIn, he is followed by 3,700+ engineers, developers, DevOps professionals, tech leaders, and enthusiasts.
Did you find this page helpful?
More Related Blogs
TestMu AI forEnterprise
Get access to solutions built on Enterprise
grade security, privacy, & compliance