System testing is the testing of a complete, integrated software system against specified functional and non-functional requirements. It evaluates the behaviour of the system as a whole rather than focusing primarily on individual units or isolated component interactions. The system under test is normally assembled in an environment intended to represent, sufficiently for the purpose, the conditions in which the software is expected to operate. System testing can cover complete business workflows, user-facing functionality, error handling, security controls, performance characteristics, compatibility, reliability, data processing, configuration, and other system-level requirements. Its purpose is to determine whether the integrated product behaves as required from a system perspective.
The scope of system testing depends heavily on the product and its requirements. For a web application, system tests might create an account, authenticate a user, perform a transaction, update persistent data, and verify the resulting user-visible behaviour. For a mobile application, they might cover installation, permissions, offline operation, synchronisation, notifications, and interaction with device capabilities. For an embedded system, system testing can involve software interacting with sensors, actuators, communication buses, and physical constraints. The important distinction is that the test considers the complete intended behaviour of the system rather than merely asking whether a particular function or interface operates correctly.
System testing normally occurs after relevant components have been integrated sufficiently for meaningful whole-system execution. It can be performed by development teams, dedicated testers, quality engineers, or specialised validation teams depending on organisational practice. The tests are commonly derived from requirements, specifications, use cases, user stories, acceptance criteria, architectural constraints, and risk assessments. A system-level test may therefore be expressed as a scenario involving a realistic sequence of actions and expected outcomes. Traceability between requirements and tests can be important in environments where organisations must demonstrate that specified requirements have been verified.
Functional system testing examines whether the system performs required operations, while non-functional system testing examines characteristics such as performance, security, usability, scalability, resilience, availability, and compatibility. Performance testing may measure response times and throughput under defined workloads. Security testing can investigate authentication, authorisation, session handling, input validation, and other controls. Compatibility testing may cover browsers, operating systems, devices, databases, or supported protocols. Reliability and resilience testing can examine behaviour after failures, restarts, network interruptions, dependency outages, or resource exhaustion. These activities are distinct in technique but can all be conducted at system level.
System testing is often confused with acceptance testing and end-to-end testing. The terms overlap in many organisations, but they have different conceptual emphases. System testing focuses on whether the complete system satisfies its specified requirements. Acceptance testing generally asks whether the system is acceptable to its intended stakeholders or meets business acceptance criteria, and may be conducted by customers or representatives of users. End-to-end testing focuses on complete workflows across all relevant components and dependencies. A single automated test can satisfy more than one of these descriptions depending on the organisation's terminology and purpose, so the exact distinction should be established within the project's testing strategy.
A system-test environment should provide enough realism to expose defects that depend on integrated configuration, infrastructure, data, and external boundaries. However, complete production duplication is not always practical or necessary. Teams may use dedicated staging environments, representative datasets, service simulators, containers, test accounts, synthetic traffic, and controlled third-party integrations. The environment itself becomes part of the testing problem because differences in configuration can produce behaviour that does not occur in development. Configuration management, infrastructure automation, observability, logging, test data management, and reproducible deployment processes therefore improve the reliability and diagnostic value of system testing.
System testing provides broad coverage but is generally more expensive and slower than unit testing. A failure can involve many possible causes, making diagnosis harder than a narrowly scoped unit failure. Large system tests can also become brittle when user interfaces, timing, data, or external services change. This does not make them unnecessary; rather, they should be designed around important system behaviours and risks rather than attempting to test every internal implementation detail through large workflows. Stable interfaces, clear test data, reliable environments, appropriate test isolation, and useful diagnostics can substantially reduce maintenance costs.
System testing is particularly valuable before significant releases because it provides evidence about the behaviour of the product in an integrated operational context. It complements unit and integration testing rather than replacing them. A layered testing strategy may use many fast unit tests, a smaller number of integration tests, and a still smaller but strategically selected collection of system or end-to-end tests. The resulting structure provides different forms of feedback at different costs. System testing therefore represents an important verification layer between isolated technical correctness and the broader question of whether the assembled product behaves according to its requirements under realistic conditions.