- Tác giả
- Name
- Nguyễn Đức Xinh
- 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 testafterEach
– chạy sau mỗi testbeforeAll
– chạy trước toàn bộ test suiteafterAll
– 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ì.