Lỗi Phổ Biến Trong Playwright: Dữ Liệu Cứng Gây Xung Đột Khi Chạy Test Song Song

07 tháng 4, 2026·2 phút đọc

Khi chạy các bài kiểm thử (test case) song song, việc sử dụng cùng một dữ liệu cố định như địa chỉ email sẽ khiến các worker tranh giành tài nguyên, dẫn đến lỗi "email đã tồn tại" và làm hỏng tính ổn định của pipeline. Giải pháp tối ưu là kết hợp Factory Pattern, thư viện Faker và file JSON tĩnh để tạo dữ liệu độc nhất cho mỗi lần chạy.

Lỗi Phổ Biến Trong Playwright: Dữ Liệu Cứng Gây Xung Đột Khi Chạy Test Song Song

Chạy kiểm thử tự động song song là một cách tuyệt vời để tăng tốc độ phát triển phần mềm. Tuy nhiên, nếu bạn không cẩn thận với dữ liệu kiểm thử, việc này có thể biến thành thảm họa. Mới đây, khi xem xét một bộ kiểm thử (test suite), tôi đã nhận thấy dữ liệu được hardcode (tích hợp sẵn) hoàn toàn phá hủy sự ổn định của pipeline CI/CD.

Tình huống phổ biến là: Worker 1 đăng ký thành công, nhưng các Worker từ 2 đến 5 lập tức thất bại với thông báo lỗi "email already exists" (email đã tồn tại).

Trước đây: Các bài test "đánh nhau"

Vấn đề nằm ở việc sử dụng một chuỗi dữ liệu tĩnh cho tất cả các quy trình chạy song song.

test('register new user', async ({ page }) => {
  await page.getByLabel('Email').fill('[email protected]'); 
  // Worker 1: passes. Workers 2-5: fail instantly
});

Cách tiếp cận này khiến các worker cạnh tranh nhau để sử dụng cùng một tài khoản người dùng, gây ra xung đột dữ liệu và kết quả không nhất quán.

Giải pháp: Chiến lược kết hợp Factory và JSON

Để giải quyết vấn đề này, bạn nên giữ các dữ liệu dùng để tấn công (hacks) hoặc kiểm tra giới hạn trong một file JSON tĩnh. Đồng thời, hãy sử dụng một Factory kết hợp với thư viện Faker để tạo ra mọi dữ liệu khác một cách động. Cách này giúp loại bỏ hoàn toàn sự va chạm (collision) giữa các test case.

import { faker } from '@faker-js/faker';
import invalidInputs from './invalid-inputs.json';

// 1. Factory function cho các lần chạy động và độc nhất
export function createTestUser() {
  return {
    email: `test-${Date.now()}-${faker.string.alphanumeric(5)}@test.com`,
    password: faker.internet.password({ length: 12 })
  };
}

test('happy path: zero collisions', async ({ page }) => {
  const user = createTestUser();
  await page.getByLabel('Email').fill(user.email);
  await page.getByLabel('Password').fill(user.password);
});

// 2. Dữ liệu JSON tĩnh cho các trường hợp ngoại lệ mang tính xác định
test('reject sql injection in name field', async ({ page }) => {
  // invalidInputs.sqlInjection[0] = "' OR 1=1 --"
  await page.getByLabel('Name').fill(invalidInputs.sqlInjection[0]);
  await expect(page.getByText('Invalid input')).toBeVisible(); 
});

Tóm lại:

  • Hãy dùng dữ liệu cố định cho các trường hợp tấn công hoặc kiểm thử bảo mật cụ thể.
  • Dùng Faker cho mọi dữ liệu cần tính duy nhất và ngẫu nhiên.

Chiến lược dữ liệu kiểm thử của bạn là gì? Hãy chia sẻ ý kiến bên dưới.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