A bug found in testing costs $100 to fix. The same bug in production costs $10,000. This guide covers every type of web application testing, the tools to run it, and the practices that stop expensive bugs from reaching your users.
By Robonito Engineering Team · Updated May 2026 · 18 min read
The real cost of skipping web application testing

Here is a number worth keeping in mind before we get into testing types: according to IBM Systems Sciences Institute research, a defect caught during development costs approximately $100 to fix. The same defect caught in production costs over $10,000 — a 100× difference. For critical security vulnerabilities, the cost can reach millions when you factor in breach notification, regulatory fines, and customer loss.
Web applications are not static. They change constantly — new features, updated dependencies, redesigned UI components, new browser versions, evolving security threats. Every change is a potential regression. Every dependency update is a potential breaking change. Every new feature is an untested code path in production until someone tests it.
Web application testing is not a phase at the end of development. It is a continuous discipline that runs parallel to development, catches problems when they are cheap to fix, and gives teams the confidence to ship changes quickly without fear.
This guide covers all eight types of web application testing, the right tools for each, real code examples, and the practices that separate teams who test effectively from those who discover problems from their users.
Quick stats
| Fact | Source |
|---|---|
| Bug found in unit testing: ~$100 to fix | IBM Systems Sciences Institute |
| Same bug found in production: ~$10,000 to fix | IBM Systems Sciences Institute |
| 83% of web traffic passes through APIs — API bugs affect everyone | Akamai |
| Teams with automated testing ship 24× more frequently | DORA State of DevOps 2025 |
| 91% of organisations experienced a web application security incident in 2024 | Salt Security |
Table of Contents
- The web application testing pyramid
- Functional testing
- API testing
- Performance testing
- Security testing
- Compatibility and cross-browser testing
- Usability and accessibility testing
- Regression testing
- Automation testing — the multiplier
- Choosing the right testing approach for your project
- Pre-release web application testing checklist
- Frequently Asked Questions
Automate your web application testing without writing a single line of code
Robonito auto-generates test cases from your real user flows, runs them across browsers in CI, and self-heals when your UI changes — zero scripts, zero maintenance sprints. Try Robonito free →
1. The web application testing pyramid
Before diving into individual testing types, understanding the testing pyramid prevents the most common and expensive testing mistake: building a test suite that is too heavy at the top.
▲
/█\ ← E2E / UI Tests
/███\ (few, slow, high confidence)
/█████\
/███████\ ← Integration / API Tests
/█████████\ (medium volume, medium speed)
/███████████\
/█████████████\ ← Unit Tests
/███████████████\ (many, fast, isolated)
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Why the pyramid shape matters: Tests at the base (unit tests) are fast (milliseconds), cheap to write, and pinpoint exactly where a failure occurred. Tests at the top (E2E/UI tests) are slow (seconds to minutes), expensive to maintain, and when they fail, require investigation to find the root cause.
The most common anti-pattern is the inverted pyramid — teams that write mostly E2E tests because they "feel more complete." The result is a test suite that takes 45 minutes to run, breaks constantly from UI changes, and gives no useful signal about where a bug actually is.
Recommended distribution for web applications:
| Layer | Volume | Target execution time | Run frequency |
|---|---|---|---|
| Unit tests | 60–70% of tests | < 30 seconds total | Every commit |
| Integration / API tests | 20–30% of tests | < 5 minutes total | Every PR |
| E2E / UI tests | 5–10% of tests | < 15 minutes total | Every merge |
| Performance + security | Scheduled | As needed | Pre-release + nightly |
2. Functional testing
Question it answers: Does the web application do what it is supposed to do?
Functional testing verifies that every feature works correctly from the user's perspective — forms submit properly, buttons trigger the right actions, navigation routes to the correct pages, data saves and retrieves accurately, and error states display the right messages.
This is the foundation of web application testing. If your application does not function correctly, no other quality dimension matters. A fast, secure, beautifully designed application that does not work is still a failed product.
What functional testing covers
- Form submission and validation (required fields, format checks, error messages)
- User authentication and session management (login, logout, password reset, session expiry)
- Navigation and routing (internal links, browser back button, deep links, 404 handling)
- Data creation, reading, updating, and deletion (CRUD operations)
- Business logic (calculations, rules, conditional flows)
- Integration points (payment processing, email sending, third-party services)
Real code example — Playwright functional test
// tests/functional/checkout.spec.ts
import { test, expect } from '@playwright/test';
test.describe('Checkout flow', () => {
test('user completes purchase with valid details', async ({ page }) => {
await page.goto('/products/widget-pro');
// Add to cart
await page.getByRole('button', { name: 'Add to cart' }).click();
await expect(page.getByTestId('cart-count')).toHaveText('1');
// Proceed to checkout
await page.getByRole('link', { name: 'Checkout' }).click();
await expect(page).toHaveURL('/checkout');
// Fill details
await page.getByLabel('Full name').fill('Jane Smith');
await page.getByLabel('Email').fill('[email protected]');
await page.getByLabel('Address').fill('123 Main St');
// Submit
await page.getByRole('button', { name: 'Place order' }).click();
// Verify confirmation
await expect(page.getByRole('heading', { name: 'Order confirmed' }))
.toBeVisible();
});
test('shows validation errors when required fields are empty', async ({ page }) => {
await page.goto('/checkout');
await page.getByRole('button', { name: 'Place order' }).click();
// Errors should appear inline
await expect(page.getByText('Full name is required')).toBeVisible();
await expect(page.getByText('Email is required')).toBeVisible();
// Page should not navigate away
await expect(page).toHaveURL('/checkout');
});
});
Best tools: Playwright (recommended for new projects), Cypress (JavaScript teams), Robonito (no-code teams).
3. API testing
Question it answers: Does the application's data layer work correctly, independently of the UI?
API testing is one of the highest-value testing investments for web applications. APIs are the backbone of modern web apps — they handle authentication, data retrieval, business logic, and third-party integrations. Testing them directly (bypassing the UI entirely) is 10–100× faster than UI tests and catches data and logic errors that no UI test would surface.
What API testing covers
- HTTP status codes (200, 201, 400, 401, 403, 404, 422, 500)
- Request/response schema validation (correct fields, correct data types)
- Authentication and authorisation (valid tokens pass, invalid tokens fail)
- Input validation (malformed data rejected with correct error messages)
- Business logic (correct calculations, correct state transitions)
- Rate limiting (429 returned when limits exceeded)
Real code example — pytest API test
## tests/api/test_users.py
import pytest
import httpx
BASE_URL = "http://localhost:8000"
@pytest.fixture
def auth_headers(test_token):
return {"Authorization": f"Bearer {test_token}"}
class TestUsersAPI:
def test_get_user_returns_correct_data(self, client, auth_headers):
res = client.get("/api/v1/users/user-123", headers=auth_headers)
assert res.status_code == 200
data = res.json()
assert data["id"] == "user-123"
assert "email" in data
## Critical: sensitive fields must never appear in responses
assert "password" not in data
assert "password_hash" not in data
def test_unauthenticated_request_returns_401(self, client):
res = client.get("/api/v1/users/user-123")
assert res.status_code == 401
def test_user_cannot_access_another_users_data(self, client, auth_headers_user_b):
## User B's token should not fetch User A's data
res = client.get("/api/v1/users/user-123", headers=auth_headers_user_b)
assert res.status_code == 403
def test_invalid_email_format_returns_422(self, client, auth_headers):
res = client.post("/api/v1/users", json={
"email": "not-an-email",
"name": "Test User"
}, headers=auth_headers)
assert res.status_code == 422
assert "email" in res.json()["detail"][0]["loc"]
Best tools: Postman, pytest + httpx (Python), Jest + Supertest (Node.js), Robonito (no-code API testing).
4. Performance testing
Question it answers: Does the application remain fast and stable under real-world traffic conditions?
A web application that works perfectly for one user can collapse under 500 concurrent users. Performance testing finds that breaking point before users do. More importantly, it catches performance regressions — a slow database query introduced in a new feature that makes every page load 2 seconds slower.
The three types of performance testing
Load testing simulates expected traffic — the number of concurrent users you anticipate during a normal busy period. It verifies that your application meets performance targets (p95 response time under 500ms) under realistic conditions.
Stress testing deliberately pushes beyond expected capacity to find the breaking point. When does the application start returning errors? Does it recover gracefully when load drops? Does memory usage stabilise or grow indefinitely (memory leak)?
Spike testing simulates sudden traffic bursts — a marketing campaign goes viral, a news article links to your site. Does the application absorb the spike and recover, or does it crash and require manual intervention?
Performance benchmarks to target
| Metric | Good | Acceptable | Needs work |
|---|---|---|---|
| Time to First Byte (TTFB) | < 200ms | < 500ms | > 800ms |
| Largest Contentful Paint (LCP) | < 2.5s | < 4s | > 4s |
| API response time (p95) | < 300ms | < 500ms | > 800ms |
| Error rate under load | < 0.1% | < 1% | > 1% |
| Memory (no growth over 30 min) | Stable | +5% | +20%+ |
Real code example — k6 load test
// load-tests/homepage.js
import http from 'k6/http';
import { check, sleep } from 'k6';
import { Rate } from 'k6/metrics';
const errorRate = new Rate('error_rate');
export const options = {
stages: [
{ duration: '2m', target: 100 }, // Ramp up to 100 users
{ duration: '5m', target: 100 }, // Hold at 100 users
{ duration: '2m', target: 500 }, // Spike to 500 users
{ duration: '3m', target: 500 }, // Hold at 500 users
{ duration: '2m', target: 0 }, // Ramp down
],
thresholds: {
http_req_duration: ['p(95)<500'], // 95% of requests under 500ms
error_rate: ['rate<0.01'], // Less than 1% errors
},
};
export default function () {
const res = http.get('https://yourapp.com/');
check(res, {
'status is 200': (r) => r.status === 200,
'response time under 500ms': (r) => r.timings.duration < 500,
});
errorRate.add(res.status !== 200);
sleep(1);
}
Best tools: k6 (modern, developer-friendly), Apache JMeter (enterprise, GUI-based), Lighthouse (Core Web Vitals measurement), WebPageTest (real-browser performance analysis).
5. Security testing
Question it answers: Can the application be exploited to steal data, gain unauthorised access, or cause harm?
Security testing is the highest-stakes testing type in this guide. A missed functional bug inconveniences users. A missed security vulnerability can expose millions of user records, result in regulatory fines up to 4% of global annual revenue under GDPR, and permanently damage brand trust.
The OWASP Top 10 is the authoritative reference for web application security vulnerabilities. Every web application should be tested against it before every major release.
Critical security tests every web app needs
Authentication testing — verify that unauthenticated requests to protected endpoints return 401, not data. Verify that session tokens expire correctly. Verify that password reset flows cannot be abused.
Authorisation testing — verify that authenticated users cannot access resources belonging to other users (Broken Object Level Authorization — OWASP API1). This is the most commonly exploited vulnerability in web applications.
## Security test: User A should not be able to access User B's order
def test_idor_prevention(client, user_a_token, user_b_order_id):
headers = {"Authorization": f"Bearer {user_a_token}"}
res = client.get(f"/api/v1/orders/{user_b_order_id}", headers=headers)
## Must return 403 Forbidden, not 200 with User B's data
assert res.status_code == 403
Input validation and injection testing — every user input field is a potential injection vector. Test with SQL injection payloads, NoSQL injection, XSS payloads, and oversized inputs:
injection_payloads = [
"'; DROP TABLE users; --", ## SQL injection
"<script>alert(1)</script>", ## XSS
"../../../etc/passwd", ## Path traversal
"A" * 100000, ## Oversized payload
None, [], {}, ## Type confusion
]
for payload in injection_payloads:
res = client.post("/api/v1/search", json={"query": payload},
headers=auth_headers)
## Should never return 500 — always 400 or 422
assert res.status_code != 500
## Should never include a stack trace
assert "stack" not in res.text.lower()
assert "traceback" not in res.text.lower()
Sensitive data exposure testing — verify that API responses never include passwords, tokens, internal IDs, or other sensitive fields that should not be client-visible.
Best tools: OWASP ZAP (free, automated scanning), Burp Suite (professional security testing), pytest with custom security test cases, Snyk (dependency vulnerability scanning).
6. Compatibility and cross-browser testing

