Topic hub

Testing and Quality Assurance

Testing business software means checking that the system does what your operations require, handles errors sensibly, and protects your data. It is not a single activity that happens at the end of a project. Effective testing runs alongside development from the…

Reviewed 22 July 20263 direct guides and sections

Use this hub to

  • Understand the decision before choosing technology
  • Find related cost, risk and ownership guidance
  • Move from planning to acceptance and operation

How to Test Business Software

Testing business software means checking that the system does what your operations require, handles errors sensibly, and protects your data. It is not a single activity that happens at the end of a project. Effective testing runs alongside development from the earliest usable builds.

A practical testing approach starts with the processes the system must support. For each process, identify the normal path, the most likely variations, and the edge cases that could cause problems. A CRM, for example, might handle a straightforward lead conversion perfectly but fail when a lead is merged with an existing contact who already has open opportunities. Those are the situations that cause real operational disruption.

Testing should cover several categories:

  • Functional testing — does each feature behave as specified?
  • Data testing are records saved correctly, duplicated, or lost during specific actions?
  • Permission testing can a user in one role see or edit data belonging to another role?
  • Integration testing do connections to other systems — accounting software, email providers, payment gateways — pass data accurately in both directions?
  • Error handling when something goes wrong, does the system show a useful message rather than a technical error or a blank screen?

The common mistake is treating testing as a task for the development team alone. Developers test their own work, but they test against their understanding of the requirements. Business users test against how work actually happens. Both perspectives are necessary, and they catch different classes of problems.

What Is User Acceptance Testing?

User acceptance testing (UAT) is the stage where people who will actually use the system — or their direct representatives — work through real tasks to confirm the software is fit for purpose. It is not about finding every minor defect. It is about deciding whether the system, as delivered, can support the business process it was built to serve.

UAT happens after the development team has completed their own testing and considers the build ready for review. The business side then takes ownership of the testing environment for a defined period and works through pre-agreed scenarios using realistic data.

There is an important distinction between a defect and a disagreement. A defect is when the system does not behave as the agreed specification describes. A disagreement is when the system works as specified but the person testing it would prefer different behaviour. Both are worth discussing, but they have different implications for timelines and contracts. Raising a preference as a critical defect creates confusion about whether the project is actually complete.

For UAT to work well, the people performing it need three things: clear scenarios to follow, a stable testing environment, and the authority to make a genuine accept-or-reject decision. If the testers are expected to sign off but have no real power to delay delivery, UAT becomes a formality rather than a control.

How to Write Acceptance Criteria

Acceptance criteria are the conditions a feature must satisfy for you to consider it complete. They sit alongside the broader specification and translate each requirement into something testable. Vague criteria lead to disputes; precise criteria lead to clarity.

Each piece of functionality should have criteria written before development begins. A useful format follows a given-when-then structure:

  • Given the starting context — the user's role, the data state, the prior action.
  • When the specific action being tested.
  • Then the observable result that confirms correct behaviour.

For example: "Given a sales manager is logged in and viewing an open opportunity, when they change the stage to 'Closed Won', then the system records the close date as today, updates the pipeline value, and sends a notification to the finance team." This is specific enough that a tester can confirm it or identify exactly where it fails.

Good acceptance criteria also cover what should not happen. If a junior staff member should not be able to approve payments above a certain threshold, write that explicitly. Negative criteria prevent the common situation where a feature works correctly in the happy path but allows dangerous actions in edge cases.

A practical check: hand your acceptance criteria to someone who was not involved in writing them. If they can test the feature without asking clarifying questions, the criteria are sufficiently precise.

Testing Environments: Staging vs Production

A staging environment is a copy of the production system — same server configuration, same database structure, same integrations — where new features and changes are tested before they reach live users. Production is the live system your business depends on.

The purpose of staging is to replicate production closely enough that problems appearing in staging would also appear in production, and conversely, that a clean test in staging gives reasonable confidence the deployment will go smoothly. In practice, staging is never a perfect mirror. Data volumes differ, third-party systems may behave differently in test modes, and the timing of real user traffic cannot be simulated exactly. Staging reduces risk; it does not eliminate it.

