Testing Process October 28, 2026 13 min read

How to Test a Web Application: Process, Checklist and Test Cases

A practical process to test a web application from start to finish: a one-page test plan, a 7-area checklist, which checks to do by hand and which to automate, sample login test cases, exploratory testing tips, a runnable Playwright example and a bug report template.

To test a web application well, you need a plan before you need a tool: know what's in scope, where the risks are, which environments and data you'll use, and which kinds of testing matter for this product. Then you work through a checklist, write clear test cases, explore, automate the repetitive parts and report what you find.

This guide walks through that process step by step, with a 7-area checklist, a manual-vs-automated split for each area, sample test cases for a login page, a runnable Playwright example in JavaScript, and a bug report template you can copy.

Quick answer: plan scope and risks, then test seven areas (functional, UI/usability, compatibility, API, performance, security, accessibility). Write test cases for the critical flows, explore around them, automate whatever you'll repeat each release, and report bugs with steps, expected and actual results, and evidence.


How to Test a Web Application in 7 Steps

  1. Plan: define scope, risks, environments and test data.
  2. Choose the test areas from the checklist below that matter for this release.
  3. Write test cases for the critical flows, positive and negative.
  4. Execute the cases manually first, in the agreed browsers and devices.
  5. Explore in time-boxed sessions to find what the cases missed.
  6. Automate the stable, repeated checks so they run on every change.
  7. Report bugs clearly, retest fixes, and summarise what was and wasn't covered.

Step 1: Plan the Testing

A one-page test plan beats a fifty-page one nobody reads. Answer four questions.

Scope

List what's in and out. "Checkout, account settings and the new coupon field are in. The admin panel and the legacy mobile site are out." Being explicit about what you won't test is as useful as the list of what you will.

Risks

Rank features by impact × likelihood. Payment, login and anything that touches personal data are high impact. Newly written or heavily changed code is high likelihood. Spend most time where both are high.

Environments

Test in an environment that mirrors production: same configuration, realistic data volume, the same third-party integrations (in sandbox mode). Agree on the browsers and devices you'll support, based on your real visitor analytics rather than guesses.

Test data

Decide which accounts, products and records you need, and how to reset them. Use dedicated test users with known roles (admin, standard, locked). Never use real customer data in a test environment.

Plan itemExample
ScopeLogin, product search, cart, checkout
Out of scopeAdmin reports, email templates
Top risksPayments, session handling, new discount logic
EnvironmentStaging, production-like config, payment sandbox
Browsers/devicesChrome, Safari, Firefox, Edge; one iPhone, one Android
Test datastandard, locked and admin users; 3 products incl. out-of-stock
Exit criteriaAll critical cases pass, no open high-severity bugs

Test Web Application Checklist: 7 Areas

Use this as a coverage map. Not every release needs every row, but you should consciously decide to skip one rather than forget it.

AreaWhat to checkExample tools
1. FunctionalEvery feature does what the requirement says: forms, validation, business rules, links, search, sessions, error handlingManual cases, Playwright
2. UI / usabilityLayout, readable text, consistent styling, clear error messages, logical navigation, sensible empty statesManual review, visual snapshots
3. CompatibilityCross-browser (Chromium, Firefox, WebKit/Safari) and mobile: responsive layouts, touch targets, small screensPlaywright projects and device emulation, real-device clouds
4. API / integrationEndpoints return correct status codes and data; third-party services (payments, email) are wired correctlyPlaywright request, Postman
5. PerformancePage load and response times under normal and peak loadLighthouse, k6, JMeter
6. Security basicsAuthentication, authorisation, session expiry, input handling, HTTPS, awareness of the OWASP Top 10OWASP ZAP, manual checks
7. AccessibilityKeyboard navigation, focus order, labels, contrast, screen-reader names (WCAG)axe-core, screen readers

Functional testing

The core of any effort to test a web application. For each feature, test the happy path, invalid input, boundary values (0, 1, maximum length) and what happens when the user does things out of order, such as pressing Back after payment.

Compatibility: cross-browser and mobile

Bugs often hide in one engine only. Run the same flows in Chromium, Firefox and WebKit, and in phone-sized viewports. Check that nothing overflows horizontally and that buttons are large enough to tap. See Playwright cross-browser testing.

Security basics

You don't need to be a penetration tester to catch common problems. Know the categories in the OWASP Top 10 (broken access control, injection, authentication failures and so on) and check the obvious ones: can user A open user B's order by changing an ID in the URL? Does the session end on logout? Do error pages leak stack traces? Only test systems you're authorised to test, ideally with written permission and in a non-production environment. Deeper security testing belongs to specialists.

Accessibility

