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

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

    Тестування, QA і QC: базові поняття

    Зміст

    «Чим QA відрізняється від QC?» — питання, з якого починається чи не кожна перша співбесіда на позицію тестувальника. І воно не формальне: за відповіддю видно, чи розумієш ти, за що тобі платитимуть. В індустрії ці терміни вживають недбало — у вакансії пишуть «QA Engineer», а мають на увазі людину, яка тестує; кажуть «баг», маючи на увазі то помилку в коді, то падіння на проді. Поки термінологія розмита, розмита і твоя роль.

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

    У тестування дві цілі, які на перший погляд суперечать одна одній.

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

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

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

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

    Що таке якість і чому вона не зʼявляється наприкінці

    Якість ПЗ — це не «відсутність багів». Стандарт ISO/IEC 25010 визначає якість як ступінь, у якому продукт задовольняє заявлені та неявні потреби зацікавлених сторін. Обидва слова важливі:

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

    ISO/IEC 25010 розкладає якість продукту на характеристики: функціональна придатність, продуктивність, надійність, зручність використання (у редакції 2023 року — здатність до взаємодії, interaction capability), безпека, супроводжуваність, сумісність та інші. Практичний наслідок для тестувальника: «все працює за вимогами» — це лише одна грань. Продукт може проходити всі функціональні перевірки і бути нестерпно повільним, дірявим у безпеці чи незручним.

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

    Тестування, QC і QA: хто де живе

    Тепер до головної термінологічної пари. Обидва поняття — частини управління якістю (quality management), але дивляться в різні боки:

    • Забезпечення якості (quality assurance, QA) — орієнтоване на процеси: як ми працюємо. Ідея: якщо процес налаштований правильно — вимоги ревʼюються, код проходить рев'ю, тести пишуться, реліз має чекліст — то і продукт на виході буде якісним. QA-активності: побудова процесів, стандарти, ретроспективи, аналіз причин дефектів (root cause analysis), щоб дефекти не зʼявлялися знову.
    • Контроль якості (quality control, QC) — орієнтований на продукт: що в нас вийшло. Це перевірка конкретного результату роботи: чи відповідає він вимогам і очікуванням.

    Тестування — це форма контролю якості. Не синонім QA і навіть не його підмножина: за ISTQB, QA і QC — дві різні складові управління якістю, які працюють поруч.

    Управління якістю (quality management)

    QC — контроль якості: фокус на продукті

    Тестування:
    виявити дефекти,
    дати інформацію про якість

    QA — забезпечення якості
    фокус: процеси, «як працюємо»
    мета: запобігти дефектам

    Управління якістю (quality management)

    QC — контроль якості: фокус на продукті

    Тестування:
    виявити дефекти,
    дати інформацію про якість

    QA — забезпечення якості
    фокус: процеси, «як працюємо»
    мета: запобігти дефектам

    Порівняння коротко:

    АспектQAQC (і тестування як його форма)
    ФокусПроцесПродукт
    МетаЗапобігти дефектамВиявити дефекти
    КолиПостійно, протягом усього циклуКоли є що перевіряти
    ПрикладВвести обовʼязкове рев'ю вимогПрогнати тести на білді

    Чому ж тоді вакансії називаються «QA Engineer», якщо девʼять з десяти обовʼязків у них — тестування, тобто QC? Історично склалось, і сперечатися з ринком безглуздо. Але розуміти різницю треба: коли тестувальник пропонує додати чекліст готовності фічі до передачі в тестування або розбирає на ретро, чому дефект прослизнув у прод, — у цей момент він справді робить QA, працює з процесом. Коли клікає по стенду чи пише автотест — робить QC. Досвідчені інженери роблять і те, і те, тому назва «QA» поступово стає чесною.

    Верифікація і валідація

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

    • Верифікація (verification) — перевірка, що продукт відповідає специфікованим вимогам. Питання: «чи правильно ми зробили продукт?» (are we building the product right). Еталон — документ: вимога, специфікація, дизайн.
    • Валідація (validation) — перевірка, що продукт відповідає реальним потребам користувачів і взагалі придатний для свого призначення. Питання: «чи правильний продукт ми зробили?» (are we building the right product). Еталон — потреба, а не папірець.

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

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

    Error, defect, failure: ланцюжок

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

    1. Помилка (error, mistake) — людська дія, що дає неправильний результат. Помиляється людина: аналітик неоднозначно сформулював вимогу, розробник неуважно її прочитав.
    2. Дефект (defect, fault, bug) — наслідок помилки, вада в робочому продукті: неправильний рядок коду, суперечлива вимога, крива конфігурація. Дефект — статичний, він просто «лежить» у продукті.
    3. Відмова (failure) — подія: система за певних умов повелася не так, як мала. Відмова — це дефект, що проявився під час виконання.

    код виконався
    за певних умов

    умови не настали

    Помилка (error)
    людина помилилась

    Дефект (defect)
    вада в коді чи вимозі

    Відмова (failure)
    система повелась неправильно

    Дефект спить —
    відмови немає

    код виконався
    за певних умов

    умови не настали

    Помилка (error)
    людина помилилась

    Дефект (defect)
    вада в коді чи вимозі

    Відмова (failure)
    система повелась неправильно

    Дефект спить —
    відмови немає

    Ключовий нюанс, який перевіряють на співбесідах: зв'язок не автоматичний в обидва боки.

    Дефект може роками не проявлятися — код з вадою просто не виконується на типових даних. Мінімальний приклад:

    // Вимога: «пароль — мінімум 8 символів».
    // Розробник помилився (error) і написав строгу нерівність:
    function isPasswordLongEnough(password: string): boolean {
      return password.length > 8; // дефект: має бути >= 8
    }

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

    test('пароль із рівно 8 символів приймається', async ({ page }) => {
      await page.getByLabel('Пароль').fill('Qwerty1!'); // рівно 8
      await page.getByRole('button', { name: 'Зареєструватися' }).click();
      await expect(page.getByText('Пароль закороткий')).toBeHidden();
    });

    І навпаки: відмова можлива без дефекту у вашому коді — впав мережевий запит, закінчилось місце на диску, третій сервіс віддав 500 (що означають статус-коди — у главі про HTTP-статуси). Сюди ж — хибні спрацювання самих тестів: тест може впасти через власний дефект або нестабільне середовище (false positive) чи, гірше, не впасти там, де дефект є (false negative). Тому «тест упав» ще не означає «знайдено дефект застосунку» — спочатку розберися, чия це відмова.

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

    Вартість дефекту: чим пізніше, тим дорожче

    Один і той самий дефект коштує по-різному залежно від того, коли його знайшли:

    Етап виявленняХто зазвичай знаходитьЩо коштує виправлення
    Вимоги / дизайнРев'ю вимог, QA на рефайнментіПереписати кілька речень у документі
    РозробкаРозробник, юніт-тести, код-рев'юПоправити код до мержа
    ТестуванняТестувальник на стендіБаг-репорт → фікс → ретест → шматок регресії
    ПродКористувачі, підтримка, моніторингПозаплановий hotfix, зіпсовані дані, підтримка, репутація, іноді прямі збитки

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

    Точні множники з підручників («у 10 разів на кожному етапі», «у 100 разів на проді») походять зі старих досліджень часів Бема і сучасними даними підтверджуються нерівно — цитувати їх як закон природи не варто. Але напрямок залежності сумнівів не викликає, і саме він стоїть за принципом раннього тестування (одним із семи принципів) і за модним словом shift-left: залучати тестування якомога раніше — до вимог і дизайну, а не після «код готовий». Найдешевше дефекти ловляться взагалі без запуску коду — на рев'ю вимог і статичному аналізі (про це — глава про статичне тестування).

    Роль тестувальника в команді

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

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

    Окрема тема — незалежність тестування. Автор коду перевіряє свій код поблажливо — не з лінощів, а тому, що дивиться на нього крізь ті самі припущення, з якими писав: якщо помилка в припущенні, він її не побачить. Тому існують ступені незалежності: перевіряє сам автор → перевіряють колеги з його команди (інший розробник чи тестувальник) → перевіряють тестувальники поза командою автора, але в межах організації → перевіряють зовнішні тестувальники поза організацією. Що більша незалежність, то більше «чужих» дефектів знаходиться, але то довша комунікація. В Agile-командах баланс зазвичай такий: тестувальник вбудований у команду розробки (whole-team approach), але зберігає незалежний погляд — він не писав цей код і не закоханий у нього.

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

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

    • Виглядає як «QA і тестування — синоніми», а насправді тестування — форма контролю якості (QC), а QA — робота з процесами. Кажеш «я забезпечую якість», а описуєш прогін тест-кейсів — інтервʼюер це чує.
    • Виглядає як «тестування гарантує якість», а насправді тестування лише дає інформацію про неї. Гарантувати відсутність дефектів неможливо в принципі — чому саме, розбираємо у семи принципах тестування.
    • Виглядає як «тест упав — знайшли баг», а насправді відмова могла прийти з середовища, тестових даних чи дефекту самого тесту. Спершу зʼясуй, чия відмова, потім заводь дефект.
    • Виглядає як «дефектів не знайдено — продукт якісний», а насправді дефект може просто спати, бо його умови не настали, а неявні потреби (швидкість, зручність, безпека) ти взагалі не перевіряв.
    • Виглядає як «валідація — це перевірка полів форми», а насправді перевірка введення (input validation) — це функціональність продукту, а валідація в термінах якості — перевірка, що продукт відповідає потребам користувачів. Однакове слово, різні речі.
    • Виглядає як «за якість відповідає відділ QA», а насправді якість закладається всією командою на кожному етапі, а тестування її вимірює. Команда з цапом-відбувайлом якісного продукту не робить.

    Підсумок

    • Тестування дає інформацію про якість і знижує ризики — воно не створює якість і не може гарантувати відсутність дефектів.
    • QA — про процеси, QC — про продукт; тестування — форма QC; разом вони складають управління якістю. У вакансіях «QA» історично означає переважно QC-роботу.
    • Верифікація — «чи правильно зробили продукт» (відповідність вимогам); валідація — «чи правильний продукт зробили» (відповідність потребам).
    • Ланцюжок error → defect → failure: людина помиляється, у продукті зʼявляється дефект, за певних умов він проявляється відмовою. Дефект може не проявлятися роками; відмова буває і без дефекту в коді.
    • Чим пізніше знайдено дефект, тим дорожче виправлення — тому тестування починається з вимог, а за якість відповідає вся команда, не лише тестувальник.

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

    • «Навіщо потрібне тестування, якщо розробники й так перевіряють свій код?» Інтервʼюер дивиться, чи назвеш більше однієї цілі (пошук дефектів + впевненість + інформація для рішень) і чи згадаєш незалежність погляду: автор коду сліпий до власних припущень.
    • «Чим QA відрізняється від QC? А тестування — це що з них?» Перевіряють не завчену фразу, а розуміння фокусів: процес проти продукту, запобігання проти виявлення. Сильна відповідь містить приклад QA-активності (рев'ю процесу, root cause analysis) і чесне «моя щоденна робота — переважно QC».
    • «Що таке верифікація і валідація? Наведи приклад, коли верифікація пройдена, а валідація — ні.» Без прикладу відповідь вважай неповною: саме приклад показує, що ти розумієш різницю, а не зазубрив означення.
    • «Що таке баг? Чим дефект відрізняється від відмови?» Дивляться на точність термінології і на розуміння, що не кожен дефект проявляється і не кожна відмова — від дефекту в коді. Бонус — згадати false positive/false negative самих тестів.
    • «Хто відповідає за якість продукту?» Питання-пастка. «Тестувальник» або «відділ QA» — слабка відповідь; сильна — «вся команда, а тестування дає вимірювання», з поясненням, чому інакше не працює.
    • «Коли дефект виправляти найдешевше і що з цього випливає для процесу?» Чекають на логіку подорожчання за етапами і висновок про раннє залучення тестування (shift-left), а не завчені множники.

    Джерела

    • ISTQB CTFL Syllabus v4.0 — глава покриває розділ 1 «Fundamentals of Testing» (цілі тестування, тестування vs QA, error/defect/failure), зокрема 1.5.3 (незалежність тестування).
    • Глосарій ISTQB — канонічні означення термінів: testing, quality assurance, quality control, verification, validation, error, defect, failure.
    • ISO/IEC 25010 — модель якості продукту — характеристики якості ПЗ, з яких видно, що якість ширша за «відповідність функціональним вимогам».