This article was automatically translated from the original Turkish version.
End-to-End Testing (E2E) is a software testing method that evaluates the entire functional flow of a software application, including all system components and integrated parts, working together under real user scenarios. This type of testing aims to verify not only the individual components of the software but also the overall interoperability and data integrity of the entire system.
In other words, E2E tests simulate all interactions a user would have with the software, encompassing every layer from the application interface to the database. As such, it represents a holistic testing approach that validates the entire system end-to-end, not just isolated functions.
The primary objective of end-to-end testing is to verify the system’s overall functionality, ensuring that every module and subcomponent operates seamlessly together. This approach not only tests the software’s functional correctness but also guarantees the quality of the user experience.
The importance of E2E testing has become more pronounced with the increasing complexity of system dependencies and user journeys. Today, many software applications integrate with databases, third-party APIs, network layers, and external systems. Therefore, testing individual modules alone is insufficient. End-to-end testing serves the following purposes:
Within the Software Development Lifecycle (SDLC), end-to-end testing is typically performed after the development phase, either before or after system testing. However, in Agile and DevOps approaches, these tests are increasingly integrated into earlier stages of continuous integration and continuous delivery (CI/CD) pipelines.
According to the test pyramid principle, testing processes consist of three layers: unit tests (bottom layer), integration tests (middle layer), and end-to-end tests (top layer). Due to their comprehensive nature, end-to-end tests are executed in smaller numbers but carry the highest value in validating the system’s functional integrity. Therefore, E2E tests serve as the final checkpoint before the software is delivered to end users.
Horizontal end-to-end testing focuses on testing a typical user flow from start to finish. For example, on an e-commerce site, testing the complete process of product search, adding to cart, payment, and order confirmation is an example of horizontal E2E testing. This approach verifies that all layers—from the user interface to the database—work together correctly and covers processes that directly affect the user experience.
Vertical end-to-end testing, on the other hand, checks the integrity between internal layers of a specific module. This type of testing is particularly useful for system components without a user interface, such as APIs, background processes, or database operations. The goal is to demonstrate that data flow, integrations, and business logic function consistently and correctly across the module’s subcomponents.
End-to-end tests can be performed either manually or automatically.
In manual testing, a test specialist interacts with the software as a real user would, executing predefined scenarios. This method is suitable for exploratory testing, initial evaluations of user interfaces, or controlling complex user flows. However, it is time-consuming, has low repeatability, and is prone to human error.
In automated testing, user scenarios are written as code and executed automatically using testing tools. This approach can be easily integrated into continuous integration systems, is ideal for regression testing, and expands test coverage. Tools such as Selenium, Cypress, Appium, and TestGrid are widely used for such automation.
Importance and Objectives of End-to-End Testing
Position of End-to-End Testing in the Software Development Lifecycle
Types of End-to-End Testing
Horizontal Testing
Vertical Testing
Manual and Automated End-to-End Testing Approaches
Manual Testing Approach
Automated Testing Approach
Stages of End-to-End Testing
Challenges in End-to-End Testing and Solutions