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

    07 · Інструменти автоматизації

    Паралельний запуск: workers, шардінг, браузерні ферми

    Зміст

    росте лінійно, а терпіння команди — ні. Шістсот тестів по чотири секунди — це сорок хвилин чекання перед кожним , і першою реакцією завжди буває «а давайте паралельно». Далі одне з двох: або прогін стискається до пʼяти хвилин, або половина тестів червоніє, конфіг відкочують і роблять висновок «нам паралельність не підходить». Різниця лежить не в конфігу: паралельний запуск нічого не ламає — він перестає приховувати те, що тести й так залежали один від одного.

    Цю главу можна пропустити при першому проході: щоб писати тести, вона не потрібна. Але саме тут закінчуються питання «чому в паралелі падає, а по одному зелене». Навіщо паралелити взагалі, економіка CI-хвилин і політика — теми розділів про автоматизацію та CI/CD; тут — механіка інструмента: що він запускає одночасно, де межа однієї машини і де починається чужа інфраструктура.

    Три стелі, які легко змішати

    Слово «паралельно» покриває три різні речі, і плутанина між ними — головна причина того, що прискорення не настає.

    • (worker) — те, що масштабує прогін у межах однієї машини: окремий процес зі своїм браузером (у частині — потік, про це нижче).
    • (sharding) — розбиття сюїти на частини, які розкладаються між машинами: кожен шард виконується на своїй машині й поводиться як окрема CI, незалежна від інших.
    • (browser farm) — чужі браузери, доступні тесту по мережі. Вона не розкладає тести, а відповідає на питання, де саме цим воркерам і шардам узяти браузер.

    Стелі рахуються окремо й не підмінюють одна одну, тож «додати шардів» без ємності ферми не прискорює нічого. Поділ не специфічний для одного інструмента: у CodeceptJS два вбудовані способи описані буквально як воркери в межах одного ранера і шардінг файлів між машинами CI в матричному .

    Машина CI №2 — шард 2/3

    Машина CI №1 — шард 1/3

    воркер 1
    процес + браузер

    воркер 2
    процес + браузер

    воркер 1

    воркер 2

    Браузерна ферма:
    квота паралельних сеансів

    Машина CI №2 — шард 2/3

    Машина CI №1 — шард 1/3

    воркер 1
    процес + браузер

    воркер 2
    процес + браузер

    воркер 1

    воркер 2

    Браузерна ферма:
    квота паралельних сеансів

    Воркер — процес операційної системи

    Найважливіше про воркер сказано в доці одним рядком: це процеси ОС, які працюють незалежно, під керуванням ранера, і кожен запускає власний браузер. З цього випливає все інше.

    Спільного стану немає: ані глобальних змінних, ані обміну повідомленнями — комунікація між воркерами прямо названа неможливою. Тому «передам id замовлення через змінну модуля» працює рівно доти, доки обидва тести випадково опиняються в одному воркері.

    Одиниця паралельності за замовчуванням — файл, а не тест. Файли йдуть паралельно, а тести всередині файла — по черзі, в одному воркері, поки цього явно не змінили. Ранер ще й перевикористовує воркер настільки, наскільки може, тож кілька файлів зазвичай проходять в одному процесі один за одним.

    Деталь, яка економить години дебагу: після падіння тесту воркер гарантовано вбивають, щоб наступні стартували в чистому оточенні. Зіпсований стан браузера за межі впалого тесту не тече — а от зіпсовані дані в базі течуть, і це вже не проблема ранера.

    Вимкнути паралельність окремим прапорцем не можна — її вимикають обмеженням до одного воркера:

    // playwright.config.ts
    export default defineConfig({
      workers: 1, // або --workers=1 у командному рядку
    });

    Воркер не обовʼязково процес. У CodeceptJS run-workers піднімає потоки, кожен — незалежний екземпляр інструмента зі своїм зрізом сюїти; результати потім зливаються. Побічний наслідок названий прямо: покрокового виводу в у цьому режимі немає взагалі — вивід окремих потоків неможливо чисто переплести. Той самий інструмент дає й вибір стратегії розкладки: test (кожен тест закріплено за воркером наперед — коли тести приблизно однакові за часом), suite (сюїта не розривається — коли є спільний BeforeSuite) і pool (воркери беруть наступний тест зі спільної черги — коли тривалості різні, найкраще балансування).

    Звідси перше питання про будь-який ранер: воркер тут процес чи потік, і хто вирішує, який тест кому дістанеться.

    Воркерні фікстури: що живе довше за тест

    Якщо воркер — довгий процес, у нього зʼявляється власний життєвий цикл, і (fixture) можна привʼязати саме до нього. Різниця проста: тестова фікстура прибирається після кожного тесту, воркерна — лише коли завершується сам воркер.

    import { test as base } from '@playwright/test';
    
    export const test = base.extend<{}, { apiToken: string }>({
      apiToken: [async ({}, use) => {
        const token = await issueServiceToken(); // дорого, але один раз на воркер
        await use(token);
      }, { scope: 'worker' }],
    });

    Дві деталі легко проґавити. Воркер перевикористовується для наступних файлів лише поки воркерні фікстури збігаються — щедра параметризація воркерного скоупу непомітно множить перезапуски процесу, і виграш на дорогому setup віддається на старти браузера. А сама воркерна фікстура має власний , рівний дефолтному таймауту тесту: підняття сервісу, що чесно займає хвилину, впаде не як «повільний тест», а як фікстура.

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

    Фікстури тут не косметика над хуками: вони дають інкапсуляцію setup і teardown в одному місці, між файлами і роботу on-demand. Канон автоматизації звʼязує їх із двома властивостями тесту прямо: повторюваністю й атомарністю. Детально — у главі про фікстури, хуки й конфігурацію.

    fullyParallel і serial: два кроки в протилежні боки

    Дефолт (файл як одиниця) — компроміс. Обидві опції зсувають його, і в різні боки.

    fullyParallel: true знімає послідовність усередині файла: тести розкладаються поштучно. Наслідок, про який часто дізнаються з падінь: у повністю паралельному режимі beforeAll і afterAll виконуються для кожного тесту окремо. Логін у beforeAll, який економив час, раптом виконується не раз на файл, а раз на тест — і прогін не швидшає, а сповільнюється.

    Протилежний зсув — послідовний режим. Він потрібен, коли тести справді залежні, і дока прямо називає його не рекомендованим, з двома точно названими наслідками: якщо один тест групи впав, усі наступні пропускаються, а ретрай іде на всю групу.

    test.describe.configure({ mode: 'serial' });
    // ...або mode: 'parallel' — щоб розпаралелити один конкретний файл

    Ось чому «позначили serial — стабілізували» це не стабілізація, а обмін: пʼять незалежних тестів перетворюються на один довгий блок, який падає цілком і ретраїться цілком. Правильний висновок дока формулює за вас: краще зробити тести ізольованими, щоб вони виконувалися незалежно.

    --shard: розкладка між машинами CI

    Шардінг вмикається одним прапорцем --shard=x/y — і саме тому його недооцінюють. Обмеження назване прямо: шардяться лише ті тести, які можна виконувати паралельно, а за замовчуванням це означає файли. Звідси головна практична різниця:

    ГранулярністьКолиЩо з рівністю шардів
    Файлова (дефолт)без fullyParallelшард дістає цілі файли; нерівні за розміром файли дають нерівні шарди — один виконає значно більше тестів, інший менше або жодного
    ТестоваfullyParallel: trueрозподіл поштучно, кожен шард намагається взяти однакову кількість тестів

    Рецепт джерела рівно з двох варіантів: або fullyParallel: true, або дрібні й приблизно рівні файли. Третього — «розкладати за історією таймінгів» — офіційна дока не обіцяє.

    Друге, про що дізнаються post factum: кожен шард дає власний звіт. Єдиного звіту шардінг сам по собі не робить — його отримують злиттям blob-звітів, які несуть і вкладення (, діфи ) і є проміжним форматом, з якого роблять будь-який інший. Детальніше — у главі про дебаг, trace viewer і репортинг.

    Третє — взаємодія з проєктами (project) у конфігурації. Будь-яка фільтрація, зокрема за шардом, вибирає лише основні тести, а тести залежностей підтягуються самі, тож шард на CI не лишається без підготовки: setup-проєкт із логіном відпрацює в кожному шарді. Дзеркальний бік: якщо тести залежності впали, залежні не запускаються взагалі — шард устигає виконати хіба жменьку setup-тестів, тож у його звіті дивляться не лише на падіння, а й на кількість виконаних тестів.

    Про стелю прискорення. (Amdahl's law) обмежує прискорення задачі при додаванні ресурсів: навіть з нескінченною кількістю процесорів воно впирається в непаралелізовану частку, і якщо паралелиться половина роботи, максимум — ×2, а якщо 95% — ×20. Формально це закон про обчислення, а не про сюїту, тож на прогін його переносять як орієнтир: serial-групи, спільна підготовка й перед прогоном — той знаменник, який жодною кількістю машин не скорочується.

    Ферма: чужі браузери по мережі

    Ферма виглядає як магія: той самий тест раптом виконується на машині в іншій країні, і код не змінився. Магії немає, є вимога специфікації. Протокол WebDriver описує ланцюг вузлів поіменно — local end (мовна бібліотека), intermediary node (, що реалізує обидва боки протоколу) і endpoint node (реалізований самим браузером), — тобто проміжний вузол тут законна частина моделі, а не милиця. І далі стоїть вимога, з якої все й працює: усі типи віддалених вузлів мусять бути невідрізнимими як чорна скринька з погляду клієнта. Саме тому переїзд у хмару постачальник ферми описує у власній довідці як зміну адреси хабу й креденшелів, а не переписування тестів.

    Свій Selenium Grid. Selenium Grid — набір компонентів, а не монолітний сервер, і той самий функціонал розгортається трьома способами: усе в одному процесі (standalone), хаб із вузлами, повністю розподілено. Найпростіший режим дає повноцінний парк однією командою, але виконується тільки на одній машині. Головний мотив багатомашинного режиму дока називає не швидкістю, а комбінацією середовищ: різні ОС і версії браузерів в одному парку. Далі — числа, які й роблять розмову про ємність предметною:

    • Стеля паралельності вузла — кількість CPU: вісім ядер означають до восьми одночасних сеансів, з окремим винятком для Safari, у якого сеанс завжди один. На кожен сеанс закладається близько 1 ГБ памʼяті.
    • Рекомендація — дробити вузли, а не вирощувати один великий: тридцять два маленькі краще за один на 32 ядра, бо падіння вузла лишається локальним. Docker названо інструментом такого дроблення. Самі розміри парку дока подає як орієнтири, прямо кажучи, що одного розміру на всіх немає.
    • Парк треба закрити фаєрволом: відкритий доступ дока кваліфікує як , а не як зручність.

    Хмарна ферма. Тут купують не швидкість, а відсутність власного заліза. LambdaTest (сторінка довідки тепер підписана TestMu AI) описує пакет так: адреса хабу плюс capabilities, а в комплекті — паралельне виконання, відео, логи й скріншоти на кожен сеанс, без інфраструктури для обслуговування; заявлений масштаб — «3000+ комбінацій браузерів, реальних пристроїв і ОС». І формулювання, і число — заява постачальника станом на 2026-07-29 (дата забору сторінки), а не незалежно перевірена цифра.

    Реальні пристрої. Коли в матриці зʼявляються мобільні, ферма перестає бути про браузери й стає про залізо. Межу MDN формулює чітко: найбільшу точність дає реальний пристрій, і мінімальний device lab починається з фізичних апаратів — Mac, Windows-ПК, телефон і планшет на Android, телефон і планшет на iOS, плюс пара слабких (продуктивність перевіряють не на флагмані). Комерційні сервіси — MDN називає Sauce Labs і BrowserStack — забирають цю інфраструктуру на себе. А симуляція в DevTools це наближення першого порядку: код виконується на вашій машині, і архітектуру мобільних процесорів режим пристрою не змоделює ніколи. Сама матриця — тема глави про кросбраузерність і адаптивну верстку.

    І головне: ферма й шардінг — різні осі. Якщо шарди простоюють у черзі, упирається не і не конфіг ранера, а ліміт паралельних сеансів.

    Ні

    Так

    Ні

    Так

    Так

    Ні

    Прогін довший, ніж хочеться

    Ядра машини завантажені?

    Замало воркерів, або одиниця
    розкладки — файл, а не тест

    Шарди закінчують приблизно разом?

    Нерівні файли: fullyParallel
    або дрібніші рівні файли

    Шарди чекають на браузер?

    Стеля — квота паралельних
    сеансів у фермі

    Стеля — найдовший неподільний
    блок і послідовна частина

    Ні

    Так

    Ні

    Так

    Так

    Ні

    Прогін довший, ніж хочеться

    Ядра машини завантажені?

    Замало воркерів, або одиниця
    розкладки — файл, а не тест

    Шарди закінчують приблизно разом?

    Нерівні файли: fullyParallel
    або дрібніші рівні файли

    Шарди чекають на браузер?

    Стеля — квота паралельних
    сеансів у фермі

    Стеля — найдовший неподільний
    блок і послідовна частина

    Вимоги до тестів: ізоляція — передумова, не гігієна

    Усе вище працює за однієї умови, і вона про самі тести. Ізоляція (isolation) знімає питання порядку виконання — саме тому вона й робить паралельність і шардінг можливими. Формулювання доки не залишає місця для компромісу: кожен тест має бути повністю ізольований і виконуватися незалежно — з власними localStorage, sessionStorage, даними й кукі. Три названі наслідки: падіння не переноситься, дебажити легше (тест можна ганяти окремо скільки завгодно) і не треба думати про порядок у паралельному прогоні та шардінгу.

    Дві стратегії ізоляції нерівноцінні: починати з нуля або прибирати між тестами. Про легко забути, а дещо прибрати взагалі неможливо — приклад доки, «відвідані посилання», хороший саме тим, що не лікується жодним afterEach. На рівні браузера задачу закриває свіжий (browser context) — глава про архітектуру, браузери й контексти, — а дорогий логін виносять у (storage state) і setup-проєкт (глава про автентифікацію й повторне використання стану). Канон незалежності тестів як принципу — глава про анатомію автотесту; тут — його механіка в паралельному прогоні.

    Реальні порушення живуть не в браузері, а в даних. Канонічний виклад дає точну межу: паралельні прогони над спільним станом (Test Run War) можливі тільки за глобально спільної фікстури, до якої різні тести звертаються і яку іноді змінюють; спільним станом може бути файл або записи в тестовій базі. Тому перед вмиканням паралельності питання ставиться не «скільки воркерів», а «що в нас глобально спільне»: акаунт, промокод, черга, файл, рядок у довіднику. Ознака теж названа: тест, який сам по собі зелений, падає, коли до сюїти додали або з неї прибрали інший. Лікування джерело формулює як усунення , а не симптому — свіжа фікстура на кожен тест.

    Останній аргумент — з боку канону автоматизації: вона дає тести, які неможливо виконати вручну, і паралельне виконання названо серед прикладів. Тобто це не оптимізація прогону, а окрема здатність, за яку платять дисципліною ізоляції.

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

    • «Поставили вісім воркерів — половина сюїти червона, паралельність нам не підходить» — виглядає як обмеження інструмента, а насправді прогін залежність не створив, а виявив: антипатерн Test Run War можливий лише за глобально спільної фікстури, яку тести змінюють.
    • «Тест зелений, коли ганяю його окремо» — виглядає як середовища, а насправді це маркер тестів, що взаємодіють: падати починає саме тоді, коли в сюїту додали або з неї прибрали інший.
    • «Позначили групу як serial і стабілізували» — виглядає як лікування, а насправді обмін: падіння одного тесту тепер пропускає всі наступні, а ретрай іде на всю групу; дока цей режим не рекомендує.
    • «Увімкнули fullyParallel — прогін сповільнився» — виглядає як парадокс, а насправді в цьому режимі beforeAll виконується для кожного тесту, і логін із хука робиться не раз на файл, а раз на тест.
    • «Додали шардів — швидше не стало» — виглядає як проблема пайплайну, а насправді або шарди чекають на браузер (стеля — квота сеансів), або файли нерівні й один шард дістав більшість тестів, а інший — жодного.
    • «Шардували прогін — отримали пʼять звітів замість одного» — виглядає як поломка, а насправді єдиний звіт це окремий крок злиття blob-звітів, а не побічний ефект шардінгу.
    • «Виніс усе дороге у воркерну фікстуру» — виглядає як оптимізація, а насправді воркер перевикористовується далі лише поки воркерні фікстури збігаються, а змінюваний стан у цьому скоупі — та сама спільна фікстура.
    • «Візьмемо одну потужну машину на 32 ядра, сітку підняли — готово» — виглядає як економія й завершена інфраструктура, а насправді дока радить протилежне (маленькі вузли ізолюють процеси) і окремо вимагає закрити доступ фаєрволом.
    • «Прогнали мобільну матрицю в емуляції — покриття є» — виглядає як , а насправді симуляція пристрою це наближення першого порядку: код виконується на вашій машині, і архітектуру мобільного процесора вона не змоделює.

    Підсумок

    • Три стелі рахуються окремо: воркери — у межах машини, шарди — між машинами, сеанси — у фермі. «Більше шардів» без ємності ферми не прискорює нічого.
    • Воркер — процес ОС з власним браузером і без спільного стану; одиниця паралельності за замовчуванням — файл, і після падіння воркер убивають.
    • Гранулярність розкладки визначає рівність шардів: fullyParallel розкладає поштучно, дефолт — файлами, а нерівні файли дають шард без жодного тесту.
    • serial — не стабілізація, а обмін: група пропускається після першого падіння і ретраїться цілком; дока прямо не рекомендує цей режим.
    • Ізоляція — передумова, а не гігієна: без неї паралельності немає, а Test Run War можливий лише за глобально спільної фікстури — і лікується усуненням передумови, а не старанним прибиранням.

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

    • «Чим шардінг відрізняється від паралельного запуску?» — типове формулювання теми, і воно про межу «машина проти процесу». Сильна відповідь називає воркер процесом у межах машини, шард — окремою незалежною джобою між машинами, і додає третій рівень: ємність ферми, яку ці джоби ділять.
    • «Скільки воркерів поставите і чому?» — інтервʼюер дивиться, чи є модель ресурсу, а не число. Виграшна логіка: ємність рахується в ядрах і памʼяті (у сітці Selenium це прямо CPU і близько 1 ГБ на сеанс), а не в тестах, і Safari тут окремий випадок.
    • «Тести падають у паралелі, по одному зелені — що робиш?» — чекають не «поставлю retries», а метод: спершу «що в нас глобально спільне», далі маркер «зелений сам, падає в сюїті», далі свіжа фікстура. Згадка serial припустима лише з називанням ціни.
    • «Що таке worker-scoped фікстура і коли вона доречна?» — розводять скоупи (тестова прибирається після тесту, воркерна — після воркера) і називають критерій: незмінне й дороге — воркерне, усе, що змінює стан — тестове.
    • «Навіщо ферма, якщо є CI-агенти?» — відповідь про комбінацію середовищ, а не про швидкість: різні ОС і версії браузерів в одній сітці, реальні пристрої там, де емуляція не годиться. Сильний кандидат додасть, що специфікація вимагає невідрізнимості віддаленого вузла, тому код тесту не змінюється.
    • «Як зібрати один звіт із шардованого прогону?» — перевіряють досвід реального CI: кожен шард дає власний звіт, єдиний отримують злиттям blob-звітів, і саме blob несе вкладення на кшталт трейсів і діфів скріншотів.

    Джерела

    Три стелі, які легко змішати

    • Playwright — Parallelism — воркер як процес ОС і одиниця масштабування в межах машини.
    • Playwright — Sharding — шард як окрема незалежна джоба CI, поділ «у межах машини проти між машинами».
    • CodeceptJS — Parallel Execution — той самий поділ у другому інструменті: воркери на одному ранері, шардінг між машинами матричного білда.
    • Selenium — Grid: Getting Started — ємність віддалених вузлів як окрема межа масштабування.

    Воркер — процес операційної системи

    • Playwright — Parallelism — воркери як процеси ОС із власним браузером, відсутність спільного стану й комунікації, файл як одиниця паралельності, перевикористання воркера, вбивство воркера після падіння, workers: 1 як єдиний спосіб вимкнути паралельність.
    • CodeceptJS — Parallel Execution — воркер як потік із незалежним екземпляром інструмента, відсутність покрокового виводу, три стратегії розкладки з умовами застосування.

    Воркерні фікстури: що живе довше за тест

    • Playwright — Test fixtures — скоупи test і worker, прибирання воркерної фікстури разом із воркером, перевикористання воркера лише за збігу воркерних фікстур, власний таймаут воркерної фікстури, три властивості фікстур проти хуків.
    • ISTQB® Certified Tester Advanced Level Test Automation Engineering (CTAL-TAE) v2.0 — §4.2: фікстури дають контроль над оточенням і даними та роблять тести повторюваними й атомарними.
    • xUnit Test Patterns — Erratic Test — спільна фікстура як причина тестів, що взаємодіють між собою.
    • xUnit Test Patterns — Fresh Fixture — вибір «щоразу заново проти перевикористання» як ключове рішення і порядок відступу «свіжа → незмінна спільна → спільна».

    fullyParallel і serial: два кроки в протилежні боки

    • Playwright — ParallelismbeforeAll/afterAll для кожного тесту в повністю паралельному режимі, serial як не рекомендований режим, пропуск наступних тестів групи й ретрай усієї групи.
    • Playwright — ShardingfullyParallel як перехід до розкладки на рівні окремих тестів.

    --shard: розкладка між машинами CI

    • Playwright — Sharding--shard=x/y, шард як окрема джоба, шардяться лише паралелізовні тести, файлова проти тестової гранулярності й нерівні шарди, рецепт «fullyParallel або дрібні рівні файли», власний звіт кожного шарда і злиття blob-звітів із вкладеннями.
    • Playwright — Reportersblob як проміжний формат, з якого роблять будь-який інший звіт.
    • Playwright — Projects — фільтрація за шардом вибирає основні тести, а тести залежностей підтягуються самі; впала залежність — залежні тести не запускаються.
    • CodeceptJS — Parallel Execution--shard як розкладка файлів між машинами матричного білда.
    • Wikipedia — Amdahl's law — формулювання закону («навіть із нескінченною кількістю процесорів прискорення обмежене непаралелізованою часткою») і числові приклади ×2 і ×20 (trust: secondary, dec-0710).

    Ферма: чужі браузери по мережі

    • W3C — WebDriver Level 2 — ланцюг local end / intermediary node / endpoint node, проміжний вузол як законна частина моделі, вимога невідрізнимості віддаленого вузла як чорної скриньки.
    • Selenium — Grid: Getting Started — три способи розгортання, межа standalone «одна машина», комбінація ОС і версій як мотив, ємність вузла в CPU і ~1 ГБ на сеанс, виняток Safari, рекомендація дробити вузли, орієнтовні розміри парку, вимога закрити доступ фаєрволом.
    • TestMu AI (колишній LambdaTest) — Get Started With Selenium Testing — склад пакета хмарної ферми та число «3000+ комбінацій» як заява постачальника; міграція як зміна адреси хабу й креденшелів (trust: secondary, dec-1811 — канонічної опори під складом пакета немає).
    • MDN — Strategies for carrying out testing — реальний пристрій як найточніший, базовий склад device lab, слабкі апарати для продуктивності, комерційні сервіси Sauce Labs і BrowserStack.
    • Chrome DevTools — Simulate mobile devices with device mode — симуляція як наближення першого порядку; архітектура мобільних процесорів не моделюється.
    • Playwright — Sharding — шард як окрема незалежна джоба: ферма й шардінг як різні осі масштабування.

    Вимоги до тестів: ізоляція — передумова, не гігієна

    • Playwright — Test Isolation (browser contexts) — ізоляція знімає питання порядку й робить можливими паралельність і шардінг; три названі наслідки; дві стратегії ізоляції й неможливість прибрати «відвідані посилання».
    • Playwright — Best Practices — вимога повної ізоляції тесту з власними localStorage, sessionStorage, даними й кукі.
    • xUnit Test Patterns — Erratic TestTest Run War можлива лише за глобально спільної фікстури; маркер «зелений сам, падає в сюїті»; файл і записи в базі як спільний стан.
    • xUnit Test Patterns — Fresh Fixture — свіжа фікстура як усунення передумови неповторюваного тесту.
    • ISTQB® Certified Tester Advanced Level Test Automation Engineering (CTAL-TAE) v2.0 — §1.1: автоматизація дає тести, неможливі вручну, серед прикладів — паралельне виконання; §4.2: фікстури й повторюваність.

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

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

    Пояснення

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

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

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