Try the main flow with only a keyboard. Every interactive element should be reachable with Tab, have a visible focus state and an accessible name. Automated scanners catch some issues; manual checks catch the rest. See Playwright accessibility testing.

Manual vs Automated Testing for Each Area

AreaManualAutomated
FunctionalNew features, edge cases, exploratory sessionsRegression of critical flows on every change
UI / usabilityJudging clarity, layout and "feel"Visual regression snapshots catch unintended changes
CompatibilitySpot-checks on real phonesSame tests across 3 engines and emulated devices
API / integrationExploring a new endpointStatus codes, schemas and rules: ideal for automation
PerformanceNot practical by handLoad tools and Lighthouse runs
SecurityAccess-control and logic checks need thoughtScanners for known patterns
AccessibilityKeyboard and screen-reader checksScanners for missing labels, contrast, ARIA errors

The pattern: humans find new problems, automation stops old problems coming back.


Sample Test Cases for a Login Page

Good test cases are short, specific and have one clear expected result. Here's a starter set for a login page (based on the practice site saucedemo.com, so you can try them).

IDScenarioSteps / dataExpected resultType
TC-01Valid loginstandard_user / secret_sauce, click LoginProducts page opensPositive
TC-02Locked-out userlocked_out_user / secret_sauceError: user has been locked outNegative
TC-03Wrong passwordstandard_user / wrong_passwordError: username and password do not matchNegative
TC-04Empty username(blank) / secret_sauceError: Username is requiredValidation
TC-05Empty passwordstandard_user / (blank)Error: Password is requiredValidation
TC-06Password is maskedType in the password fieldCharacters are hiddenSecurity
TC-07Keyboard onlyTab to fields, press Enter to submitLogin works without a mouseAccessibility
TC-08Protected page after logoutLog in, log out, open the inventory URL directlyRedirected to login with an errorSecurity

TC-01 to TC-05 are perfect automation candidates: same steps, different data, run every release. TC-06 to TC-08 are worth checking manually first, then automating if they've ever broken.

Exploratory Testing Tips

Test cases check what you expected. Exploratory testing finds what you didn't. Run it as a focused session, not random clicking.

  • Write a charter: one line such as "Explore the cart with discount codes to find pricing errors." Time-box it to 30–60 minutes.
  • Vary the inputs: very long text, emoji, leading spaces, pasted values, negative numbers, past dates.
  • Interrupt flows: refresh mid-checkout, press Back, open the same page in two tabs, let the session expire.
  • Change the conditions: slow network (DevTools throttling), small screen, zoom to 200%, a different browser.
  • Take notes as you go: what you tried, what looked odd, questions for the developer. Odd-but-not-wrong behaviour is still worth asking about.

Manual testing finds the bugs. Automation keeps them fixed. Testers who can do both are the ones teams fight to hire. See the two-step plan to add automation to your skills →


Automate the Repetitive Parts with Playwright

Once the login cases are stable, there's no reason to type them by hand every release. This Playwright file runs TC-01 to TC-05 from the table above. The negative cases are data-driven: one test body, four rows of data.

tests/saucedemo-login.spec.js
const { test, expect } = require('@playwright/test');

const cases = [
  { id: 'TC-02', name: 'locked-out user', user: 'locked_out_user', pass: 'secret_sauce', error: 'Sorry, this user has been locked out.' },
  { id: 'TC-03', name: 'wrong password', user: 'standard_user', pass: 'wrong_password', error: 'Username and password do not match' },
  { id: 'TC-04', name: 'empty username', user: '', pass: 'secret_sauce', error: 'Username is required' },
  { id: 'TC-05', name: 'empty password', user: 'standard_user', pass: '', error: 'Password is required' },
];

test.beforeEach(async ({ page }) => {
  await page.goto('https://www.saucedemo.com/');
});

test('TC-01 valid user logs in', async ({ page }) => {
  await page.getByPlaceholder('Username').fill('standard_user');
  await page.getByPlaceholder('Password').fill('secret_sauce');
  await page.getByRole('button', { name: 'Login' }).click();

  await expect(page).toHaveURL(/inventory\.html/);
  await expect(page.getByText('Products')).toBeVisible();
});

for (const c of cases) {
  test(`${c.id} ${c.name} is rejected`, async ({ page }) => {
    await page.getByPlaceholder('Username').fill(c.user);
    await page.getByPlaceholder('Password').fill(c.pass);
    await page.getByRole('button', { name: 'Login' }).click();

    await expect(page.locator('[data-test="error"]')).toContainText(c.error);
    await expect(page).not.toHaveURL(/inventory/);
  });
}
Terminal
npx playwright test tests/saucedemo-login.spec.js --project=chromium
Output
Running 5 tests using 5 workers

  ✓  1 [chromium] › tests/saucedemo-login.spec.js:14:1 › TC-01 valid user logs in
  ✓  2 [chromium] › tests/saucedemo-login.spec.js:24:3 › TC-02 locked-out user is rejected
  ✓  3 [chromium] › tests/saucedemo-login.spec.js:24:3 › TC-03 wrong password is rejected
  ✓  4 [chromium] › tests/saucedemo-login.spec.js:24:3 › TC-04 empty username is rejected
  ✓  5 [chromium] › tests/saucedemo-login.spec.js:24:3 › TC-05 empty password is rejected

  5 passed

