SKILLs.md для QA: як навчити AI писати автотести на Playwright саме такі, як тобі треба
Мене звати Михайлюк Віталій, я QA Automation Engineer у TechMagic team та додатково допомагаю моїм друзям із Testomat.io реалізовувати цікаві QA челенджі. У своїй роботі щодня використовую Playwright, TypeScript та AI-агентів на кшталт Claude Code і Cursor.
У цій статті я зібрав 7 правил, які ми з командою сформували на основі реальних проблем з автотестами та тестуванням загалом. Також поділюся з вами готовим безкоштовним скілом, який можна адаптувати під ваш проєкт.

NB: ці правила не універсальні. У кожної компанії свої процеси, архітектура, підходи до тестування та пріоритети. Але я впевнений, що хоча б частина правил, які ми з командою сформували в ході нашої тестувальної роботи, може бути корисною і для вашого проєкту.
Робота з AI-тулами як окремий вид мистецтва
Не боріться з кожною помилкою AI-агента окремо. Повторювані помилки перетворюйте на правила, а правила — на skill.
AI справді може значно спростити роботу QA Automation Engineer. Він швидко розбирається в репозиторії, знаходить потрібний компонент, розбирається в API, пише новий тест і навіть самостійно його запускає.
AI може працювати з тестом ще послідовніше. Наприклад, у CodeceptJS через MCP-інтеграцію агент може виконувати тест покроково прямо в браузері: виконати дію, перевірити результат і лише після успішної перевірки додати цей крок у тест. Або в Claude Code за допомогою розширення Chrome або Firefox. Це більше схоже на те, як тест створює людина: спочатку проклікує сценарій, перевіряє результат кожного кроку, а потім фіксує робочий варіант у коді.

