Skip to main content

What is a Test and Test Case in Playwright?

๐ŸŽฅ Hooks, Fixtures, and Grouping in Playwright - Explained with Examples

1. What is a Test and Test Case in Playwright?

✅ Test (test)

  • A single unit of testing logic.
  • Defined using test() function.
  • Each test() represents a test case.
import { test, expect } = require('@playwright/test');

test('Verify title of homepage', async ({ page }) => {
  await page.goto('https://example.com');
  await expect(page).toHaveTitle(/Example Domain/);
});

In this example, "Verify title of homepage" is the test case description.

๐Ÿ”น 2. What are before, after, beforeEach, afterEach?

These are hooks to manage setup and teardown logic:

  • ๐Ÿ“Œ beforeAll: Runs once before all tests
  • ๐Ÿ“Œ afterAll: Runs once after all tests
  • ๐Ÿ“Œ beforeEach: Runs before each test case
  • ๐Ÿ“Œ afterEach: Runs after each test case

๐Ÿ”น 3. Step-by-Step Example

const { test, expect } = require('@playwright/test');

test.beforeAll(async () => {
  console.log('>> BEFORE ALL: Setting up resources');
});

test.afterAll(async () => {
  console.log('>> AFTER ALL: Cleaning up resources');
});

test.beforeEach(async ({ page }) => {
  console.log('>> BEFORE EACH: Navigating to homepage');
  await page.goto('https://example.com');
});

test.afterEach(async () => {
  console.log('>> AFTER EACH: Test completed');
});

test('Test Case 1 - Check title', async ({ page }) => {
  await expect(page).toHaveTitle(/Example Domain/);
});

test('Test Case 2 - Check heading text', async ({ page }) => {
  const heading = await page.locator('h1');
  await expect(heading).toHaveText('Example Domain');
});

๐Ÿ”น 4. Execution Flow

  • beforeAll() runs once
  • Each test follows: beforeEach() → test body → afterEach()
  • afterAll() runs once after all tests

๐Ÿ”น 5. Why Use Hooks?

  • DRY code: Avoid repetition
  • Maintainability: Centralize test environment handling
  • Consistency: Predictable state across tests

๐Ÿ” Expanded Understanding with More Points

๐Ÿ”ธ 6. Grouping Tests using test.describe()

Group related test cases with shared setup logic:

const { test, expect } = require('@playwright/test');

test.describe('Homepage Tests', () => {
  test.beforeEach(async ({ page }) => {
    await page.goto('https://example.com');
  });

  test('has correct title', async ({ page }) => {
    await expect(page).toHaveTitle(/Example Domain/);
  });

  test('has correct heading', async ({ page }) => {
    const heading = await page.locator('h1');
    await expect(heading).toHaveText('Example Domain');
  });
});

๐ŸŸข Advantage: Better readability and shared setup.

๐Ÿ”ธ 10. Tagging/Filtering Tests

Control which tests run during development:

  • test.only(...): Runs only this test
  • test.skip(...): Skips this test
  • test.fixme(...): Marks the test as broken or to be fixed
test.skip('This feature is under development', async ({ page }) => {
  // This test will be skipped
});

๐Ÿ”ธ 11. Fixtures for Reusable Setups

Create custom logic for shared test setup like login, data, etc.:

// In playwright.config.js or a setup file
const base = require('@playwright/test');

exports.test = base.test.extend({
  adminPage: async ({ browser }, use) => {
    const context = await browser.newContext({ storageState: 'auth.json' });
    const page = await context.newPage();
    await use(page);
    await page.close();
  },
});

Use the fixture in test:

const { test, expect } = require('./custom-fixtures');

test('Admin can access dashboard', async ({ adminPage }) => {
  await adminPage.goto('/admin');
  await expect(adminPage.locator('h1')).toHaveText('Admin Dashboard');
});

๐Ÿ”ธ 12. Use Annotations for Metadata

Attach custom metadata for better tracking:

test('Critical path - checkout flow', async ({ page }) => {
  test.info().annotations.push({ type: 'severity', description: 'high' });
});

Summary Table

Component Purpose
test() Defines a single test case
beforeAll() / afterAll() Run once before/after all tests
beforeEach() / afterEach() Run before/after each test
test.describe() Group related test cases
test.only / skip / fixme Control test execution
Fixtures Reusable logic and objects

Comments

Popular posts from this blog

Step-by-Step: Launch Browser, Context, and Page in Playwright and Run Test and Configuration (JavaScript)

๐ŸŽฅ Setup Browser, Context, Page & Run Config Test Scripts with package.json & playwright.config.js Step-by-Step: Launch Browser, Context, and Page in Playwright and Run Test and Configuration (JavaScript) 1. Install Playwright You can install Playwright using the following command: npm init playwright@latest 2. Create a Basic Test Script Understand the core Playwright architecture: Element Description browser Controls the browser instance (like Chrome, Firefox, etc.) context Acts like a separate browser profile (cookies, localStorage are isolated) page A single browser tab where interaction happens 3. Run the Test npx playwright test example.spec.js Ways to Run TypeScript Tests Way Command Notes ๐ŸŸข Via npx npx playwright test Uses built-in TypeScript support ๐ŸŸข With s...

Playwright Test Structure in Details -Session-02

๐ŸŽฅ Playwright: test.only, Hooks & Grouping with test.describe Explained Let’s go step-by-step , showing how to build from a single test , to using beforeEach / afterEach , and then organizing things with test.describe . ✅ Step 1: Basic Single Test with test.only import { test, expect } from '@playwright/test' ; test. only ( '๐Ÿš€ Basic test - check title' , async ({ page }) => { await page. goto ( 'https://example.com' ); await expect (page). toHaveTitle ( /Example Domain/ ); }); test.only ensures only this test runs — great for debugging. ✅ Step 2: Add beforeEach and afterEach import { test, expect } from '@playwright/test' ; test. beforeEach ( async ({ page }) => { console . log ( '๐Ÿ”„ Setting up before each test' ); await page. goto ( 'https://example.com' ); }); test. afterEach ( async ({ page }, testInfo) => { console . log ( `๐Ÿ“ฆ Finished test: ${testInfo.title} `); }); test. only ( ...

Playwright Locators in JavaScript (Complete Guide)

๐ŸŽฏ Playwright Locators in JavaScript (Complete Guide) This guide explains each Playwright locator with: ✅ What it is ๐Ÿ• When to use ⚙️ How to use it ๐ŸŽฏ Benefits ๐Ÿงช Code Examples ๐Ÿ”น 1. Locator by ID ✅ What: Selects an element with a unique id . ๐Ÿ• When: Element has a unique id . ⚙️ How: page.locator('#username') ๐ŸŽฏ Benefit: Fast and reliable. <input id="username" /> await page.locator('#username').fill('John'); ๐Ÿ”น 2. Locator by Class ✅ What: Selects by class . ๐Ÿ• When: Repeated or styled elements. ⚙️ How: page.locator('.password') ๐ŸŽฏ Benefit: Useful for shared styling. <input class="password" /> await page.locator('.password').fill('12345'); ๐Ÿ”น 3. Locator by Text ✅ What: Matches visible element text. ๐Ÿ• When: For buttons, links, etc. ⚙️ How: page.getByText('Login') ๐ŸŽฏ Benefit: Human-readable. <button>Login...