System Testing
What it is
Section titled “What it is”System testing validates a complete, integrated application against its specified requirements — functional and non-functional — as a black box. The whole system under test is assembled and running; testers work from requirements, not from code.
It answers the question: does this release, as a whole, meet its specification? It is the natural home for end-of-cycle verification before user acceptance.
Requirements + design │ ▼ [ Full system under test ] ← black box, no internal peeking │ ▼ Pass / fail against specWhen to use it / when to avoid it
Section titled “When to use it / when to avoid it”Use it for
- End-of-cycle verification against the requirements baseline
- Cross-functional checks the system as a whole must satisfy
- Release sign-off evidence
Avoid blurring it with neighbours:
- Testing one component → component test
- Whether the user accepts it → acceptance testing
- The full production-like journey → end-to-end testing
System testing is broader than E2E: it covers functional requirements and non-functional expectations (performance, security, recoverability) at the system level.
Frameworks & tools
Section titled “Frameworks & tools”| Tool | Role |
|---|---|
| Requirement-driven suites (TestRail, Zephyr, Xray) | Trace tests to requirements |
| Playwright / Cypress / Selenium | Drive the assembled system |
| Robot Framework | Keyword-driven system/acceptance suites |
| Postman / Newman / Karate | API-level system checks |
| k6 / JMeter / Gatling | Non-functional system checks |
| OWASP ZAP | Security checks at system level |
| Testcontainers / Docker Compose | Stand up the full topology deterministically |
Quick setup
Section titled “Quick setup”# Stand up the whole system, then run the suite against it.docker compose up -dnpx playwright testdocker compose down -vpip install robotframework robotframework-requestsrobot --outputdir results tests/system/# Karate runs API + UI system suites from a single runner.mvn test -Dkarate.options="classpath:system"npx playwright test --project=systemExample
Section titled “Example”// REQ-CHECKOUT-04: an out-of-stock item cannot be purchased.test('REQ-CHECKOUT-04 blocks out-of-stock checkout', async ({ page }) => { await seedInventory({ sku: 'ABC', qty: 0 }); await page.goto('/product/ABC'); await expect(page.getByRole('button', { name: /add to cart/i })) .toBeDisabled();});*** Test Cases ***REQ-CHECKOUT-04 Het Hang Khong The Mua [Tags] system requirement Seed Inventory sku=ABC qty=0 Go To ${BASE_URL}/product/ABC Element Should Be Disabled css=button.add-to-cart@Testvoid reqCheckout04_outOfStockIsRejected() { given().baseUri(baseUrl) .contentType(JSON) .body("{\"sku\":\"ABC\"}") .when().post("/checkout") .then().statusCode(409);}Anti-patterns & best practices
Section titled “Anti-patterns & best practices”- Trace every test to a requirement. System testing is evidence against the spec; untraceable tests are noise.
- Cover non-functional requirements too, not only features — performance, security, recovery at the system level.
- Use a production-like environment. A system test on a toy config proves little.
- Automate the regression subset; keep exploratory system testing for humans.
- Do not re-prove unit logic here. System tests verify the assembled whole, not branches.
Self-assessment quiz
Section titled “Self-assessment quiz”Self-assessment quiz
Pick one answer per question, then press Check answers.