Question it answers: Does the application work correctly across all browsers, devices, and screen sizes your users actually use?
Browser rendering engines interpret CSS and JavaScript differently. A layout that is pixel-perfect in Chrome can be broken in Safari. An interaction that works smoothly on desktop can be completely unusable on a 375px mobile viewport. Compatibility testing catches these differences before users do.
2026 browser market share — what to test
| Browser | Market share | Priority |
|---|---|---|
| Chrome | ~65% | Must test |
| Safari | ~19% | Must test |
| Edge | ~5% | Should test |
| Firefox | ~3% | Should test |
| Samsung Internet | ~2% | Mobile priority |
At minimum, test Chrome and Safari. Their rendering engines (V8 and WebKit) are genuinely different and produce the most common cross-browser discrepancies.
Viewport testing matrix
| Viewport | Width | Represents |
|---|---|---|
| iPhone SE | 375px | Smallest common mobile |
| iPhone 14 Pro | 393px | Current mainstream iOS |
| Android mid-range | 412px | Current mainstream Android |
| iPad | 768px | Tablet portrait |
| Laptop | 1280px | Standard laptop |
| Desktop | 1920px | Standard desktop |
Playwright cross-browser configuration
// playwright.config.ts
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
projects: [
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
{ name: 'webkit', use: { ...devices['Desktop Safari'] } },
{ name: 'firefox', use: { ...devices['Desktop Firefox'] } },
{ name: 'mobile-chrome', use: { ...devices['Pixel 7'] } },
{ name: 'mobile-safari', use: { ...devices['iPhone 14'] } },
],
// On PRs: Chromium only. On main branch: all browsers.
grep: process.env.BRANCH === 'main' ? undefined : /chromium/,
});
Best tools: Playwright (native cross-browser), BrowserStack (real device cloud), LambdaTest (affordable cross-browser cloud).
7. Usability and accessibility testing
Question it answers (usability): Can real users accomplish their goals without confusion or frustration?
Question it answers (accessibility): Can users with disabilities use the application effectively?
These two types are covered together because they share a common goal: ensuring the application works for all users, not just the ones who match an assumed profile.
Usability testing
Usability testing involves real human participants attempting specific tasks while you observe. It surfaces problems that no automated test would find — because automated tests know exactly where to click. Real users do not.
A 5-participant usability test typically surfaces 80% of a product's significant usability problems, according to Nielsen Norman Group research. You do not need a lab or a large budget — remote usability testing with tools like Maze or UserTesting takes one afternoon.
What to look for: where do users hesitate? Where do they click in the wrong place? Where do they ask "how do I...?" These moments are usability failures. Document them and prioritise fixes by frequency and severity.
Accessibility testing
Accessibility testing verifies that users with disabilities can use the application — specifically through screen readers, keyboard navigation, high contrast modes, and voice control. It is both the right thing to do and increasingly a legal requirement (WCAG 2.2, ADA, EU Accessibility Act 2025).
Automated tools (axe-core, Lighthouse) catch approximately 30–40% of accessibility issues. The rest require manual testing with real assistive technology.
// tests/accessibility/pages.spec.ts
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';
const criticalPages = ['/', '/login', '/checkout', '/dashboard'];
for (const path of criticalPages) {
test(`${path} — no WCAG 2.2 AA violations`, async ({ page }) => {
await page.goto(path);
await page.waitForLoadState('networkidle');
const results = await new AxeBuilder({ page })
.withTags(['wcag2a', 'wcag2aa', 'wcag21aa'])
.analyze();
if (results.violations.length > 0) {
console.table(results.violations.map(v => ({
rule: v.id,
impact: v.impact,
elements: v.nodes.length,
description: v.description
})));
}
expect(results.violations).toEqual([]);
});
}
Best tools: axe-core + Playwright (automated a11y), Lighthouse (a11y audit), VoiceOver/NVDA (manual screen reader testing), Maze/UserTesting (remote usability).
8. Regression testing
Question it answers: Did a recent code change break something that used to work?
Regression testing is your safety net. Every time a developer adds a feature, fixes a bug, or updates a dependency, they risk breaking something that was working before. Regression tests are the full suite of previously-passing tests re-run against new code to verify nothing broke.
The challenge with regression testing is scale. A mature web application can have hundreds of regression test cases covering years of bug fixes and feature additions. Running all of them manually before every deployment is impossible. This is exactly where automation pays for itself — a regression suite that runs automatically on every commit, in every PR, is the foundation of safe continuous delivery.
Regression testing strategy
Smoke regression — the 15–20 most critical tests covering core user flows. Runs on every PR in under 3 minutes. Blocks merge if critical flows fail.
Full regression — the complete suite. Runs on every merge to main. Target execution time under 20 minutes with parallelisation.
Scheduled regression — the full suite plus edge cases, run nightly against the staging environment to catch issues introduced by overnight dependency updates or configuration changes.
Keeping your regression suite healthy
The most common regression suite problem is test rot — old tests that fail intermittently for maintenance reasons rather than real bugs. Teams start ignoring failures. Ignored failures mean real bugs get through.
Three rules to prevent test rot:
- Any test that fails three times in a row for no code-related reason gets investigated and fixed that sprint — not skipped
- Flaky test rate above 2% is a team metric that gets tracked and addressed
- Every production bug that was not caught by the test suite gets a new regression test before the fix is merged
Best tools: Robonito (no-code, self-healing regression), Playwright (engineering-led), Cypress (JavaScript teams).
9. Automation testing — the multiplier

