vyvchy
    Теми розділу

    14 · AI для QA

    Генерація тест-артефактів

    Зміст

    Тест-артефакти (test artifacts) — це все, що QA продукує на папері й у коді: тест-кейси, чек-листи, , автотести, баг-репорти. Рутина, яка з'їдає години: розписати п'ятнадцять кейсів на форму реєстрації, згенерувати сотню рядків тестових даних, перетворити ручний сценарій на скелет Playwright-тесту. Саме тут LLM (large language model) економить найбільше часу — і саме тут найлегше вистрелити собі в ногу.

    Ця глава — про те, як віддати моделі чорнову роботу й не втратити якість. Ключова теза, яку варто винести наперед: AI видає чернетку, а не готовий артефакт. Модель генерує правдоподібний текст, а не перевірену істину, тож кожен її вивід проходить через тебе. Уся справа не в тому, чи вмієш ти попросити ChatGPT написати кейси, а в тому, як ти перевіряєш, що згенероване не сміття. Глава спирається на базову главу «Промптинг для QA» — якщо ще не читав, почни з неї: тут ті самі прийоми (контекст, , ) працюють на конкретні артефакти.

    Чому AI сильний у чернетках і слабкий у фактах

    LLM працює через передбачення наступного токена: вона продовжує текст найімовірнішим продовженням, спираючись на статистику мільярдів прикладів (механізм — у главі «Як працюють LLM»). Звідси випливає її профіль сил і слабкостей, і він прямо визначає, що їй можна доручити.

    Модель сильна там, де відповідь має форму, а не факт: структура тест-кейсу, типові категорії перевірок для поля вводу, варіації тестових даних, boilerplate автотесту. Вона бачила тисячі таких артефактів і відтворює їхній шаблон швидко й охайно. Модель слабка там, де потрібна правда з-поза тексту: реальні селектори твого застосунку (вона їх не бачить — тож вигадає), справжній сенс вимоги, актуальна бізнес-логіка, фактичне . Те, чого немає в , модель добудує вигадкою — це (hallucination), і виглядає вона так само впевнено, як і правда.

    Практичний висновок один: доручай моделі широту й форму (швидко накидати багато варіантів у правильному форматі), а правильність і глибину лишай за собою. Далі — як це виглядає для кожного типу артефакту.

    Тест-кейси і чек-листи з вимог

    Спочатку розберемось із різницею, бо промпт під кожен артефакт свій. Чек-лист — це перелік того, що перевірити, без кроків: широта ідей. Тест-кейс — деталізований сценарій з , кроками й очікуваним результатом. AI добре дає перше (накидати тест-ідеї) і стерпно — друге (розписати кроки за твоїм шаблоном).

    Щоб отримати корисний вивід, годуй модель (test basis) — вимогою, user story, (acceptance criteria), а не просто назвою фічі. Порівняй: «напиши тести на логін» дає банальний ; «ось критерії приймання форми логіну (далі текст) — згенеруй чек-лист позитивних і негативних перевірок, згрупований за полями» дає структурований перелік, який лишається відрев'ювати. Явно проси негативні перевірки й — інакше модель тяжіє до happy path, бо його в навчальних даних більше.

    Що модель дасть добре: широкий перелік категорій (порожні поля, невалідний email, довжина, спецсимволи, блокування після N спроб), охайне форматування, переклад ручних кроків у Given/When/Then. Що доведеться додати самому: перевірки, які випливають зі специфіки саме твого продукту (бізнес-правило «промокод не діє на розпродажні товари» модель не вигадає, бо його немає у вимозі, яку ти не дав). Техніки тест-дизайну — , — детально розібрані в окремому розділі про тест-дизайн; тут важливо лиш, що їх можна й треба називати прямо в промпті (нижче).

    Тестові дані: реалістичні, граничні, масові

    Генерація тестових даних — те, де AI виграє найпомітніше, бо тут потрібна саме варіативність. Розрізняй три типи, бо кожен має свою мету:

    Тип данихМетаПриклад запиту до моделі
    РеалістичніДемо, скріншоти, «схоже на прод»20 користувачів з правдоподібними іменами й адресами
    Граничні (boundary)Зловити баги на межах і виняткахПорожній рядок, 256 символів, unicode, емодзі, '; DROP, від'ємна ціна
    Масові (bulk)Пагінація, продуктивність, ліміти10 000 записів для перевірки списку

    Реалістичні дані краще генерувати не «руками» моделі по одному, а попросити код із бібліотекою на кшталт faker — так дані детерміновані й відтворювані:

    import { faker } from '@faker-js/faker';
    
    // Масові дані: 10 000 користувачів для перевірки пагінації й продуктивності списку
    const users = Array.from({ length: 10_000 }, () => ({
      email: faker.internet.email(),
      name: faker.person.fullName(),
      createdAt: faker.date.past(),
    }));

    Граничні дані — навпаки, найцінніший ручний внесок: попроси модель окремим промптом «дай список підступних значень для текстового поля» й отримаєш готову базу злих рядків. Але двоє застережень. Перше: ніколи не давай моделі справжні персональні дані (PII) чи прод-дані — це витік; генеруй синтетику (детально — у главі про безпеку й приватність цього розділу). Друге: стратегія тестових даних — ізоляція, фабрики, між прогонами — це окрема велика тема (канон — у розділі про стратегію автоматизації); AI тут інструмент генерації, а не заміна стратегії.

    Генерація автотестів

    Найспокусливіше застосування — і найнебезпечніше. AI добре пише boilerplate: скелет Playwright-тесту, структуру , перетворення ручних кроків у код, параметризацію. На чому він гарантовано спотикається — селектори й перевірки, бо DOM твого застосунку він не бачить.

    Ось типовий вивід, який виглядає робочим, а насправді фальшивий:

    // Те, що часто видає AI: селектор вигаданий, перевірка нічого не доводить
    await page.click('#submit-button');              // такого id у застосунку немає
    await expect(page.locator('.result')).toBeVisible(); // «щось видно» — не «замовлення створене»

    Селектор #submit-button модель узяла зі стелі — він статистично ймовірний, але у твоєму застосунку кнопка інша. А toBeVisible() на .result пройде, навіть якщо замовлення не створилось: видимість елемента ≠ правильний результат. Тест зелений, перевірки немає — гірше, ніж якби тесту не було зовсім, бо він створює хибну впевненість.

    Після рев'ю той самий тест має спиратися на реальні, стабільні й перевіряти справжній інваріант:

    // Після доробки: рольовий локатор + перевірка реального результату
    await page.getByRole('button', { name: 'Оформити замовлення' }).click();
    await expect(page.getByText(/Замовлення № \d+ прийнято/)).toBeVisible();

    Пріоритет стабільних локаторів (рольові, getByRole, data-testid замість крихких CSS/XPath) — окрема тема стратегії автоматизації; тут головне правило: селектори з AI-виводу треба звірити з реальним DOM, а не приймати на віру. Механіка перехоплення й перевірки запитів — у главі «Перехоплення й мокання мережі»; структура DOM і селекторів — у главі «DOM, селектори та події».

    Техніки тест-дизайну в промпті й перевірка покриття

    Якість виводу різко зростає, коли ти називаєш техніку прямо в промпті. «Застосуй аналіз граничних значень до поля age з діапазоном 18–65 і випиши 2-точкові межі» дає предметний результат замість загального переліку. Модель знає ці техніки з навчальних даних — їй бракує лише команди застосувати конкретну до конкретного поля. Так само працює «згенеруй таблицю рішень для правил знижки» чи «перелічи переходи станів для кошика».

    Небезпека — у покритті (coverage). Модель залюбки напише «кейси покривають усі критерії приймання», і це твердження часто брехливе: вона його згенерувала, а не порахувала. Покриття перевіряєш ти, зіставляючи згенеровані кейси з вимогами (, RTM — окрема тема тест-дизайну). Практичний прийом: попроси модель віддати вивід таблицею «критерій приймання → кейс, що його перевіряє», і прогалини стануть видимими самі — рядки без кейсу і є непокриті вимоги. Але фінальне рішення «покриття достатнє» лишається за людиною.

    Що AI генерує погано

    Окремо винесу межі — те, де на модель покладатися не можна навіть після хорошого промпта:

    • Реальні селектори застосунку — вигадає, бо не бачить DOM.
    • Тест- (test oracle) — що є правильним результатом. Модель напише перевірку «сторінка завантажилась», але не знає, що після оплати баланс має зменшитись рівно на суму замовлення, якщо ти цього не сказав.
    • Специфічну бізнес-логіку і доменні винятки — правила, яких немає у промпті. Їх треба дати або дописати руками.
    • Справді нові тест-ідеї — модель інтерполює бачене, тож дає типове; несподівані діри у фічі, які й ловить сильний тестувальник, лишаються за нею.
    • Проєктні конвенції — стиль ваших page object, назви методів, структуру репозиторію (якщо їх немає в контексті чи CLAUDE.md).
    • Свіжі факти — API, версії бібліотек, синтаксис після knowledge cutoff моделі; звідси вигадані методи, яких у бібліотеці не існує.

    Це не привід не користуватись — це карта, де тримати руку на пульсі. Глибше про природу цих помилок — у главі «Верифікація результатів AI».

    Типові помилки

    Виглядає як робочий тест, а насправді нічого не перевіряє. Зелений автотест без реальної перевірки: toBeVisible() на випадковому елементі, expect(true).toBe(true), на статус 200 без перевірки тіла. Класика AI-виводу: код є, впевненості він не дає жодної.

    Виглядає як точний локатор, а насправді вигадка. #submit-button, .btn-primary, getByText('Success') — правдоподібні рядки, яких у застосунку немає. Тест упаде на першому ж прогоні або, гірше, знайде не той елемент.

    Виглядає як повне покриття, а насправді дублі. Модель схильна плодити варіації однієї перевірки під різними назвами: «невалідний email», «email без @», «неправильний формат пошти» — це один , а не три кейси. Широта є, унікальності немає.

    Виглядає як усебічний набір, а насправді самий happy path. Без явного запиту на негативні сценарії й edge cases модель тяжіє до happy path. Пів набору «перевірити, що все працює», жодного «перевірити, що ламається правильно».

    Виглядає як факт, а насправді галюцинація. Метод бібліотеки, якого немає; посилання на неіснуючий пункт вимоги; впевнене «за стандартом має бути так». Модель не знає, що не знає.

    Воркфлоу: генерація → рев'ю → доробка

    Правильне використання AI для артефактів — це цикл, а не одна кнопка. Генерація дешева, рев'ю — ні; саме рев'ю лишається твоєю роботою й твоєю відповідальністю.

    Є проблеми

    Чисто

    Тестова основа: вимога, AC,
    техніка, приклад формату

    Генерація чернетки AI

    Рев'ю: селектори реальні?
    перевірки доводять інваріант?
    покриття зіставлене з AC?
    немає дублів і галюцинацій?

    Уточнити промпт
    або доробити руками

    Виконати: тест реально ганяє,
    дані валідні, кейси проходять рев'ю

    Артефакт у репозиторій

    Є проблеми

    Чисто

    Тестова основа: вимога, AC,
    техніка, приклад формату

    Генерація чернетки AI

    Рев'ю: селектори реальні?
    перевірки доводять інваріант?
    покриття зіставлене з AC?
    немає дублів і галюцинацій?

    Уточнити промпт
    або доробити руками

    Виконати: тест реально ганяє,
    дані валідні, кейси проходять рев'ю

    Артефакт у репозиторій

    Три практичні правила циклу. Перше: вклади в промпт більше, ніж просиш назад — тестову основу, техніку, приклад бажаного формату (few-shot); дешевше дати контекст, ніж потім чистити вигадки. Друге: рев'ю за чек-листом, а не «на око» — селектори, реальність перевірок, покриття проти AC, дублі, галюцинації. Третє: виконання — фінальний фільтр: згенерований тест не «готовий», доки реально не прогнався й не показав, що падає з правильної причини. Останнє слово завжди за тобою: підпис під артефактом ставить людина, а не модель.

    Підсумок

    • AI видає чернетку, а не готовий артефакт — модель генерує правдоподібне, істину додаєш ти.
    • Доручай моделі широту й форму (варіанти, boilerplate, форматування), лишай собі правильність і глибину (оракул, бізнес-логіка, реальні селектори).
    • Годуй тестовою основою і назвою техніки в промпті — без цього виходить банальний happy path.
    • Дві найнебезпечніші пастки автотестів: вигадані селектори й зелені перевірки, що нічого не доводять.
    • Покриття, яке заявляє модель, — не факт, а текст: зіставляй кейси з вимогами сам.
    • цикл генерація → рев'ю → доробка → виконання, де рев'ю й відповідальність твої.

    Можливі питання

    • «Як ти використовуєш AI для написання тест-кейсів?» — інтерв'юер перевіряє, чи розумієш ти, що модель дає чернетку. Слабка відповідь: «прошу згенерувати й копіюю». Сильна: «даю вимогу і критерії приймання, називаю техніку, потім рев'юю на покриття, дублі й реалістичність, дороблюю доменні перевірки».
    • «Які проблеми в AI-згенерованих автотестах?» — чекають на вигадані селектори й поверхневі перевірки (зелений тест без асерту). Плюс — якщо назвеш, чому це гірше за відсутність тесту: хибна впевненість.
    • «Модель написала тест — він зелений. Твої дії?» — перевірка на «зелений ≠ правильний». Хочуть почути: подивитись, що саме перевіряється, чи впаде тест, якщо зламати фічу (мутація), чи реальні локатори.
    • «Де AI НЕ можна довіряти в тестуванні?» — оракул, бізнес-логіка, свіжі факти/API, справді нові ідеї, PII у даних. Червоний для інтерв'юера — відповідь «AI усе зробить сам».
    • «Як згенерувати тестові дані для X?» — розрізнення реалістичні/граничні/масові, детермінованість через faker, і застереження про PII/прод-дані.

    Джерела

    Чому AI сильний у чернетках і слабкий у фактах

    • ISTQB CT-GenAI Syllabus v1.1 — механізм і його наслідок в одному місці: модель передбачає наступний токен, а текст виходить статистично правдоподібним — But plausible is not necessarily correct.
    • Google — Machine Learning Glossary — означення генеративної моделі: вміст «складний, звʼязний і оригінальний», слова «правильний» у переліку немає.
    • ISTQB CT-AI Syllabus v2.0 — чому чернетка небезпечна, а не просто неточна: впевнені, але неправильні результати — властивість систем на базі AI.

    Тест-кейси і чек-листи з вимог

    • ISTQB CT-GenAI Syllabus v1.1 — що саме модель генерує з вимог і user story: передумови й входи, очікувані результати й критерії покриття; окремо — розбиття вимог на вимірні тестовані твердження.
    • ISTQB CT-AI Syllabus v2.0 — канонічний воркфлоу «генерація → дебриф»: коректність і повноту виводу оцінюють окремим кроком.
    • Claude Platform Docs — Prompting best practices — чому «напиши тести на логін» дає банальщину: модель не читає думок, тестову основу й обмеження треба подати явно.

    Тестові дані: реалістичні, граничні, масові

    • ISTQB CT-GenAI Syllabus v1.1 — канонічне означення задачі: репрезентативні синтетичні дані, схожі на прод, що зберігають приватність і покривають екстремальні ситуації; сюди ж — задання граничних значень і комбінацій.
    • OWASP Gen AI Security Project — Top 10 for LLM Applications (2025) — чому прод-дані в промпті заборонені: розкриття чутливої інформації як окремий переліку (LLM02:2025).
    • ISTQB CT-AI Syllabus v2.0 — дані як окремий , а не побічний матеріал, і потреба експертного перегляду вибірки.

    Генерація автотестів

    • ISTQB CT-GenAI Syllabus v1.1 — генерація автоматизованих тест-скриптів зі структурованих кейсів, із перекладом кроків у код під фреймворк.
    • Playwright — Writing tests — чому toBeVisible() на випадковому елементі не є перевіркою: тест виконує дії й стверджує стан проти очікувань.
    • Playwright — Locators — пріоритет user-facing атрибутів і ролей, і пряме CSS and XPath are not recommended, бо DOM часто змінюється.
    • Playwright — Best Practices — той самий орієнтир стійкості з боку офіційних рекомендацій, проти якого рев'юють згенерований тест.

    Техніки тест-дизайну в промпті й перевірка покриття

    • ISTQB CT-GenAI Syllabus v1.1 — обидві задачі канонічні: запропонувати техніку (аналіз граничних значень, класи еквівалентності) і підтримати аналіз покриття зіставленням вимог із .
    • ISTQB CT-AI Syllabus v2.0 — навчальна вправа саме на це: генерація кейсів за 2- і 3-точковим аналізом граничних значень із подальшою оцінкою повноти.
    • Claude Platform Docs — Prompting best practices — приклади як найнадійніший спосіб керувати форматом і структурою виводу, зокрема таблицею.

    Що AI генерує погано

    • ISTQB CT-GenAI Syllabus v1.1 — три різні класи дефектів виводу: галюцинації, й упередження, і як кожен проявляється в тестових артефактах.
    • ISTQB CT-AI Syllabus v2.0 — проблема тест-оракула: чітко визначити очікуваний результат буває важко або неможливо, і це вимагає експертного судження.
    • Lewis et al. — Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (arXiv:2005.11401) — чому «свіжі факти» проблемні: доступ до знання, що лежить у параметрах, обмежений, а оновлення його — відкрите питання.
    • Claude Code Docs — How Claude remembers your project (Memory) — де живуть проєктні конвенції, щоб модель їх не вигадувала: факти, які мають діяти в кожній сесії.

    Воркфлоу: генерація → рев'ю → доробка

    • ISTQB CT-GenAI Syllabus v1.1 — гейт на вивід із модальністю MUST і пропорційно ризику, а людська оцінка названа необхідною для якості згенерованого.
    • Claude Code Docs — Best practices for Claude Code — чим саме буває перевірка (, лінтер, скрипт-дифф проти ) і правило «немає перевірки — не віддавай».
    • Claude Platform Docs — Prompting best practices — «вклади в промпт більше, ніж просиш назад»: приклади й пояснений контекст дають моделі орієнтир, з якого вона генералізує.

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.