Several problems recur with testing environments:

  • Stale data — if the staging database has not been refreshed from production recently, tests may pass on old data structures that no longer match live.
  • Shared environments — if multiple features or team members use the same staging instance, one person's test data can interfere with another's, creating false failures.
  • Configuration drift — over time, staging and production receive different updates, security patches, or setting changes, reducing the reliability of staging as a predictor.
  • Missing integrations — connecting staging to live payment gateways or email services requires care. Using sandbox versions is standard, but sandbox behaviour does not always match production exactly.

Before each release cycle, confirm that staging has been refreshed, that integrations are functioning in their test modes, and that the deployment process from staging to production is documented and repeatable.

Regression Testing for Ongoing Development

Regression testing is the practice of re-testing existing functionality after a change to confirm that nothing that previously worked has broken. In a system that evolves over months or years, regression testing becomes one of the most important safeguards against gradual quality decline.

Every new feature, bug fix, or configuration change carries a risk of unintended side effects. A change to how customer records are saved might break the reporting module that depends on that data structure. An update to a third-party API might cause an integration that worked for years to start failing silently. Without regression testing, these problems surface in production.

The practical challenge is scope. You cannot re-test the entire system after every change. The solution is to maintain a regression suite — a defined set of tests covering the system's most critical paths — and run it as part of every release cycle. Critical paths are the processes that, if broken, would immediately halt operations or cause data loss: login, permission enforcement, core data creation, payment processing, and essential integrations.

As the system grows, manual regression testing becomes time-consuming. This is where automated tests become valuable, not because automation is inherently better, but because it makes a comprehensive regression suite feasible within the time available for each release.

Performance Testing for Web Applications

Performance testing checks how the system behaves under load — response times, throughput, and stability when multiple users are active simultaneously. A system that works perfectly for a single tester can become unusable under real operational load.

There are several related activities often grouped under performance testing:

  • Load testing — simulating the expected number of concurrent users to confirm the system responds within acceptable timeframes.
  • Stress testing — pushing beyond expected load to find the point at which the system degrades or fails.
  • Soak testing — running the system under normal load for an extended period to identify memory leaks, database growth issues, or connection pool exhaustion.

For internal business systems, performance requirements are often less demanding than for public-facing SaaS products, but they still matter. A CRM that takes fifteen seconds to load a customer record when ten staff are using it will not be adopted regardless of its feature set.

Performance testing should use realistic data volumes. A database with a hundred test records behaves very differently from one with a hundred thousand real records. If your system will hold years of transaction history, test against that scale, not against an empty database.

Results should be expressed in concrete terms: "The customer search returns results in under two seconds with fifty concurrent users and a database of 200,000 records." Vague statements like "the system is fast" provide no basis for comparison or future regression testing.

How to Manage Bug Reports and Fix Requests

A structured approach to bug reports prevents the testing phase from descending into chaos. Every issue should be recorded in a single tracking system — not spread across emails, chat messages, and verbal conversations — with enough detail for a developer to understand and reproduce the problem.

A useful bug report includes:

  • The specific steps to reproduce the issue.
  • The expected result versus the actual result.
  • The user role, data state, and environment (staging or production).
  • Screenshots or screen recordings where the visual behaviour is relevant.
  • The severity and priority, agreed in advance.

Severity and priority are often confused. Severity describes how badly the system is broken — a data loss bug is high severity even if it only affects a rarely used feature. Priority describes how urgently it should be fixed — that same bug might be low priority if the feature is not yet in production. Agreeing on these definitions before testing begins prevents arguments during the fix triage process.

Not everything raised during testing is a bug. Some items are genuine defects, some are clarification requests about how the system is supposed to work, and some are enhancement suggestions. Categorising them correctly matters because each category has a different process. Mixing them together inflates the defect count and makes it harder to assess genuine quality.

For each release, agree a threshold: what severity of issues must be resolved before the system can go live, and what can be deferred to a subsequent release. This should be established before testing starts, not negotiated under pressure at the end.

Automated vs Manual Testing: What Business Owners Should Know

Automated testing uses scripts to perform checks that a human would otherwise do manually. Manual testing relies on people working through the system and observing the results. Both have strengths, and the right balance depends on the system's complexity, release frequency, and the resources available.

