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
- Plan: define scope, risks, environments and test data.
- Choose the test areas from the checklist below that matter for this release.
- Write test cases for the critical flows, positive and negative.
- Execute the cases manually first, in the agreed browsers and devices.
- Explore in time-boxed sessions to find what the cases missed.
- Automate the stable, repeated checks so they run on every change.
- 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 item | Example |
|---|---|
| Scope | Login, product search, cart, checkout |
| Out of scope | Admin reports, email templates |
| Top risks | Payments, session handling, new discount logic |
| Environment | Staging, production-like config, payment sandbox |
| Browsers/devices | Chrome, Safari, Firefox, Edge; one iPhone, one Android |
| Test data | standard, locked and admin users; 3 products incl. out-of-stock |
| Exit criteria | All 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.
| Area | What to check | Example tools |
|---|---|---|
| 1. Functional | Every feature does what the requirement says: forms, validation, business rules, links, search, sessions, error handling | Manual cases, Playwright |
| 2. UI / usability | Layout, readable text, consistent styling, clear error messages, logical navigation, sensible empty states | Manual review, visual snapshots |
| 3. Compatibility | Cross-browser (Chromium, Firefox, WebKit/Safari) and mobile: responsive layouts, touch targets, small screens | Playwright projects and device emulation, real-device clouds |
| 4. API / integration | Endpoints return correct status codes and data; third-party services (payments, email) are wired correctly | Playwright request, Postman |
| 5. Performance | Page load and response times under normal and peak load | Lighthouse, k6, JMeter |
| 6. Security basics | Authentication, authorisation, session expiry, input handling, HTTPS, awareness of the OWASP Top 10 | OWASP ZAP, manual checks |
| 7. Accessibility | Keyboard 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
| Area | Manual | Automated |
|---|---|---|
| Functional | New features, edge cases, exploratory sessions | Regression of critical flows on every change |
| UI / usability | Judging clarity, layout and "feel" | Visual regression snapshots catch unintended changes |
| Compatibility | Spot-checks on real phones | Same tests across 3 engines and emulated devices |
| API / integration | Exploring a new endpoint | Status codes, schemas and rules: ideal for automation |
| Performance | Not practical by hand | Load tools and Lighthouse runs |
| Security | Access-control and logic checks need thought | Scanners for known patterns |
| Accessibility | Keyboard and screen-reader checks | Scanners 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).
| ID | Scenario | Steps / data | Expected result | Type |
|---|---|---|---|---|
| TC-01 | Valid login | standard_user / secret_sauce, click Login | Products page opens | Positive |
| TC-02 | Locked-out user | locked_out_user / secret_sauce | Error: user has been locked out | Negative |
| TC-03 | Wrong password | standard_user / wrong_password | Error: username and password do not match | Negative |
| TC-04 | Empty username | (blank) / secret_sauce | Error: Username is required | Validation |
| TC-05 | Empty password | standard_user / (blank) | Error: Password is required | Validation |
| TC-06 | Password is masked | Type in the password field | Characters are hidden | Security |
| TC-07 | Keyboard only | Tab to fields, press Enter to submit | Login works without a mouse | Accessibility |
| TC-08 | Protected page after logout | Log in, log out, open the inventory URL directly | Redirected to login with an error | Security |
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.
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/); }); }
npx playwright test tests/saucedemo-login.spec.js --project=chromium
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:
| Field | Example |
|---|---|
| Title | Checkout total ignores 10% coupon when cart has an out-of-stock item |
| Environment | Staging, build 4.2.1, Safari 18 on macOS |
| Steps to reproduce | 1. Log in as standard_user 2. Add items A and B 3. Apply code SAVE10 4. Open checkout |
| Expected result | Total shows the discount |
| Actual result | Total shows the full price; no error message |
| Evidence | Screenshot, console log, Playwright trace or HAR file |
| Severity / priority | High: 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.
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
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.
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
Ready now? Enroll on Udemy · Already know Playwright? Take the practice tests