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-тесту, структуру page object, перетворення ручних кроків у код, параметризацію. На чому він гарантовано спотикається — селектори й перевірки, бо 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. Без явного запиту на негативні й крайові сценарії модель тяжіє до щасливого шляху. Пів набору «перевірити, що все працює», жодного «перевірити, що ламається правильно».

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

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

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

    Є проблеми

    Чисто

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

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

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

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

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

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

    Є проблеми

    Чисто

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

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

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

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

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

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

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

    Підсумок

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

    Що питають на співбесіді

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

    Джерела

    • ISTQB Certified Tester Foundation Level (CTFL 4.0) — розділ 4 «Test Analysis and Design» і поняття тест-артефактів; фундамент, проти якого рев'юється будь-який згенерований кейс.
    • ISTQB Certified Tester — AI Testing (CT-AI) — окремий силабус про тестування з AI і тестування AI-систем.
    • Playwright — Best Practices — офіційні рекомендації щодо стабільних тестів і того, як мають виглядати перевірки.
    • Playwright — Locators — пріоритет рольових і user-facing локаторів; еталон, з яким звіряєш селектори з AI-виводу.