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

    14 · AI для QA

    Промптинг для QA

    Зміст

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

    Промпт варто читати не як «запит у чат», а як технічне завдання виконавцю, який нічого не знає про ваш проєкт. Виконавець швидкий, ерудований і слухняний, але без контексту він домислює, а домисли LLM — це часто впевнено сформульована вигадка. Тому питання на співбесідах уже не «чи користуєтесь AI», а «покажіть промпт, яким ви генеруєте тест-кейси, і поясніть, чому він саме такий». Ця глава — про те, з чого промпт складається і які важелі реально впливають на якість виводу. Механіку того, чому модель узагалі реагує на приклади й формулювання, розібрано в главі «Як працюють LLM».

    Анатомія промпта

    Сильний промпт майже завжди має впізнавану структуру. Це не бюрократія — кожен блок закриває конкретний спосіб, яким модель може «промахнутися».

    • Роль і контекст — хто модель у цій задачі й що вона має знати про проєкт: стек, домен, конвенції. Модель не знає, що у вас Playwright на TypeScript і що severity ви ставите за вашою внутрішньою шкалою, доки ви не скажете.
    • Задача — одна чітка ціль, сформульована дієсловом: «згенеруй», «проаналізуй», «знайди суперечності». Дві незалежні задачі в одному промпті — привід розбити на два.
    • Вхідні дані — вимога, user story, шматок коду, лог. Їх варто відокремлювати від інструкцій — трьома бектиками або тегами-обгортками (<requirements>...</requirements>), щоб модель не сплутала дані з командами. Це заодно перший бар'єр проти prompt injection (див. нижче).
    • Обмеження й правила — що робити не можна: не вигадувати селектори, спиратися лише на надані вимоги, покрити класи еквівалентності й межі, не дублювати кейси.
    • Формат виводу — таблиця, JSON, Gherkin, Markdown-чеклист. Без цього модель обере формат сама, і він рідко збігається з тим, що ви очікуєте імпортувати в TMS.
    • Приклади — один-два зразки «вхід → бажаний вихід». Найсильніший важіль форми й стилю (про це — далі).

    Роль і контекст

    Промпт

    Задача

    Вхідні дані
    відокремлені

    Обмеження й правила

    Формат виводу

    Приклади

    Модель

    Вивід

    Роль і контекст

    Промпт

    Задача

    Вхідні дані
    відокремлені

    Обмеження й правила

    Формат виводу

    Приклади

    Модель

    Вивід

    Не кожна задача потребує всіх шести блоків. Але коли вивід розчаровує, діагностика починається саме з цього списку: якого блоку бракує? Порожній результат майже завжди означає, що бракує вхідних даних або критеріїв «що вважати хорошим кейсом».

    Zero-shot і few-shot

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

    Few-shot — це промпт, у який ви вклали кілька зразків «вхід → вихід». Модель підхоплює патерн: формат, рівень деталізації, стиль назв, тон. Термін закріпився за статтею про GPT-3 «Language Models are Few-Shot Learners» — модель навчається патерну прямо з прикладів у промпті, без донавчання ваг (це називають in-context learning). One-shot — окремий випадок з одним прикладом.

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

    Формат тест-кейсу — як у прикладі нижче.
    
    Приклад:
    Вхід: Поле "Email" обов'язкове.
    Вихід:
    - Назва: Форма відхиляє відправлення з порожнім email
      Кроки: 1) лишити email порожнім 2) натиснути "Зареєструватися"
      Очікуваний результат: помилка валідації, форма не відправлена
    
    Тепер згенеруй кейси для вимоги:
    Вхід: Пароль — від 8 до 64 символів.

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

    Chain-of-thought: міркування вголос

    Chain-of-thought (CoT, ланцюжок міркувань) — це прийом, коли ви просите модель спершу міркувати покроково, а вже потім давати відповідь. Ідею описано у статті Wei та ін. (2022): для задач із кількома логічними кроками проміжні міркування помітно підвищують якість відповіді, бо модель «розкладає» задачу, а не намагається вгадати підсумок одразу.

    Для QA це природно лягає на декомпозицію. Замість «згенеруй тести для поля віку» — «спершу визнач класи еквівалентності, потім граничні значення для кожного класу, потім склади з них тест-кейси». Модель проходить ті самі кроки, що й тестувальник, і рідше пропускає межу.

    Два важливі уточнення, які й перевіряють на співбесіді:

    • Сучасні моделі з режимом міркування (reasoning) роблять цей крок усередині, тож явне «think step by step» їм потрібне рідше. Але структурувати саму задачу на етапи все одно корисно — це різні речі.
    • Текст міркувань — це правдоподібне пояснення, а не доказ правильності. Модель може написати логічний ланцюжок і все одно дійти хибного висновку (або, навпаки, дати правильну відповідь із кривим поясненням). CoT покращує середню якість, але не звільняє від перевірки — див. главу «Верифікація результатів AI».

    Роль і персона

    Призначення ролі — «ти досвідчений QA-інженер, який спеціалізується на API-тестуванні» — зміщує словник і рамку відповіді: модель частіше говорить про статус-коди, схеми, ідемпотентність, а не загальними словами. Це справжній, але обмежений важіль.

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

    Структурований вивід

    QA рідко потрібен «текст для читання» — частіше вивід кудись їде далі: імпорт у TMS, вставка в код, крок у пайплайні. Тому формат треба задавати явно: таблиця з фіксованими колонками, Markdown-чеклист, Gherkin, JSON із конкретними полями.

    Є два рівні контролю формату:

    1. Проханням у промпті — «поверни JSON-масив об'єктів із полями title, steps, expected». Просто, працює для більшості задач, але модель може порушити формат на довгому виводі (загубити кому, додати пояснення до JSON).
    2. Гарантованою схемою на рівні API — structured output / function calling, де модель зобов'язана віддати вивід за JSON-схемою. Це надійніше для інтеграцій; механіку розбираємо в главі «Tool use і function calling».

    Ключове правило: навіть заданий формат треба валідувати. Не «довіряй, що JSON валідний», а розпарси й перевір поля — інакше зламаний вивід тихо потрапить у пайплайн.

    // Мінімальна валідація структурованого виводу перед використанням
    type TestCase = { title: string; steps: string[]; expected: string };
    
    function parseTestCases(raw: string): TestCase[] {
      const data = JSON.parse(raw); // кине помилку на битому JSON — і добре
      if (!Array.isArray(data)) throw new Error("Очікувався масив кейсів");
      for (const tc of data) {
        if (!tc.title || !Array.isArray(tc.steps) || !tc.expected) {
          throw new Error(`Неповний кейс: ${JSON.stringify(tc)}`);
        }
      }
      return data;
    }

    Ітеративне уточнення

    Промптинг — це діалог, а не постріл наосліп. Рідко коли перший промпт дає ідеальний результат; нормальний робочий цикл — отримати чернетку, вказати на конкретну ваду, попросити доробити.

    Ні

    Так

    Промпт

    Вивід

    Достатньо?

    Вказати конкретну ваду:
    додай негативні кейси,
    що ти пропустив?

    Прийняти й зберегти
    робочий промпт

    Ні

    Так

    Промпт

    Вивід

    Достатньо?

    Вказати конкретну ваду:
    додай негативні кейси,
    що ти пропустив?

    Прийняти й зберегти
    робочий промпт

    Уточнення працює краще, коли воно адресне: не «зроби краще», а «додай перевірки на порожні значення й unicode», «ти пропустив верхню межу 64 символи», «прибери дубль кейсів 3 і 5». Корисний окремий хід — попросити модель самокритику: «які сценарії ти не покрив?».

    Дві пастки ітерації. По-перше, контекст накопичується, і після десятка правок модель починає «дрейфувати» — тягнути старі рішення. Іноді дешевше не воювати правками, а переписати промпт з нуля, вклавши в нього все, чого навчився діалог. По-друге, довгий брудний контекст сам по собі знижує якість — про деградацію на довгому вікні див. главу «Токени, контекст і вартість».

    І головне: вдалий промпт — це артефакт. Формат кейсів, правила, приклади, які спрацювали, варто зберегти й перевикористовувати, а не вигадувати щоразу. Як зафіксувати такі правила на рівні проєкту (файли на кшталт CLAUDE.md, скіли, слеш-команди) — тема глави «Пам'ять, скіли та слеш-команди».

    Промпти для типових QA-задач

    Складаючи докупи все вище, ось патерни, які покривають більшість щоденних задач. Глибоко генерацію артефактів розбирає окрема глава «Генерація тест-артефактів» — тут лише каркас промптів.

    • Тест-кейси з вимоги — вхід: текст вимоги (відокремлений); правила: покрити класи еквівалентності, межі, негативні сценарії; формат: таблиця чи JSON; приклад одного кейсу для стилю.
    • Тестові дані — «згенеруй крайові й невалідні значення для поля X»: порожнє, пробіли, максимальна довжина, unicode, спецсимволи, ін'єкційні payload як smoke. Техніки тест-дизайну (класи еквівалентності, граничні значення) — окремий розділ теорії, на них варто прямо посилатися в промпті.
    • Аналіз вимог — «знайди суперечності, прогалини й неоднозначності в цій user story; що треба уточнити в аналітика?». Тут CoT особливо корисний.
    • Розбір падіння — вхід: лог/трейс/повідомлення помилки; задача: назвати ймовірну причину й де копати. Пам'ятайте, що модель дає гіпотезу, а не діагноз.
    • Локатор чи сніпет — «дай стабільний Playwright-локатор для цієї кнопки за наданим HTML; пріоритет getByRole/getByTestId». Обов'язково перевіряйте: модель охоче вигадує селектори, яких у розмітці немає.

    Компактний шаблон сильного QA-промпта:

    Роль: senior QA, стек Playwright + TypeScript.
    Задача: згенерувати тест-кейси для вимоги нижче.
    Вимога:
    <requirements>
    Пароль: 8–64 символи, мінімум одна цифра.
    </requirements>
    Правила: покрий класи еквівалентності та граничні значення;
    додай негативні сценарії; спирайся лише на вимогу, не вигадуй полів.
    Формат: JSON-масив об'єктів {title, steps, expected}.

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

    • Виглядає як «модель лінива», а насправді — бракує вхідних даних. Порожній чи банальний вивід на «напиши тести» — це не впертість моделі, а відсутність вимоги, контексту й критеріїв. Виконавцю не дали ТЗ.
    • Виглядає як промптинг, а насправді — роздача титулів. «Ти геніальний тестувальник» замість конкретної інструкції нічого не додає. Персона задає перспективу, а не знання.
    • Звучить упевнено — отже, правда. Ні. Модель однаково впевнено формулює і факт, і галюцинацію (вигаданий метод, неіснуючий селектор, вигадану вимогу). Впевнений тон — не сигнал достовірності.
    • CoT написав логічний ланцюжок — отже, відповідь правильна. Міркування — це раціоналізація, а не доказ. Перевіряти треба висновок, а не милуватися ходом думки.
    • Один гігантський промпт «на все». Три задачі, суперечливі правила й мегапортянка контексту в одному запиті — модель губиться й на довжині, і на конфлікті інструкцій. Дробіть.
    • Попросив формат — і довірився. Заданий JSON ≠ валідний JSON. Без розбору й перевірки полів зламаний вивід тихо просочиться далі.
    • Вставив неперевірений текст у промпт. Лог, тікет чи сторінка, які ви кладете у промпт як дані, можуть містити інструкції для моделі (prompt injection). Тому дані відокремлюють від інструкцій; ризик докладно — у главі «Безпека й приватність при роботі з AI».

    Підсумок

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

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

    • «Покажіть промпт, яким ви генеруєте тест-кейси». Інтерв'юер дивиться, чи є в промпті структура: контекст, відокремлені вхідні дані, правила (техніки тест-дизайну!), формат виводу, приклад. Промпт «напиши тести» — червоний прапорець.
    • «Чим few-shot відрізняється від zero-shot і коли що?» Хочуть почути, що приклади задають патерн формату/стилю, і що починають зазвичай із zero-shot, а приклади додають, коли треба вирівняти форму.
    • «Що таке chain-of-thought і чи гарантує він правильність?» Правильна відповідь — покрокове міркування допомагає на складних задачах, але це не доказ; результат перевіряють окремо.
    • «Модель дала впевнену відповідь — ви їй довіряєте?» Перевірка на зрілість: впевнений тон не корелює з достовірністю; галюцинації звучать так само переконливо.
    • «Як ви контролюєте, щоб вивід був у потрібному форматі?» Очікують: задаю формат явно (краще — схемою), і обов'язково валідую результат перед використанням.

    Джерела

    • Brown та ін. «Language Models are Few-Shot Learners» (2020) — arxiv.org/abs/2005.14165. Канонічне джерело few-shot-промптингу та in-context learning для LLM.
    • Wei та ін. «Chain-of-Thought Prompting Elicits Reasoning in Large Language Models» (2022) — arxiv.org/abs/2201.11903.
    • Anthropic, Prompt engineering — docs.anthropic.com.
    • OpenAI, Prompt engineering guide — platform.openai.com/docs/guides/prompt-engineering.
    • ISTQB Certified Tester AI Testing (CT-AI) — istqb.org — суміжний силабус про тестування AI-систем (не про промптинг як такий); CTFL 4.0 промптингу не покриває.