Джерело
QA Co-pilot | E2E без болю: ШІ-генерація тестових даних для бази (Prisma + PostgreSQ...
35 Охват/переглядів
2026-08-05 09:19
Повідомлення №364
🚀 E2E без болю: ШІ-генерація тестових даних для бази (Prisma + PostgreSQL)
Екіпаж, продовжуємо інженерію. Найскладніше в E2E тестах — це не написати page.click(). Найскладніше — підготувати правильний стан бази даних перед тим, як браузер взагалі відкриється.
Якщо у вас сучасний стек (наприклад, Angular -фронтенд і NestJS -бекенд на PostgreSQL), кожен тест має починатися з чистого аркуша. Але писати Prisma -сідери для складних реляційних зв'язків (юзер -> профіль -> 10 замовлень -> транзакції) руками — це години втраченого часу і біль при підтримці.
Тут на сцену виходить ШІ. Ми не просимо його писати тести, ми делегуємо йому створення фабрик даних.
Як це працює у зв'язці з Cursor / ChatGPT:
Замість того, щоб колупатися в документації та прописувати кожен include, ви згодовуєте ШІ вашу schema.prisma і просите згенерувати TypeScript -фабрики для Playwright.
Промпт для ШІ:
"Ось моя schema.prisma. Напиши TypeScript-клас DbManager для генерації сутності 'User' з пов'язаним 'Profile' та масивом 'Orders'. Використовуй PrismaClient. Зроби так, щоб дані генерувалися випадково (через faker.js), але я міг перевизначити будь-яке поле передавши об'єкт конфігурації. Напиши код так, щоб його можна було підключити як Playwright Fixture."
Що ви отримуєте:
Ідеально типізований код, який ви просто використовуєте у своїх тестах:
test('Angular UI коректно рендерить історію замовлень', async ({ page, dbManager, apiAuth }) => {
// 1. Генеруємо складний стан в Postgres за 1 секунду перед тестом
const user = await dbManager.users.createWithOrders({
ordersCount: 3,
status: 'COMPLETED'
});
// 2. Логінимось під цим юзером через бекенд (встановлюємо куки)
await apiAuth.loginAs(user);
// 3. Відкриваємо UI і перевіряємо рендер
await page.goto('/dashboard');
await expect(page.locator('.order-item')).toHaveCount(3);
});
Результат:
Ваші тести більше не залежать від "якихось даних", які хтось залишив у базі. Кожен тест створює свій власний унікальний всесвіт, перевіряє UI і потім очищає за собою.
ШІ пише нудні SQL -зв'язки через ORM, а ви фокусуєтесь на логіці тестування.
А як ви готуєте дані перед E2E тестами?
👇
🔥 — Тільки ізольовані генерації напряму в БД, повний контроль!
👀 — Смикаю API-ендпоінти бекенду, щоб створити юзерів.
🤯 — Тестую на існуючих даних у базі, якщо хтось їх змінить — тести падають...
Екіпаж, продовжуємо інженерію. Найскладніше в E2E тестах — це не написати page.click(). Найскладніше — підготувати правильний стан бази даних перед тим, як браузер взагалі відкриється.
Якщо у вас сучасний стек (наприклад, Angular -фронтенд і NestJS -бекенд на PostgreSQL), кожен тест має починатися з чистого аркуша. Але писати Prisma -сідери для складних реляційних зв'язків (юзер -> профіль -> 10 замовлень -> транзакції) руками — це години втраченого часу і біль при підтримці.
Тут на сцену виходить ШІ. Ми не просимо його писати тести, ми делегуємо йому створення фабрик даних.
Як це працює у зв'язці з Cursor / ChatGPT:
Замість того, щоб колупатися в документації та прописувати кожен include, ви згодовуєте ШІ вашу schema.prisma і просите згенерувати TypeScript -фабрики для Playwright.
Промпт для ШІ:
"Ось моя schema.prisma. Напиши TypeScript-клас DbManager для генерації сутності 'User' з пов'язаним 'Profile' та масивом 'Orders'. Використовуй PrismaClient. Зроби так, щоб дані генерувалися випадково (через faker.js), але я міг перевизначити будь-яке поле передавши об'єкт конфігурації. Напиши код так, щоб його можна було підключити як Playwright Fixture."
Що ви отримуєте:
Ідеально типізований код, який ви просто використовуєте у своїх тестах:
test('Angular UI коректно рендерить історію замовлень', async ({ page, dbManager, apiAuth }) => {
// 1. Генеруємо складний стан в Postgres за 1 секунду перед тестом
const user = await dbManager.users.createWithOrders({
ordersCount: 3,
status: 'COMPLETED'
});
// 2. Логінимось під цим юзером через бекенд (встановлюємо куки)
await apiAuth.loginAs(user);
// 3. Відкриваємо UI і перевіряємо рендер
await page.goto('/dashboard');
await expect(page.locator('.order-item')).toHaveCount(3);
});
Результат:
Ваші тести більше не залежать від "якихось даних", які хтось залишив у базі. Кожен тест створює свій власний унікальний всесвіт, перевіряє UI і потім очищає за собою.
ШІ пише нудні SQL -зв'язки через ORM, а ви фокусуєтесь на логіці тестування.
А як ви готуєте дані перед E2E тестами?
👇
🔥 — Тільки ізольовані генерації напряму в БД, повний контроль!
👀 — Смикаю API-ендпоінти бекенду, щоб створити юзерів.
🤯 — Тестую на існуючих даних у базі, якщо хтось їх змінить — тести падають...