Remove --project=chromium and the same five cases run in Firefox and WebKit too, which covers part of your compatibility checklist for free. For the full method (choosing what to automate, the test pyramid, API tests and CI), read automated web testing: step by step. For more UI-specific techniques, see web UI testing; for ready-made flows, Playwright script examples.

How to Report Bugs Well

A bug report's job is to let a developer reproduce the problem in minutes without asking you anything. Use the same structure every time:

FieldExample
TitleCheckout total ignores 10% coupon when cart has an out-of-stock item
EnvironmentStaging, build 4.2.1, Safari 18 on macOS
Steps to reproduce1. Log in as standard_user 2. Add items A and B 3. Apply code SAVE10 4. Open checkout
Expected resultTotal shows the discount
Actual resultTotal shows the full price; no error message
EvidenceScreenshot, console log, Playwright trace or HAR file
Severity / priorityHigh: customers are overcharged
  • One bug per report. Two problems in one ticket means one gets forgotten.
  • Describe, don't diagnose. State what happened; let the developer find the cause, unless you're sure.
  • Attach a trace when you can. A Playwright trace shows every action, network call and DOM snapshot. See the Trace Viewer tutorial.
  • Retest and close the loop. When the fix lands, re-run the steps and, if it's a regression risk, add an automated test for it.

From manual checklists to automated suites

Learn Playwright in JavaScript, with Claude AI helping you write tests. Then check your knowledge with the practice tests.

See the plan →

Frequently Asked Questions

How do you test a web application?

Plan the scope, risks, environments and test data first. Then test the functional behaviour, UI and usability, cross-browser and mobile compatibility, APIs and integrations, performance, basic security and accessibility. Write test cases for critical flows, explore around them, automate repeated checks and report bugs clearly.

What should a web application testing checklist include?

Seven areas: functional testing, UI and usability, compatibility across browsers and mobile devices, API and integration testing, performance, security basics such as OWASP Top 10 awareness, and accessibility. For each release, decide which areas apply rather than skipping any by accident.

What are the test cases for a login page?

Core cases: valid login, wrong password, locked or disabled user, empty username, empty password, password masking, keyboard-only login, and access to protected pages after logout. Add password reset, remember-me and rate limiting if the page offers them.

Should web application testing be manual or automated?

Both. Manual testing suits new features, exploratory sessions, usability and accessibility judgement. Automation suits regression checks, data-driven cases, API tests and running the same flows across browsers on every change. Humans find new bugs; automation stops old ones returning.

What tools are used to test a web application?

Common choices are Playwright, Cypress or Selenium for functional and cross-browser tests, Postman or Playwright for APIs, Lighthouse, k6 or JMeter for performance, OWASP ZAP for security scanning, and axe-core plus manual screen-reader checks for accessibility.

How do I write a good bug report?

Give it a specific title, the environment and build, numbered steps to reproduce, the expected and actual results, evidence such as a screenshot or Playwright trace, and a severity. Report one bug per ticket and describe what happened rather than guessing the cause.


Asim Noaman - Playwright and Claude AI course instructor

Asim Noaman

Senior QA Automation Engineer & AI Testing Specialist

With years of hands-on experience building test automation frameworks for production applications, Asim specializes in combining traditional QA methodologies with cutting-edge AI tools. He has helped teams adopt Playwright and AI-driven testing workflows to ship faster with fewer bugs.

Udemy Instructor Published course author
Playwright + AI Expert Specialized in AI-powered QA
Production Experience Enterprise-grade frameworks
Connect on LinkedIn

From Manual Tester to Automation

You Already Know What to Test. Learn to Automate It.

Planning, test cases and good bug reports are the foundation. Adding automation is what turns them into a career step up. The Playwright + Claude AI course teaches it in JavaScript, starting from the kind of test cases in this guide.

  • Turn manual test cases into Playwright tests, data-driven and cross-browser
  • UI, API and CI/CD in one framework
  • Use Claude AI and the Playwright MCP Server to write and fix tests
  • 4.5★ on Udemy, 510+ students, 30-day money-back guarantee
See the 2-Step Plan →

Ready now? Enroll on Udemy · Already know Playwright? Take the practice tests