Але щоб правильно працювати з AI-тулами, потрібно багато часу. Спочатку під час написання тестів наш АІ-агент використовував однакові тестові дані, додавав waitForTimeout(), створював надто великі E2E-сценарії та перевіряв URL замість реального результату операції. І все це призводило до непрацюючого коду.
Таким чином, багато чого я навчився саме на власних помилках: пробував різні підходи, отримував не той результат, виправляв його.
Потім зрозумів, що набагато корисніше не виправляти одну й ту саму проблему. Варто пояснити AI правило один раз і використати його в skill для AI-агента.
Правила, з яких створений skill
Нижче описані Automation Antipatterns, які допомогли нам зробити роботу з AI простішою, а тести — якіснішими.
Правило 1: Кожен тест має власні дані
Коли десятки тестів запускаються паралельно в CI, вони можуть використовувати одні й ті самі дані. Наприклад, один тест створює Demo Project, інший використовує того самого користувача, третій видаляє проєкт. Потім ми отримуємо нестабільні падіння. Тому в skill ми чітко описали, як саме створювати тестові дані:
### Rules for Test Data Generation - NEVER hardcode static IDs, emails, or user credentials in test cases. - ALWAYS use dynamic data generators (e.g., `@faker-js/faker` or test data factories). - Ensure test data cleanup or isolation via setup/teardown hooks (`beforeEach`, `afterEach`).
Наприклад, замість статичного Demo Project тест створює власну назву:
const user = await userFactory.create();
const projectName = `Project ${faker.string.nanoid(6)}`;
Правило 2: Патерни очікування для фреймворку
Коли AI не знаходить результат одразу, він може просто додати п’ять секунд очікування:
await page.waitForTimeout(5000);
Але система може бути готова через секунду, а може через сім. Це прямий шлях до сповільнення тест-ранів та флакі-тестів через мережеві затримки. Тому в skill ми описали не тільки те, що не потрібно використовувати, а й що робити замість цього:
### Anti-Patterns to Avoid: Flakiness
- DO NOT use explicit sleep delays (`page.waitForTimeout()`, `Thread.sleep()`).
- ALWAYS wait for specific UI state transitions or explicit network responses:
- Example: `await page.waitForResponse('/api/v1/users')`
- Example: `await expect(locator).toBeVisible()`)
Хороший тест чекає саме на потрібний результат:
const responsePromise = page.waitForResponse(r => r.url().includes('/api/v1/users') && r.ok());
await page.getByRole('button', { name: 'Save' }).click();
await responsePromise;
Тепер тест продовжує виконання, щойно з’являється потрібний стан, і не падає через те, що операція зайняла трохи більше часу.
Правило 3: The Iceberg Test
AI любить створювати довгі user journeys. Наприклад: зареєструвати користувача, створити проєкт, імпортувати тести, налаштувати середовище, запустити тести, відкрити звіт і експортувати його в PDF.
І начебто це хороший E2E-тест, але його складно дебажити. Якщо він падає на етапі реєстрації, ми вже нічого не знаємо про імпорт, запуск, звіт або експорт. Попросіть модель декомпозувати сценарії та використовувати API-передумови для підготовки стану.
### Test Architecture Requirements - Keep individual E2E tests focused on a SINGLE critical assertions path (max 5-7 logical steps). - Avoid long dependency chains in UI. Use API calls or storage state to set up prerequisites (e.g., seed data via API before opening UI). - Separate Independent Feature Tests into isolated spec files.
Правило 4: Явна та багатошарова валідація
Наступна проблема — слабкі assertions. AI може перевірити тільки URL:
await expect(page).toHaveURL(/\/runs\//);
Тест буде зеленим, але він не говорить, чи справді запуск відбувся і чи має він правильний стан. Тому в skill ми описали вимогу до явного та багатошарового валідування бізнес-логіки.
### Validation & Assertion Rules - EVERY test must contain explicit, meaningful assertions verifying business outcomes. - Avoid checking only URL changes or generic container visibility. - Assert specific UI elements, state values, or expected API responses. - Example: Instead of checking if modal exists, check specific success message text and action button states.
Наприклад:
await page.getByRole('button', { name: 'Launch' }).click();
await expect(page.getByTestId('run-summary'))
.toContainText('4 tests');
await expect(page.getByTestId('run-status'))
.toHaveText('In progress');
await expect(page.getByRole('row'))
.toHaveCount(5);
Правило 5: Використання mocks
Коли AI почав використовувати mocks для стабілізації E2E-тестів, це стало наступною перешкодою. На перший погляд, все працює: API завжди повертає очікувану відповідь, тест стає стабільним. Але якщо ми перевіряємо взаємодію UI з власним backend, mock прибирає з тесту саме цю частину системи. Тому встановіть межі використання моків.
### Mocking Strategy Guidelines - DO NOT mock primary system components under test. - Use mocks ONLY for: 1. Third-party integrations (Payment Gateways, External Auth providers). 2. Unstable/expensive external APIs. 3. Inducing rare edge-case error states (e.g., HTTP 500/503). - Prefer Contract/API testing or real test environments for core backend services.
Правило 6: Пріоритетність покриття автотестами
Якщо дати AI user stories і сказати «покрий функціональність», він може почати автоматизувати через UI все підряд: кнопки, повідомлення, дрібні зміни в інтерфейсі.
Тому перед написанням коду AI має знати, що саме йому потрібно перевірити і на якому рівні це краще робити. У skill це виглядає так:
### Test Automation Strategy Prioritization When analyzing user stories or acceptance criteria: 1. Recommend Unit/Integration coverage first for complex calculations or data transformations. 2. Limit UI Automation to: - Smoke scenarios & Critical User Journeys (P0/P1). - Stable core workflows (e.g., Auth, Checkout, Search). 3. FLAG items that SHOULD NOT be UI-automated (e.g., third-party captcha, visual layout tweaks, unstable canvas/third-party widgets).
Правило 7: Стратегія автономності
AI може розбити сценарії на кілька тестів, але оформити їх так, щоб Test B працював лише після того, як Test A створив об’єкт у базі. У разі паралельного запуску (workers > 1) такі тести гарантовано проваляться. Зафіксуйте вимогу до повної автономності кожного тесту.
### Test Independence Principles - Each test MUST be fully isolated and runnable in any order or in parallel. - NEVER rely on state or side-effects left by previous test cases. - Use unique entities (e.g., isolated workspaces, unique user prefixes) for concurrent executions.
Як використати цей skill
Наша команда починала з ідеї створити skill для власних потреб в автоматизації тестів. Оскільки цей скіл виглядав цікавим, я вирішив поділитися ним і з іншими, тому готовий варіант цього skill знаходиться у безкоштовній open-source бібліотеці QA skills: testomat.ai/qa-skills.
Його можна використовувати в своїй роботі як є або використати як основу для власного skill.
І я б радив саме другий варіант. Не намагайтеся одразу створити ідеальний skill. Візьміть останні тести, які писав ваш AI-агент, знайдіть у них повторювані проблеми і перетворіть їх на конкретні правила.

Після цього AI почне писати тести не лише за документацією Playwright, а й за правилами вашої команди.
А це вже зовсім інший рівень автоматизації.
Зробіть свій skill
Створіть у структурі вашого проєкту або AI-агента окремий шар інструкцій (наприклад, .cursorrules, файл скіла для Claude Code чи промпт для агента):

У SKILL ми пояснюємо, коли skill потрібно використовувати, даємо контекст про проєкт і додаємо критичні правила:
--- name: automate-manual-test-cases description: This skill converts manual test cases into production-ready automated test scripts. It analyzes the existing automation framework, interprets manual test steps, and generates maintainable tests following automation best practices. Use this skill whenever the user wants to automate manual test cases, expand test coverage, or create end-to-end automated flows from existing test documentation. license: MIT metadata: version: 1.0.0 ---
Skill Style & Best Practices
## CRITICAL: Anti-Patterns to Avoid (Strict Rules) 1. NO explicit sleeps or hardcoded timeouts. 2. NO hardcoded test data or static credentials. 3. NO chained test dependencies. 4. NO weak assertions (always validate final state explicitly). ## Code Generation Checklist Before outputting code, verify that: - [ ] No hardcoded delays were inserted. - [ ] Test data is isolated/generated dynamically. - [ ] Assertions verify actual business requirements.
Використання skill — це сучасне практичне рішення: AI-агент знає, що робити саме у вашому проєкті. Ви кастомізуєте його під себе й додаєте або прибираєте правила.
І ще одна ідея

Якщо один skill допомагає AI писати кращі тести, логічним наступним кроком буде створити другий skill, який перевірятиме результат першого.
Наприклад, після генерації тесту окремий skill може пройтися по коду і перевірити: чи немає hardcoded data, чи тест незалежний, чи немає зайвих пауз, чи assertion перевіряє бізнес-результат, чи правильно обрано рівень тестування.
Тоді виходить простий цикл: один AI-інструмент створює тест, інший перевіряє його за правилами вашої команди.
Мені здається, саме в цьому і є один із найпрактичніших способів використовувати AI в automation: навчити AI працювати так, як потрібно саме вашій команді.
А що ви думаєте про skills? Чи використовує ваша компанія skills для AI-агентів? Чи допомагають вони вирішувати реальні проблеми у вашій роботі?
Діліться власним досвідом у коментарях.
28 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівФайна стаття, сподобався практичний підхід. Не просто загальні слова про AI, а конкретні проблеми, які реально виникають при генерації автотестів: hardcoded дані, зайві timeout, великі E2E сценарії, слабкі перевірки і тд
Ідея збирати такі повторювані помилки в окремий skill виглядає дуже логічно.
скілли не потрібні
На одному скіллі далеко не заїхати. Як же агентна інженерія, харнес і тд.?Без правильного жонглювання з рулами, хуками, сабагентами та МСР, виборі моделей під задачу і такен ефішенсі і тд. — це може бути інколи дорога, інколи не зовсім ефективна робота. Це я мовчу про гардрейли, кволіті гейти і тд.
Вже ж є певні стандарти архітектури агентних рішень. Антропік з цим знайомить доволі чітко.
А вот ви хочете в одній статті щоб одразу про все розповіли, і промт інжинірінг, контекст інжинірівг, харнес, луп інжинірг ще давайте, токен ефішенсі
Архітекруру давайте ше мультиагентних систем?? Може давайте ще реінвентнемо А2А протокол?
Камон, може ще це все і безкоштовно вам дати всі ці знання і ще поменторити і сертифікатік дати і знайти роботу замість вас і дати пару джунів щоб замість вас працювали??
Ну що за дикий комент на маленьку статтю про крихітний нюанс
Твій комент більш дикий, ніж комент вище)
Таааак) звісно! я дуже хочу про все, безкоштовно і в одній статті)
А якщо серйозно, то коли я читаю
і дається скілл в приклад, то є відчуття гештальту. І було б добре автору давати зрозуміти аудиторії, що це лише частина роботи
Нажаль довлі токсичненькотпросто ваш комент звучав) можна ще було написати що це покриває тему скіла але наступне що треба вивчити та спробувати це на моїх курсах по аджентік інжиніргу, харнесу, архітектури мультиагентної системи ось лінк на кожен по 500$ 😁😇
Сорі за фантазію))) але в статті більше проблема що вона шішкою генерена і є помилки — я вон записав огляд навіть нижче))
Ну шож, я прочитав статтю, дав свій фідбек, доповінив, покритикував за використання ШІ щоб згенерити її — якщо комусь лєнь читати :)
Віталік, будь ласка, пиши руцями статтю та максимум давай на пруфрід її
Розумію що часу мало маєш) ну але це трошки зневажливо так робити :’(
читати може й лінь, а чекати 2 дні не лінь?? )))
Вимбачте) я працювау))
Цікава стаття і дуже хороші приклади
Розумію, тема хайпова, всі пишуть скіли і т.д. Рекомендація — пройдіть пару курсів, можна навіть безкоштовних від Anthropic (academy.claude.com), почитайте загалом про декомпозицію (не тільки скілів), хуки, рулзи, референси, CLAUDE.md (деякі non-negotiable rules зазвичай зберігаються саме у цьому файлі, а не у скілах). При всій повазі, матеріал сирий та не технічний, хоча потенціал для покращення є.
скіли навідміну від хуків рулзів і т.п. це станадрт індустрії, а не тільки клод
тому чим простіша система тим вона легша в масштабуванні
чим коротше описані правила в скілах тим детермінованіша поведінка
моделям уже не треба розжовувати інформацію, треба тільки казати що саме від неї хочеш. І тому мінімально описані скіли це топчик
:) ага, і система немає жодних guardrails, а інженери дивуються, чому це в них прод лежить пів-дня після кожного релізу, в них же мала бути детерміністична поведінка :)
можете поділитись як зробили це на своєму проєкті?
а до чого guardrails до клоду
якщо системі довірити самій себе захищати, то щось піде не так
робіть guardrails через зовнішні туи — аналіз ПРок, CI пайплайни;
якщо треба створюйте віртуалізовані середовища і запускайте клод там
пане, почитайте, будь ласка, що таке guardrails в Claude code, потім повертайтесь і поспілкуємось. хороший продакшн-сетап має зазвичай обидві рівні: agent-level guardrails + external/system-level guardrails
Я розумію що у вас є бажання відчути себе найрозумнішим тут. Але по-перше, моделі самі уже достатньо розумні і адекватні і з кожним новим релізом потребують менше обвязок щоб працювати. Навпки, в Клоді видалили більшу частину системних промптів, а всі дозволи видаються в auto-моді. Єдиний гардрейл який реально працюватиме — це віртуалізовані сендбокси і обмежені права на гіт
В мене є лише бажання спілкуватись з професіоналами. На жаль, у цьому треді це робити складно :) Успіхів
тут це не так — будь ласка, гляньте огляд , там є 1 комент від авторів, вони реально круто довели, що толком це не скейлиться
хуки є в тому ж кодексі екстеншном learn.chatgpt.com/docs/hooks
в pi github.com/hsingjui/pi-hooks
просто архітектура багатьох тулзів на плагінах/екстеншинах і тому так
не треба лиш певним моделям, але не всім, АЛЕ LLM і будь-яка генеративщина не є детермінованою, тому гарди потрібні + думаю, скоро ми фронтіром будемо користуватись не так часто, як зараз, коли ціни підуть вгору
Оо треба нлянути, щось гарне!
Віталію, дякую за цікаву статтю. Якщо буде бажання, спробуйте ще так: унікальні дані з префіксом і прибиранням через API, логін один раз у storageState, waitForResponse по методу і точному pathname, мок тільки на рідкісний збій. Короткі тести окремо, один довгий бізнес-флоу з підготовкою через API. І ці правила покладіть у скіл, інакше наступний агент їх не підхопить.
цікава стаття, додатковий лайк за приклади та діаграми
Якщо хтось вважає, що до цієї статті можна щось додати, або кардинально не погоджуєтеся — поділіться своїм фідбеком: я відкритий до критики)
щас відео огляд запишу)
Тилькі залиш посилання на статтю в описі до відео, бо не «по тестувальницькі» відео без посилання ;)
не всі люди письмені, тож обов’язково треба записувати відео ))