Site logo
Tác giả
  • avatar Nguyễn Đức Xinh
    Name
    Nguyễn Đức Xinh
    Twitter
Ngày xuất bản
Ngày xuất bản

Test Hooks trong Playwright – Quản lý vòng đời test hiệu quả

Trong quá trình viết test tự động, chúng ta thường cần thực hiện một số tác vụ trước và sau khi chạy test như:

  • Chuẩn bị dữ liệu test
  • Reset trạng thái hệ thống
  • Cleanup sau khi test
  • Setup môi trường test
  • Ghi log và báo cáo

Test Hooks trong Playwright là giải pháp hoàn hảo để quản lý các tác vụ này một cách có tổ chức và hiệu quả.

1. Test Hooks là gì?

Hooks là các hàm chạy trước hoặc sau mỗi test: dùng để chuẩn bị, cleanup, reset state,...

Playwright cung cấp 4 loại hooks chính:

  • beforeEach – chạy trước mỗi test
  • afterEach – chạy sau mỗi test
  • beforeAll – chạy trước toàn bộ test suite
  • afterAll – chạy sau tất cả test

Cấu trúc cơ bản của Test Hooks

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

test.describe('User Management Tests', () => {
  // Chạy trước mỗi test trong describe block
  test.beforeEach(async ({ page }) => {
    console.log('Setting up test environment...');
    // Setup test data
  });

  // Chạy sau mỗi test trong describe block
  test.afterEach(async ({ page }) => {
    console.log('Cleaning up after test...');
    // Cleanup
  });

  // Chạy một lần trước tất cả tests trong describe block
  test.beforeAll(async ({ browser }) => {
    console.log('Setting up test suite...');
    // Global setup
  });

  // Chạy một lần sau tất cả tests trong describe block
  test.afterAll(async () => {
    console.log('Cleaning up test suite...');
    // Global cleanup
  });
});

2. Ví dụ thực tế: Quản lý dữ liệu test

Reset Database trước mỗi test

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

test.describe('User Management', () => {
  test.beforeEach(async ({ page }) => {
    // Reset database trước mỗi test
    await page.request.post('https://api.example.com/test/reset');
  });

  test('Tạo user mới', async ({ page }) => {
    await page.goto('https://dummy-demo-njndex.web.app/users/new');
    await page.fill('[name="email"]', 'test@example.com');
    await page.click('button[type="submit"]');
    await expect(page.locator('text=User created successfully')).toBeVisible();
  });
});

Cleanup sau mỗi test

test.describe('File Upload Tests', () => {
  test.afterEach(async ({ page }) => {
    // Xóa file test sau mỗi test
    await page.request.delete('https://api.example.com/test/files');
  });

  test('Upload file thành công', async ({ page }) => {
    // Test implementation
  });
});

3. Nested Hooks

Hooks có thể được lồng nhau trong các describe blocks:

test.describe('User Management', () => {
  test.beforeAll(async () => {
    console.log('Setup for all user management tests');
  });

  test.describe('Admin Features', () => {
    test.beforeEach(async () => {
      console.log('Setup for admin tests');
    });

    test('Admin can delete user', async () => {
      // Test implementation
    });
  });

  test.describe('Regular User Features', () => {
    test.beforeEach(async () => {
      console.log('Setup for regular user tests');
    });

    test('User can update profile', async () => {
      // Test implementation
    });
  });
});

4. Best Practices khi sử dụng Hooks

Sử dụng beforeEach cho setup nhẹ nhàng như reset state, clear cookies ✅ Sử dụng beforeAll cho setup tốn thời gian như tạo test data ✅ Luôn cleanup trong afterEach hoặc afterAll để tránh ảnh hưởng test khác ✅ Tránh logic phức tạp trong hooks – nên tách thành helper functions ✅ Xử lý lỗi trong hooks để tránh test bị fail không rõ ràng ✅ Document rõ ràng mục đích của mỗi hook

5. So sánh với Fixtures

Tiêu chí Hooks Fixtures
Mục đích Setup/teardown test Chia sẻ biến / logic giữa test
Cách dùng beforeEach(), afterEach() test.extend()
Hỗ trợ async ✅ Có ✅ Có
Tái sử dụng logic ☑️ Tốt ✅ Rất tốt
Quản lý dependency ❌ Không rõ ràng ✅ Có thể khai báo theo thứ tự

6. Tổng kết

Test Hooks là công cụ quan trọng trong Playwright để:

  • Quản lý vòng đời test một cách có tổ chức
  • Tự động hóa setup và teardown
  • Đảm bảo test độc lập và không ảnh hưởng lẫn nhau
  • Tối ưu thời gian chạy test bằng cách tái sử dụng setup

Kết hợp Test Hooks với Fixtures sẽ giúp bạn xây dựng một framework test mạnh mẽ và dễ bảo trì.

Tài liệu tham khảo