Automated testing excels at repetitive, predictable checks: confirming that a form submits correctly, that an API returns the expected data structure, or that a user with restricted permissions cannot access an admin panel. These are the kinds of tests that make up a regression suite, and automating them means they can run quickly and consistently with every code change.

Manual testing excels at exploratory work, usability assessment, and scenarios that are difficult to script: "Does this workflow feel logical?", "Is the error message in this situation actually helpful?", "What happens if I perform these three actions in an unexpected order?" Automated scripts check what you anticipated; human testers find what you did not.

The common misconception is that automation replaces manual testing. In practice, automation extends the regression suite beyond what manual effort could cover, freeing human testers to focus on the areas where judgement and exploration matter most. A system tested only by automation will have excellent coverage of known scenarios but poor coverage of the unexpected ones that cause real problems.

Automation also has a maintenance cost. When the system changes, the automated tests must be updated to match. If the test suite is not maintained, it produces false failures that the team learns to ignore, at which point it has negative value. Factor test maintenance into your ongoing support planning.

How to Plan a Testing Phase for a Web Application

Planning a testing phase means deciding who tests what, in what order, with what data, and against what criteria — before the testing period begins. Treating testing as an ad-hoc activity leads to inconsistent coverage, disputed results, and delayed releases.

Start by defining the testing stages in sequence:

  1. Developer testing — the build team verifies their own work against the acceptance criteria before handing it over.
  2. Integration testing — connections between the system and external services are verified with realistic data.
  3. System testing — the full application is tested as a whole, including permissions, error handling, and data integrity.
  4. User acceptance testing — business users work through real scenarios and make a go or no-go decision.

For each stage, define the entry criteria (what must be true before testing starts), the exit criteria (what must be true before testing is considered complete), and the duration. Without these boundaries, testing either ends too early — leaving critical issues undiscovered — or drags on indefinitely as new concerns are raised.

Prepare test data in advance. Using production data in a staging environment creates privacy and security risks and requires a justified, controlled basis. Fabricated data that does not reflect real complexity can create false confidence. A common approach is to create an anonymised or synthetic dataset that mirrors the structure and difficult cases of live data without exposing unnecessary personal information. The legal basis for this depends on your data and circumstances, so seek current specialist advice.

Finally, schedule a buffer. Testing almost always takes longer than expected, not because testers are slow, but because the process of reproducing, documenting, and triaging issues consumes time that is rarely accounted for in initial estimates.

Accessibility Testing for Business Applications

Accessibility testing checks whether people with disabilities can use the system effectively. Legal duties depend on the organisation and service. UK public-sector websites and mobile applications are subject to the Public Sector Bodies Accessibility Regulations, while the Equality Act 2010 can require reasonable adjustments in wider service and employment contexts. Internal systems also create direct operational and workforce risks when disabled staff cannot complete essential tasks.

An internal system that is inaccessible excludes staff members who need it to do their jobs. That creates workarounds — colleagues entering data on someone's behalf, printed reports instead of screen access, or simply not using the system at all. Each workaround introduces delay, errors, or resentment.

Practical accessibility testing covers several areas:

  • Keyboard navigation — can every interactive element be reached and operated without a mouse?
  • Screen reader compatibility — do headings, labels, and error messages make sense when read aloud?
  • Colour contrast — is text readable for people with low vision or colour perception differences?
  • Form labels and errors — are input fields clearly labelled, and are error messages specific enough to correct the problem?
  • Focus management — after an action like submitting a form or opening a modal, does the screen reader's focus move to the right place?

Automated accessibility tools can catch a proportion of issues — missing alt text, insufficient contrast, empty headings — but they miss many problems that only manual testing with a screen reader or keyboard reveals. Relying solely on automated tools gives a false sense of compliance.

Keep the result reproducible

The Web Content Accessibility Guidelines (WCAG) provide a detailed standard, and WCAG 2.2 Level AA is the current UK government baseline for public-sector websites and mobile applications. However, compliance is not a one-time check. Every new feature, redesign, or content update can introduce accessibility barriers. Building accessibility checks into your standard testing process is more reliable than treating it as a separate audit.