Playwright in-built Test Runner in TypeScript
Writing automation scripts is only one part of building a successful test automation framework. You also need a reliable way to organize, execute, retry, and report test results. In this guide, you’ll learn how the Playwright Test Runner works and why it has become one of Playwright’s strongest advantages. The Playwright Test Runner provides modern capabilities such as:
- Parallel execution
- Automatic retries
- Fixtures
- Test grouping
- Hooks
- Cross-browser execution
- HTML reporting
What is the Playwright Test Runner?
The Playwright Test Runner is Playwright’s built-in testing framework that manages the complete lifecycle of automated tests.
It helps you:
- Discover test files
- Execute tests
- Manage browser instances
- Run tests in parallel
- Retry failed tests
- Generate reports
- Configure multiple browsers
Instead of relying on external libraries, these features are available out of the box.
Why Use the Built-in Test Runner?
Without a test runner, you would need to manually manage:
- Test execution
- Browser lifecycle
- Reporting
- Parallel execution
- Configuration
The Playwright Test Runner simplifies all of these tasks with a unified framework.
Project Structure
A typical Playwright project looks like this:
playwright-project│├── tests│ ├── login.spec.ts│ ├── cart.spec.ts│ └── checkout.spec.ts│├── playwright.config.ts├── package.json└── node_modules
The tests folder contains your test scripts, while playwright.config.ts stores global configuration.
Writing Your First Test
A Playwright test is created using the test() function.
import { test, expect } from '@playwright/test';test('Verify homepage title', async ({ page }) => { await page.goto('https://playwright.dev'); await expect(page).toHaveTitle(/Playwright/);});
The test runner automatically discovers files ending in .spec.ts or .test.ts.
Running Tests
Run all tests:
npx playwright test
Run a specific file:
npx playwright test tests/login.spec.ts
Run a specific test by name:
npx playwright test --grep "Login"
Parallel Execution
One of Playwright’s biggest strengths is native parallel execution.
Instead of running tests one after another:
Test 1↓Test 2↓Test 3
Playwright can execute them simultaneously:
Worker 1 → Test 1Worker 2 → Test 2Worker 3 → Test 3
Benefits include:
- Faster execution
- Better CPU utilization
- Reduced CI/CD runtime
Configuring Parallel Execution
Inside playwright.config.ts:
export default defineConfig({ fullyParallel: true, workers: 4});
Here:
fullyParallelenables parallel test execution.workersdefines the number of concurrent workers.
Retry Mechanism
Sometimes tests fail because of temporary issues like network delays or unstable environments.
Playwright can automatically retry failed tests.
Example configuration:
export default defineConfig({ retries: 2});
If a test fails, Playwright retries it up to two additional times before marking it as failed.
Fixtures
Fixtures are reusable components that prepare the environment before a test runs.
The most common built-in fixture is page.
test('Example', async ({ page }) => { await page.goto('https://example.com');});
Playwright automatically creates and disposes of the browser page for each test.
Creating Custom Fixtures
You can create reusable setup logic.
Example:
import { test as base } from '@playwright/test';export const test = base.extend({ adminUser: async ({}, use) => { await use({ username: 'admin', password: 'admin123' }); }});
Benefits:
- Reusable setup
- Cleaner test code
- Better maintainability
Test Grouping
Related tests can be grouped using describe().
import { test } from '@playwright/test';test.describe('Login Tests', () => { test('Valid Login', async ({ page }) => { }); test('Invalid Login', async ({ page }) => { });});
Grouping improves readability and organization.
Hooks
Hooks allow you to execute code before or after tests.
Before Each Test
test.beforeEach(async ({ page }) => { await page.goto('https://example.com');});
After Each Test
test.afterEach(async ({ page }) => { console.log('Test completed');});
Before All Tests
test.beforeAll(async () => { console.log('Starting suite');});
After All Tests
test.afterAll(async () => { console.log('Suite finished');});
Hooks reduce duplicate setup and teardown code.
Running Tests Across Multiple Browsers
Playwright supports multiple browser projects.
projects: [ { name: 'chromium' }, { name: 'firefox' }, { name: 'webkit' }]
One test suite can validate your application across all supported browsers.
HTML Reporting
After execution, generate the built-in HTML report:
npx playwright show-report
The report displays:
- Passed tests
- Failed tests
- Screenshots
- Execution duration
- Trace links
- Retry information
This makes debugging much easier.
Useful Command-Line Options
Run tests in headed mode:
npx playwright test --headed
Run in debug mode:
npx playwright test --debug
Run only Chromium:
npx playwright test --project=chromium
Update snapshots:
npx playwright test --update-snapshots
Playwright Test Runner vs Traditional Test Frameworks
| Feature | Playwright Test Runner | Traditional Frameworks |
|---|---|---|
| Built-in with Playwright | ✅ | ❌ |
| Parallel Execution | ✅ | Depends on framework |
| Retries | ✅ | Often requires configuration |
| Fixtures | ✅ | Framework-specific |
| HTML Reporting | ✅ | Usually external plugins |
| Cross-Browser Projects | ✅ | Manual setup |
Best Practices
- Keep tests independent.
- Use fixtures for reusable setup.
- Enable retries only for unstable environments.
- Configure parallel execution based on available resources.
- Group related tests with
describe(). - Use hooks to avoid duplicate code.
- Review HTML reports after every CI/CD run.
Common Mistakes
Sharing State Between Tests
Each test should be independent to avoid unpredictable failures.
Excessive Retries
Retries can hide genuine application defects. Use them sparingly.
Ignoring Reports
HTML reports provide valuable debugging information and should be part of every test review.
Running Too Many Workers
Using more workers than your machine can handle may reduce performance instead of improving it.
Frequently Asked Questions
What is the Playwright Test Runner?
It is Playwright’s built-in framework for executing, organizing, and reporting automated tests.
Does Playwright require Jest or Mocha?
No. The built-in Playwright Test Runner is sufficient for most automation projects.
Can Playwright run tests in parallel?
Yes. Parallel execution is supported natively through worker processes.
What are fixtures in Playwright?
Fixtures provide reusable setup and teardown logic that simplifies test maintenance.
Does Playwright generate reports?
Yes. It includes a built-in HTML reporting system with detailed execution results.
Conclusion
The Playwright Test Runner is much more than a simple execution tool. It provides a complete testing framework with built-in support for parallel execution, retries, fixtures, hooks, projects, and reporting.
These capabilities allow teams to build scalable, maintainable, and efficient automation frameworks without relying heavily on additional libraries. By understanding and using these features effectively, you can significantly improve the reliability and speed of your Playwright test suites.
Related Articles
✓ Playwright UI Elements Interactions
✓ Playwright Architecture Explained
✓ Playwright Setup with TypeScript
✓ Playwright Locator Strategies
✓ Playwright Auto-Waiting Mechanism
✓ Complete Playwright Tutorial
Discover more from Rotebit
Subscribe to get the latest posts sent to your email.

Pingback: Playwright Cloud Execution using BrowserStack vs TestMu AI - Rotebit