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

Understand browser, context, and page in Playwright

๐ŸŽฅ Playwright: Browser, Context & Page - Real-time Demo and Multi-User Testing  . ๐ŸŽฏ Goal: Understand browser , context , and page in Playwright ๐Ÿง  1. What is a browser ? ✅ Definition: A browser in Playwright is a launched instance of a real browser (Chromium, Firefox, WebKit) that can be used for automated testing. ✅ Purpose: It starts and controls the browser process. It is the root of your test execution. Required to create contexts and pages . ✅ Code Example: ts Copy Edit import { chromium } from 'playwright' ; const browser = await chromium. launch ({ headless : false }); ๐Ÿง  2. What is a context (browser context)? ✅ Definition: A context is like a separate browser profile (or incognito tab) inside the browser. Each context is isolated — no cookies, local storage, or sessions are shared. ✅ Purpose: Simulates multiple users or sessions. Enables parallel and isolated testing. Allows setting user-specific prefer...

How to Maximize a Browser window using Playwright Java

  Playwright itself does not have a direct maximize () method like some other browser automation tools, but you can achieve the effect by setting the viewport to the screen size of your display. Below are ways to handle Maximize a browser in Playwright Java  ร˜   Setting the viewport to the screen size  o    setViewportSize(1920, 1080): This sets the browser window to a full HD resolution, effectively maximizing it. o    setHeadless(false): Ensures the browser runs in a visible mode so you can see the window being maximized.  Code Snapshot  Playwright playwright = Playwright. create ()   ;   Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false));     // Create a new browser context   BrowserContext context = browser.newContext(new Browser.NewContextOptions()          .setViewportSize(1920, 1080));     ...

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...