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

    01 · Основи тестування

    Тестові середовища і виконання тестів

    Зміст

    Розробник пише в чат «задеплоїв фікс на стейдж», менеджер питає «який pass rate на релізному білді», хтось панікує «прод лежить, котимо hotfix». Якщо половина цих слів звучить як шум — ця глава саме про них: про робочу мову, якою команда щодня говорить про виконання тестів. Середовища, тестові дані, білди й статуси — це не «теорія для сертифікації», а лексикон першого ж стендапу. І класика співбесід для trainee: «чим blocked відрізняється від failed?» і «чим реліз відрізняється від деплою?» — питання, на яких видно, чи працювала людина в реальному проєкті.

    Глава — продовження STLC: життєвий цикл тестування: там фази циклу цілком, тут — глибше про фази виконання і завершення. Якщо проходиш розділ уперше й послідовно, цю главу можна пропустити і повернутися пізніше — наступні глави спираються на неї лише окремими термінами. Але перед співбесідою повернись обовʼязково: питають звідси багато.

    Середовища: dev, test, stage, prod

    Чому код не їде з ноутбука розробника одразу до користувачів? Бо будь-яка зміна потенційно щось ламає, і чим пізніше поломка виявиться, тим дорожче обійдеться. Тому між «написав код» і «користувач бачить фічу» будують ланцюжок середовищ (environments) — окремих інсталяцій застосунку зі своїми серверами, базою та конфігурацією. Кожна зупинка ловить свій клас проблем: dev — «код взагалі не працює», test — «фіча працює не так», stage — «в бойовій конфігурації все розвалюється», prod — те, що прослизнуло повз усіх.

    dev
    розробка

    test / QA
    основне тестування

    stage
    копія прод-умов

    prod
    реальні користувачі

    dev
    розробка

    test / QA
    основне тестування

    stage
    копія прод-умов

    prod
    реальні користувачі

    СередовищеХто працюєНавіщоДані
    devРозробникиРозробка і дебаг; нестабільне, ламати можнаМінімальні, синтетичні
    test (QA)ТестувальникиОсновний обсяг тестуванняТестові, підготовлені під кейси
    stage (staging, preprod)QA, бізнес, DevOpsФінальна перевірка в умовах, максимально наближених до prod; часто тут UATРеалістичні, знеособлені
    prod (production)Реальні користувачіЖивий продукт; тестування мінімальне й обережнеРеальні

    Назви — не стандарт, а конвенція команди: десь є окремий UAT, десь sandbox чи demo для клієнтів, десь test і stage злиті в одне. На співбесіді важить не завчений список, а розуміння призначення: чим ближче середовище до prod, тим воно стабільніше, тим суворіші доступи й тим дорожче на ньому щось зламати.

    Чим середовища відрізняються насправді — і чому це болить QA:

    • Конфігурація. Інші змінні оточення, вимкнені чи ввімкнені фіче-флаги, інші ліміти. Фіча, якої «немає» на test, може бути просто вимкнена прапорцем.
    • Інтеграції. На test платіжка працює в тестовому режимі або замінена заглушкою, пошта не надсилається назовні, зовнішні API — часто моки. На prod усе справжнє.
    • Дані. На test — сотні записів, на prod — мільйони. Пагінація, пошук і продуктивність поводяться зовсім інакше.
    • Інфраструктура. На prod зазвичай є CDN, кешування, балансувальник навантаження — на test їх може не бути. Через кеш prod може показувати стару версію фронтенду ще довго після деплою — механіка розібрана в главі Кешування.
    • Моніторинг і доступи. На prod — алерти, логи, обмежені права; «потикати руками в базі» там не вийде і не можна.

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

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

    Тестові дані: підготовка, ізоляція, деперсоналізація

    Майже кожен тест-кейс починається з передумов: «користувач з роллю адміністратора», «товар із нульовим залишком», «підписка, що спливла вчора». Це і є тестові дані (test data) — стан системи, без якого перевірку не виконати. Три речі, які про них треба розуміти на рівні trainee: як їх готують, чому їх ізолюють і чому не можна просто взяти дані з prod.

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

    Ізоляція. Кожен тест має працювати зі своїми даними. Якщо два тестувальники (або ручний прогін і автотести) редагують той самий обліковий запис, результати починають залежати від порядку дій: тест А поміняв пароль — тест Б не може залогінитись, і це виглядає як баг застосунку, хоча застосунок ні до чого. Найпростіший прийом ізоляції — унікальні дані на кожен прогін:

    // Унікальний email на кожен запуск — тести не зіштовхуються
    const email = `qa+${Date.now()}@example.com`;
    await page.getByLabel('Email').fill(email);

    Це концепція, а не повний рецепт: стратегія тестових даних для автоматизації (сідінг бази, фабрики, очищення після прогону) — окрема тема розділу про автоматизацію.

    Деперсоналізація. Спокуслива ідея: скопіювати базу з prod на test — от і «найреалістичніші дані». Проблема в тому, що там персональні дані живих людей: імена, пошти, телефони, адреси, історія замовлень. Витік з тестового середовища (де доступи традиційно слабші за прод) — це справжній витік персональних даних з юридичними наслідками: у ЄС це регулює GDPR, в Україні — закон «Про захист персональних даних». Тому перед перенесенням дані знеособлюють. Три підходи, від радикального до м'якого:

    • синтетичні дані — згенеровані з нуля, реальних людей там не було ніколи;
    • анонімізація — реальні записи незворотно знеособлені: імена й пошти замінені, звʼязок з людиною зруйновано;
    • псевдонімізація — ідентифікатори замінені, але відповідність збережена окремо, тож звʼязок відновлюваний; це слабший захист, і поводитись з такими даними треба як з персональними.

    Для QA підсумок такий: реалістичність даних — цінність, але вона ніколи не переважує приватність. «Скинь мені дамп проду» — питання, яке має викликати рефлекторне «а він знеособлений?».

    Білд, деплой, реліз, hotfix: словник

    Чотири слова, які на співбесідах регулярно плутають, — бо в побутовій мові вони звучать як синоніми «нова версія». Насправді це різні речі:

    • Білд (build) — зібраний з вихідного коду артефакт: конкретна версія застосунку, яку можна встановити. У білда є ідентифікатор (номер, хеш коміту), і саме він відповідає на питання «а ЩО ми зараз тестуємо». Один і той самий білд може побувати на всіх середовищах по черзі.
    • Деплой (deploy, deployment) — процес встановлення білда на конкретне середовище. «Задеплоїли білд 2.14.0 на stage» — технічна дія, користувачі її не бачать.
    • Реліз (release) — момент, коли функціональність стає доступна користувачам, і сама ця опублікована версія. Деплой — технічна подія, реліз — продуктова: код можна задеплоїти на prod і тримати вимкненим за фіче-флагом, тоді деплой уже відбувся, а реліз — ще ні.
    • Hotfix — терміновий фікс критичної проблеми на prod, який їде скороченим шляхом: без повного циклу тестування, з перевіркою самого фікса й мінімальною регресією навколо нього. Hotfix — це завжди усвідомлений ризик в обмін на швидкість.

    Поруч живуть ще два слова: release candidate — білд-кандидат, який стане релізом, якщо тестування не знайде блокерів, і rollback (відкат) — повернення попередньої версії, коли реліз пішов не так. А в номерах версій на кшталт 2.14.1 часто вгадується семантичне версіонування (semantic versioning): мажорна.мінорна.патч — зламні зміни, нова функціональність, виправлення.

    Чому це словник QA, а не тільки DevOps: тестувальник щодня відповідає на питання «на якому білді відтворено баг» і «чи потрапив фікс у цей білд». Без прив'язки до білда результат тестування висить у повітрі — незрозуміло, що саме перевірено і чи актуальна перевірка після наступного деплою.

    Статуси виконання: passed, failed, blocked, skipped

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

    СтатусЩо означаєТиповий приклад
    passedФактичний результат збігся з очікуванимУсі кроки пройдені, все як у кейсі
    failedФактичний результат розійшовся з очікуванимЗамість сторінки підтвердження — помилка 500
    blockedВиконати неможливо через зовнішню перешкодуТестове середовище лежить; попередній крок зламаний дефектом
    skippedСвідомо не виконувалиФункціональність вимкнена на цьому середовищі; кейс поза скоупом прогону

    Ключова межа проходить не між «добре» і «погано», а між «виконали» і «не виконали»:

    Так

    Так

    Ні

    Ні

    Заважає зовнішня перешкода

    Свідоме рішення не виконувати

    Тест-кейс у прогоні

    Кроки виконати вдалося?

    Результат збігся з очікуваним?

    passed

    failed

    Чому?

    blocked

    skipped

    Так

    Так

    Ні

    Ні

    Заважає зовнішня перешкода

    Свідоме рішення не виконувати

    Тест-кейс у прогоні

    Кроки виконати вдалося?

    Результат збігся з очікуваним?

    passed

    failed

    Чому?

    blocked

    skipped

    Два уточнення, на яких сипляться кандидати:

    • failed ≠ баг. Failed означає лише розбіжність з очікуванням. Перш ніж заводити дефект, перевіряють, чи не винні тест, дані або середовище: застарілий кейс, чужі дані, недодеплоєний білд. Якщо розбіжність підтверджена — далі баг-репорт, це тема глави Баг-репорт і життєвий цикл дефекту.
    • blocked ≠ skipped. Blocked — «хотіли виконати, але не змогли»: перешкода зовнішня, і коли її приберуть, тест повернеться у прогін. Skipped — «вирішили не виконувати»: рішення власне, причина — скоуп, конфігурація чи пріоритети. Позначити заблокований тест як skipped означає сховати проблему: у звіті ніхто не побачить, що частина функціональності лишилася неперевіреною не з наших міркувань, а через дефект чи зламаний стенд.

    Конкретні назви статусів залежать від системи керування тестуванням (TMS): десь є окремі untested, in progress, retest. Це деталі інструмента — важлива логіка чотирьох базових станів.

    І про сумарну цифру: pass rate 95% сам по собі не означає «майже готово». Пʼять відсотків failed можуть бути оплатою замовлення, а можуть — друкарською помилкою в футері. Статуси рахують, але рішення ухвалюють, дивлячись на те, ЩО саме впало і заблоковане, — про метрики і їхні пастки детальніше в главі Метрики тестування і звітність.

    Звіт про результати і закриття циклу

    Тестування — це сервіс, який постачає інформацію про якість, і звіт — його головний продукт. Наприкінці циклу (реліз, спринт, етап) команда тестування готує звіт про результати (test summary report, у термінах ISTQB — test completion report). Його читають люди, які не бачили жодного тест-кейсу, тож звіт відповідає на їхні питання, а не переказує прогін:

    • що перевірено, а що ні — скоуп і явний перелік неперевіреного з причинами (не встигли, було заблоковано);
    • зведення результатів — статуси, динаміка, порівняння з критеріями виходу (exit criteria) з тест-плану — самі критерії розібрані в главі про STLC;
    • відкриті дефекти — не кількістю, а сутністю: які саме, якої важливості, що з ними вирішили;
    • ризики — що може статися, якщо релізити з поточним станом;
    • відхилення від плану — що пішло не так і чому.

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

    Після звіту цикл закривають (test completion): результати й тестові артефакти архівують із привʼязкою до версії, корисні кейси з прогону поповнюють регресійний набір — навіщо він і як живе, розказано в главі Смоук, саніті, регресія і ретест, — а команда фіксує висновки (lessons learned): що в процесі варто змінити до наступного циклу. Без закриття досвід циклу випаровується, і наступний реліз наступає на ті самі граблі.

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

    • «На stage працює — значить, і на prod буде» — виглядає як логічний висновок, а насправді stage відрізняється конфігурацією, обсягом даних, кешем і навантаженням; тому після деплою на prod усе одно роблять смоук.
    • «Баг не відтворюється — закриваємо» — виглядає як плаваючий дефект, а насправді часто просто інше середовище, інший білд чи інші дані; спершу звіряють, де саме відтворювали.
    • Заблокований тест позначили skipped — виглядає як охайний прогін без «червоного», а насправді звіт приховав, що функціональність не перевірена через зламаний стенд чи блокуючий дефект.
    • Failed одразу конвертують у баг-репорт — виглядає як швидка реакція, а насправді чимала частина таких «багів» — застарілі кейси, чужі дані або недокачений білд; спершу перевір тест і середовище.
    • «Скопіюємо прод-базу на тест, буде реалістично» — виглядає як найкращі тестові дані, а насправді це персональні дані реальних людей на середовищі зі слабкими доступами; спершу знеособлення.
    • «Задеплоїли — отже, зарелізили» — виглядає як синоніми, а насправді деплой — технічна подія, реліз — продуктова; код на prod може тижнями жити вимкненим за фіче-флагом.

    Підсумок

    • Середовища існують, щоб ловити проблеми якомога раніше й дешевше; чим ближче до prod, тим стабільніше, суворіше й дорожче помилятися. Результат тестування має сенс лише з привʼязкою «яке середовище, який білд».
    • Тестові дані готують під кейси, ізолюють між тестами й тестувальниками, а перед перенесенням із prod — знеособлюють: реалістичність не переважує приватність.
    • Білд — артефакт, деплой — встановлення білда на середовище, реліз — доступність користувачам, hotfix — терміновий фікс скороченим циклом. Це чотири різні речі, а не синоніми.
    • Failed — розбіжність з очікуванням (ще не баг), blocked — не змогли виконати через зовнішню перешкоду, skipped — свідомо не виконували. Плутанина в статусах спотворює картину прогону.
    • Звіт про результати — продукт тестування: скоуп, результати проти критеріїв виходу, дефекти й ризики. QA інформує про якість; рішення про реліз ухвалює бізнес.

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

    • «Які середовища були на твоєму проєкті і чим відрізнялися?» — перевірка реального досвіду: завчений список dev/test/stage/prod без деталей видно одразу; сильна відповідь — про конкретні відмінності (дані, інтеграції, доступи) і як вони впливали на тестування.
    • «Чим blocked відрізняється від failed? А від skipped?» — інтервʼюер дивиться, чи розумієш різницю між «результат не збігся», «не зміг виконати» і «вирішив не виконувати», і чи згадаєш, навіщо ця різниця звіту.
    • «Чим реліз відрізняється від деплою?» — маркер реального проєктного досвіду; бонус — приклад із фіче-флагом: задеплоєно, але не зарелізено.
    • «Знайшли критичний баг на проді — ваші дії?» — очікують слово hotfix, розуміння скороченого циклу (перевірка фікса + мінімальна регресія навколо) і усвідомлення ризику такого шляху.
    • «Чому не можна просто скопіювати прод-базу на тестове середовище?» — перевірка, чи знаєш про персональні дані й знеособлення хоча б на рівні концепції.
    • «Тестування завершено — що далі? Хто вирішує, чи релізити?» — дивляться, чи розумієш роль QA: дати чесну картину якості, а не «дозволити» чи «заборонити» реліз.

    Джерела

    • Силабус ISTQB CTFL 4.0 — розділ 1.4 (тестові активності, зокрема виконання і завершення тестування) і розділ 5.3 (моніторинг, контроль і завершення тестування, звіти про результати).
    • Глосарій ISTQB — канонічні означення термінів: test environment, test data, test completion report.
    • Semantic Versioning — специфікація семантичного версіонування, з якого походить схема «мажорна.мінорна.патч».
    • GDPR — Регламент (ЄС) 2016/679 — офіційний текст регламенту про захист персональних даних; контекст для деперсоналізації тестових даних.