
June 11, 2026

Functional testing verifies that software behaves according to its requirements — that each feature does what it is supposed to do. It answers the question: "Does the application work correctly?" This contrasts with non-functional testing, which measures how well it works (speed, security, usability).
Functional testing happens at four progressive levels, each building on the previous one. Together they form the backbone of any QA strategy — a concept introduced in our complete guide to software testing.
Unit testing verifies the smallest testable pieces of code — individual functions, methods, or classes — in isolation. Developers write unit tests alongside the code itself, typically using frameworks like Jest, JUnit, or pytest. Unit tests are fast (milliseconds), cheap to run, and pinpoint failures precisely. A healthy codebase runs thousands of unit tests on every commit.
Integration testing verifies that separately developed modules work correctly together — that the payment module talks to the order module, that the API correctly reads from the database. Integration defects are among the most common in real systems because individual units can each be correct while their interaction is broken.
System testing evaluates the complete, integrated application against its requirements — end to end, in an environment that mirrors production. This is where QA teams test full user workflows: registration, login, purchase, reporting. System testing includes functional flows plus cross-cutting checks like browser compatibility and data integrity. This level is the strongest candidate for browser automation — tools like TestInspector let teams automate complete user journeys without writing code.
UAT is the final level: real users or business stakeholders verify that the system meets business needs in realistic scenarios. UAT answers a different question than system testing — not "does it meet the spec?" but "does it solve the business problem?" Read our dedicated UAT guide for process and entry/exit criteria.
The classic test pyramid recommends many fast unit tests at the base, fewer integration tests in the middle, and a small number of end-to-end system tests at the top. The higher the level, the slower and more expensive each test — but the closer it is to real user experience. Most teams combine automated unit/integration tests with automated browser tests for critical flows, as discussed in our manual vs automated testing comparison.
What is the difference between functional and non-functional testing?
Functional testing verifies what the system does (features, behaviors, outputs). Non-functional testing verifies how well it does it (performance, security, accessibility, usability).
Who performs each level of functional testing?
Developers write unit and most integration tests. QA engineers perform system testing. Business users or product owners perform UAT.
Should all functional tests be automated?
Unit and integration tests should be fully automated. System tests for critical flows should be automated; exploratory and usability checks remain manual. UAT is inherently manual since it validates business fit.
What order should functional testing follow?
Unit → integration → system → acceptance. Each level assumes the previous one passed, so defects are caught at the cheapest possible stage.
Need a QA team that covers every level? Explore Astaqc's software testing services or contact us.

Sign up to receive and connect to our newsletter