# Tests and Fixtures — Playwright & Cypress

Source: https://www.skillbyai.com/en/e2e-testing/pw-tests

> test, page and isolation.

## What a Playwright test receives

You import `test` and `expect` from `@playwright/test`. Each test is an async function that destructures **fixtures** from its first argument. `page` is the most common: a fresh tab in a fresh **browser context**, which is like a new incognito profile, so cookies and storage never leak between tests. Other built-in fixtures include `context`, `browser`, `browserName` and `request` (an API client). Hooks such as `test.beforeEach` run setup, and `test.describe` groups tests. Tests in a file run in order by default, while files run in parallel across **workers**.

## Find elements like a user, assert like a user

Playwright tests receive fixtures such as page, locate elements by role and label, and wait automatically.

![Three ideas: tests and fixtures, locators and auto-waiting, web-first assertions.](assets/figures/e2e-testing/section-2-map.svg) — Figure 2.1 — Fixtures, locators and assertions in a Playwright test.

## A test with a hook and a group

Each test gets its own isolated page.

```typescript
import { test, expect } from '@playwright/test';

test.describe('todo list', () => {
  test.beforeEach(async ({ page }) => {
    await page.goto('/todos');
  });

  test('adds a todo', async ({ page }) => {
    await page.getByPlaceholder('What needs to be done?').fill('Buy milk');
    await page.getByPlaceholder('What needs to be done?').press('Enter');
    await expect(page.getByRole('listitem')).toHaveText(['Buy milk']);
  });

  test('starts empty', async ({ page }) => {
    await expect(page.getByRole('listitem')).toHaveCount(0);
  });
});
```

## A clean hotel room for every guest

Each test checks into a freshly cleaned room (a new browser context): no leftover cookies, no previous guest's luggage in local storage.

**Quiz:** Why does each Playwright test get a new browser context?

- [ ] To download a new browser each time
- [x] To isolate cookies and storage so tests do not affect each other
- [ ] To share login state automatically between tests
- [ ] To make tests run in a fixed order

*Answer:* To isolate cookies and storage so tests do not affect each other. Isolation is the default.
