Acceptance Testing
What it is
Section titled “What it is”Acceptance testing checks whether a system satisfies the business requirements and is fit to release. Where other tests ask “does it work?”, acceptance tests ask “does it do what the customer actually needs, and would they accept it?”. The best-known form is User Acceptance Testing (UAT), performed by or on behalf of end users.
requirements ──► acceptance criteria ──► acceptance tests ──► accept / reject │ │ └ written by the business └ run against a release candidateAcceptance testing comes in several flavours: UAT (users sign off), business acceptance (business rules), contract/regulatory acceptance (compliance) and operational acceptance (runbooks, backups, monitoring). It is usually the last gate before release and is driven by criteria agreed up front, not by code.
Robot Framework is a natural fit here: its keyword-driven, plain-language syntax lets
business stakeholders read and even author the acceptance criteria using keywords like
Given/When/Then, while testers extend them with deeper checks.
When to use it / when to avoid it
Section titled “When to use it / when to avoid it”Use it for
- Sign-off before a release, milestone or contractual delivery
- Validating that delivered behaviour matches the agreed acceptance criteria
- Business-rule and regulatory/compliance verification
- Confirming operational readiness (monitoring, rollback, backups)
Avoid it when
- You want fast feedback during development → push checks down to unit and integration tests
- There are no written acceptance criteria yet — write those first, with the business
- You are trying to use UAT to find basic defects; those should never reach the user stage
Frameworks & tools
Section titled “Frameworks & tools”| Tool | Ecosystem | Notes |
|---|---|---|
| Robot Framework | Python | Keyword-driven acceptance; readable by non-programmers, rich library ecosystem |
| Cucumber | Multi | Gherkin Given/When/Then; BDD-style acceptance |
| SpecFlow / Reqnroll | .NET | Gherkin on .NET |
| Behave | Python | Gherkin + Python step definitions |
| FitNesse | Java/JVM | Wiki-based acceptance tables |
| Gauge | Multi | Markdown specs, plugin-based |
| Playwright / Cypress | Multi | Automate the UAT journeys once criteria are stable |
| TestRail / Xray / Zephyr | Multi | Track manual UAT sessions and sign-off |
| Robot Framework Browser | Python | Modern Playwright-backed library for RF |
Quick setup
Section titled “Quick setup”pip install robotframeworkpip install robotframework-browser # optional: real browserrfbrowser initrobot --outputdir results tests/*** Settings ***Documentation Acceptance tests for the checkout flownpm install -D @cucumber/cucumbernpx cucumber-jspip install behavebehave features/go install github.com/cucumber/godog/cmd/godog@latestgodog run<!-- Maven: Cucumber JVM --><dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>7.20.0</version> <scope>test</scope></dependency>dotnet add package Reqnrolldotnet testExample
Section titled “Example”*** Settings ***Documentation Acceptance: a registered user can complete checkoutLibrary Browser
*** Variables ***${BASE_URL} https://staging.example.com
*** Test Cases ***Registered User Completes Checkout [Documentation] AC-14: a signed-in user pays and sees confirmation New Browser chromium headless=true New Page ${BASE_URL}/login Fill Text id=email ada@example.com Fill Text id=password s3cret Click text=Sign in Click text=Add to cart Click text=Checkout Click text=Pay now Wait For Elements State text=Order confirmed visible [Teardown] Close Browser// Feature: Checkout// Scenario: Registered user completes checkout// Given a signed-in user// When they pay for their cart// Then they see an order confirmation
import { Given, When, Then } from '@cucumber/cucumber';
Given('a signed-in user', async function () { await this.signIn('ada@example.com', 's3cret');});When('they pay for their cart', async function () { await this.pay();});Then('they see an order confirmation', async function () { await this.expectText('Order confirmed');});from behave import given, when, then
@given("a signed-in user")def step_sign_in(context): context.page.sign_in("ada@example.com", "s3cret")
@when("they pay for their cart")def step_pay(context): context.page.pay()
@then("they see an order confirmation")def step_confirm(context): assert context.page.text("Order confirmed")func aSignedInUser(ctx context.Context) (context.Context, error) { return ctx, signIn("ada@example.com", "s3cret")}
func theyPayForTheirCart(ctx context.Context) (context.Context, error) { return ctx, pay()}
func theySeeAnOrderConfirmation(ctx context.Context) (context.Context, error) { return ctx, expectText("Order confirmed")}import io.cucumber.java.en.*;
public class CheckoutSteps { @Given("a signed-in user") public void aSignedInUser() { page.signIn("ada@example.com", "s3cret"); }
@When("they pay for their cart") public void theyPay() { page.pay(); }
@Then("they see an order confirmation") public void theySeeConfirmation() { page.expectText("Order confirmed"); }}using Reqnroll;
[Binding]public class CheckoutSteps{ [Given("a signed-in user")] public void GivenASignedInUser() => Page.SignIn("ada@example.com", "s3cret");
[When("they pay for their cart")] public void WhenTheyPay() => Page.Pay();
[Then("they see an order confirmation")] public void ThenTheySeeConfirmation() => Page.ExpectText("Order confirmed");}Anti-patterns & best practices
Section titled “Anti-patterns & best practices”- Agree acceptance criteria first. Tests are derived from criteria the business signed off on, not invented after coding.
- Keep scenarios business-readable. Robot Framework keywords and Gherkin should describe outcomes in the user’s language, not UI mechanics.
- One scenario, one rule. Each acceptance test should trace to a single requirement (e.g.
AC-14). - Automate the stable paths. Once criteria settle, move them into an automated Robot Framework or Cucumber suite; keep humans for judgement calls.
- Never let UAT be the first place a defect is seen. Cheap defects belong to unit and integration tests.
- Record the sign-off. Acceptance is a decision — capture who accepted and against which criteria.
Self-assessment quiz
Section titled “Self-assessment quiz”Self-assessment quiz
Pick one answer per question, then press Check answers.