Automation testing is not a separate type of testing — it is the delivery mechanism that makes all the other types sustainable. Without automation, regression testing is manual and slow. Cross-browser testing is a spreadsheet. Performance testing is occasional. API testing depends on someone running Postman manually.
With automation, all of those run on every commit, automatically, in parallel.
The most important principle for web application test automation is the testing pyramid (Section 1). Automate from the bottom up — unit tests first, then API tests, then UI tests last. Teams that automate UI tests before they have stable API and unit coverage spend most of their time maintaining fragile UI tests and wonder why automation does not help.
What to automate vs keep manual
| Test type | Automate? | Why |
|---|---|---|
| Unit tests | ✅ Always | Fast, stable, high ROI |
| API / integration tests | ✅ Always | Fast, reliable, deep coverage |
| Regression tests | ✅ Always | Too many to run manually |
| Cross-browser tests | ✅ Yes | Impractical to do manually at scale |
| Performance load tests | ✅ Yes | Impossible to simulate manually |
| Security scanning | ✅ Yes | Consistent, repeatable coverage |
| Exploratory testing | ❌ Keep manual | Requires human curiosity and judgment |
| Usability testing | ❌ Keep manual | Requires human observation |
| Visual UX review | ⚠️ Partial | Automate pixel checks, keep human review |
CI/CD integration — the full pipeline
## .github/workflows/web-app-tests.yml
name: Web Application Test Suite
on:
push:
branches: [main, develop]
pull_request:
jobs:
unit-and-api-tests:
name: Unit + API Tests
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20', cache: 'npm' }
- run: npm ci
- run: npm run test:unit
- run: npm run test:api
ui-tests:
name: UI Tests (Playwright)
runs-on: ubuntu-latest
needs: unit-and-api-tests
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20', cache: 'npm' }
- run: npm ci
- run: npx playwright install --with-deps chromium webkit
- run: npm run start:test &
- run: npx wait-on http://localhost:3000 --timeout 30000
- run: npx playwright test --project=chromium --project=webkit
accessibility-tests:
name: Accessibility Scan
runs-on: ubuntu-latest
needs: unit-and-api-tests
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20', cache: 'npm' }
- run: npm ci && npm run start:test &
- run: npx wait-on http://localhost:3000 --timeout 30000
- run: npm run test:a11y
security-scan:
name: OWASP ZAP Security Scan
runs-on: ubuntu-latest
needs: unit-and-api-tests
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- run: npm run start:test &
- run: npx wait-on http://localhost:3000 --timeout 30000
- uses: zaproxy/[email protected]
with:
target: 'http://localhost:3000'
fail_action: true
Best tools: Robonito (no-code, all-in-one), Playwright (engineering-led UI), k6 (performance), OWASP ZAP (security), axe-core (accessibility).
10. Choosing the right testing approach for your project
Not every project needs every type of testing at the same depth. Use this guide to prioritise based on your application's risk profile.
By application type
| Application type | Highest priority testing | Secondary priority |
|---|---|---|
| E-commerce / payments | Security, functional, API | Performance, regression |
| SaaS / B2B platform | Functional, regression, API | Performance, compatibility |
| Healthcare / fintech | Security, functional, compliance | Accessibility, API |
| Media / content site | Performance, compatibility | Functional, accessibility |
| Internal tooling | Functional, regression | API, security |
| Mobile web app | Compatibility, performance | Functional, accessibility |
By team size and resources
Solo developer or very small team: Focus on API tests first (fastest ROI, catches business logic bugs), then a smoke suite of 10–15 UI tests covering critical paths. Use Robonito to get UI coverage without the scripting overhead.
Mid-size team (5–15 engineers): Full testing pyramid — unit tests owned by developers, API tests shared between developers and QA, UI regression owned by QA. Add performance testing for critical paths and monthly security scans.
Large team / enterprise: All testing types, full automation, dedicated security testing, compliance testing for relevant regulations (GDPR, HIPAA, ADA), load testing at realistic scale, and synthetic production monitoring.
11. Pre-release web application testing checklist
Use this before every production deployment.
Functional
- All critical user flows tested end-to-end (registration, login, core feature, checkout/conversion)
- All forms tested: valid submission, empty required fields, invalid formats, maximum lengths
- Error states verified: 404, 500, network failure, empty states
- Authentication: login, logout, session expiry, password reset
- Third-party integrations verified in staging environment
API
- All endpoints return correct status codes for happy path
- 401 returned for unauthenticated requests to protected endpoints
- 403 returned when authenticated user accesses another user's resources
- Input validation rejects malformed data with 400/422, never 500
- No sensitive fields (passwords, tokens, internal IDs) in responses
- Rate limiting returns 429 when limits exceeded
Performance
- LCP < 2.5 seconds on 4G mobile (Lighthouse audit)
- p95 API response time < 500ms under expected load
- No memory leaks during 30-minute load test
- Error rate < 1% at 2× expected peak traffic
Security
- OWASP ZAP scan passes with no high or critical findings
- No stack traces in error responses
- All dependencies scanned for known vulnerabilities (Snyk or npm audit)
- HTTPS enforced — HTTP redirects to HTTPS
- CORS configured correctly (not
*in production) - Content Security Policy headers present
Compatibility
- Chrome (latest) — functional + visual
- Safari (latest) — functional + visual
- Mobile Chrome (375px viewport) — layout + interaction
- Mobile Safari (iPhone 14) — layout + interaction
- No horizontal scroll on mobile viewports
Accessibility
- axe-core scan: zero WCAG 2.2 AA violations
- All interactive elements keyboard-accessible
- All images have descriptive alt text
- All form inputs have associated labels
- Colour contrast ≥ 4.5:1 for normal text
Frequently Asked Questions
What are the types of web application testing?
The eight main types are: functional testing (does it work?), API testing (does the data layer work?), performance testing (is it fast under load?), security testing (can it be exploited?), compatibility testing (does it work across browsers and devices?), usability testing (can users accomplish their goals?), accessibility testing (does it work for users with disabilities?), and regression testing (did recent changes break anything?).
What is the most important type of web application testing?
Functional testing is the foundation — if core features do not work, nothing else matters. Security testing is the highest stakes — a missed vulnerability can cost millions. For most teams the priority order is: functional → security → performance → regression → compatibility.
Can automation replace manual web application testing?
Automation handles regression, cross-browser, performance, and API testing efficiently and at scale. It cannot replace manual testing for exploratory testing, usability evaluation, accessibility review with real assistive technology, or any scenario requiring human judgement about whether an experience feels right. The best teams combine both.
What tools are best for web application testing in 2026?
Playwright or Robonito for UI automation, k6 for performance testing, OWASP ZAP for security scanning, pytest or Supertest for API testing, and axe-core for accessibility testing. The right combination depends on your stack, team skills, and testing priorities.
How much does a bug cost if found in production versus testing?
According to IBM Systems Sciences Institute research, a bug found during testing costs approximately $100 to fix. The same bug in production costs over $10,000 — a 100× difference. This is the foundational business case for investing in comprehensive testing before release.
How often should web applications be tested?
Unit and API tests should run on every commit (under 5 minutes). UI regression should run on every PR (under 15 minutes). Performance and security testing should run on every merge to main or on a nightly schedule. A smoke suite should run against production after every deployment.
External references
- OWASP Top 10 Web Application Security Risks — Authoritative security vulnerability reference
- Playwright Documentation — UI testing framework
- k6 Load Testing Documentation — Performance testing
- axe-core Accessibility Rules — Accessibility testing reference
- WCAG 2.2 Guidelines — Web accessibility standard
- Google Core Web Vitals — Performance metrics reference
- DORA State of DevOps 2025 — Engineering performance research
Automate all 8 types of web application testing — without writing code
Robonito covers functional, API, regression, cross-browser, and accessibility testing in one platform — auto-generated from your real user flows, self-healing when your UI changes, running in CI from day one. Start free at Robonito.com →
Automate your QA — no code required
Stop writing test scripts.
Start shipping with confidence.
Join thousands of QA teams using Robonito to automate testing in minutes — not months.
