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

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

    Рівні тестування

    Зміст

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

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

    Що таке рівень тестування

    Рівень тестування (test level) — це група тестових активностей, організована навколо певного об'єкта тестування: окремий модуль, зв'язка модулів, система цілком або система в руках користувача. Кожен рівень має власну мету, власний тест-базис (документи, з яких виводяться перевірки) і власний типовий клас дефектів.

    Класична модель — чотири рівні:

    1. Модульний (unit/component) — перевіряємо найменшу частину коду ізольовано.
    2. Інтеграційний (integration) — перевіряємо взаємодію між частинами.
    3. Системний (system) — перевіряємо систему цілком, очима користувача.
    4. Приймальний (acceptance) — перевіряємо готовність до впровадження.

    Силабус ISTQB CTFL 4.0 виділяє п'ять рівнів: інтеграційний там розділено на компонентний інтеграційний (component integration — взаємодія модулів усередині системи) і системний інтеграційний (system integration — взаємодія вашої системи з іншими системами, наприклад із платіжним провайдером чи поштовим сервісом). На співбесіді достатньо чотирьох, але про цей поділ варто знати: питання «а як тестувати інтеграцію зі Stripe?» — це саме system integration.

    Важлива межа: рівні — це не види. Функціональне, регресійне, смоук — це види тестування, і вони застосовні на будь-якому рівні: буває регресія на unit-рівні й регресія на системному. Детальніше — у главі «Види тестування: класифікація».

    Модульне тестування — і навіщо воно мануальному QA

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

    Мінімальний приклад мовою TypeScript:

    import { test, expect } from '@playwright/test';
    import { calculateDiscount } from '../src/pricing';
    
    // Unit-тест: жодного браузера, жодної мережі — лише логіка функції
    test('знижка 10% застосовується до замовлення від 1000 грн', () => {
      expect(calculateDiscount(1000)).toBe(900);
    });
    
    test('знижка не застосовується до замовлення нижче порогу', () => {
      expect(calculateDiscount(999)).toBe(999);
    });

    Такий тест виконується за мілісекунди, не потребує середовища і точно вказує на місце поломки: впав тест calculateDiscount — дефект у calculateDiscount. У цьому головна сила рівня: дешевизна і точна локалізація.

    Навіщо це мануальному QA, який цих тестів не пише:

    • Щоб не дублювати роботу. Якщо межі й крайові значення функції знижки покриті юнітами, ганяти руками двадцять комбінацій сум — марнування часу. Ручний фокус зміщується туди, куди юніти не дістають: інтеграція, UI, реальні дані.
    • Щоб грамотно тріажити баги. «Знижка рахується неправильно» і «знижка рахується правильно, але не відображається» — дефекти різних рівнів, і адресувати їх треба по-різному.
    • Щоб читати сигнали якості. Зелені юніти в pull request — мінімальна гігієна білда, який приїде до тебе на тестування. Червоні — привід не починати ручний прогін узагалі.
    • Бо це перша сходинка до AQA. Піраміда тестування (розділ «Автоматизація») будується саме на розумінні, що дешевше ловити внизу.

    Інтеграційне тестування: big bang, top-down, bottom-up

    Кожен модуль окремо працює — це ще нічого не гарантує. Модуль А повертає суму в копійках, модуль Б очікує в гривнях; сервіс А шле дату як 2026-07-16, сервіс Б парсить американський формат. Інтеграційне тестування перевіряє взаємодію: контракти, формати даних, послідовності викликів, обробку помилок на стиках. Типові дефекти цього рівня не видно всередині жодного окремого модуля — вони живуть саме між ними.

    Ключове питання інтеграції — в якому порядку збирати й перевіряти зв'язки. Класичні підходи:

    ПідхідЯк збираємоЦіна
    Big bangУсе разом за один раз, тестуємо готову зв'язкуДефект шукаємо по всій системі одразу
    Top-downВід верхніх модулів до нижніх, нижні підмінюємо заглушкамиТреба писати заглушки (stubs)
    Bottom-upВід нижніх модулів до верхніх, верхні імітуємо драйверамиТреба писати драйвери (drivers)

    Big bang — зібрати все і подивитися, що вийде. Приваблює відсутністю підготовчої роботи, але коли щось падає (а щось впаде), локалізувати дефект серед десятків одночасно з'єднаних модулів дорого й довго. Виправданий хіба для малих систем із кількох модулів.

    Top-down починає з верхніх рівнів логіки (наприклад, з UI чи головного контролера). Нижні модулі, яких ще немає або які ще не перевірені, замінюють заглушками (stubs) — спрощеними імітаціями, що повертають заготовлені відповіді. Плюс: скелет системи і головні сценарії видно рано. Мінус: низькорівнева логіка (розрахунки, робота з даними) перевіряється останньою.

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

    На практиці підходи комбінують і рухаються інкрементно: інтегрувати по одному з'єднанню і перевіряти одразу — саме тому, що так дефект локалізується миттєво. У сучасних проєктах значна частина інтеграційних перевірок іде через API — тому тестувальнику потрібні HTTP і REST як робочі інструменти.

    Системне тестування

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

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

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

    Приймальне тестування: UAT, alpha, beta

    Приймальне (acceptance) тестування відповідає на інше питання, ніж усі попередні рівні. Не «чи є дефекти?», а «чи готова система до впровадження і чи розв'язує вона задачу бізнесу?». Знайти багато багів на прийманні — погана новина: вони мали бути знайдені раніше.

    Основні форми:

    • UAT (user acceptance testing) — перевірка реальними користувачами або представниками замовника: чи можуть вони виконати свої бізнес-процеси в системі. Тест-базис — бізнес-вимоги та acceptance criteria. Типовий результат UAT — не баг-репорт, а рішення: приймаємо / приймаємо з умовами / не приймаємо.
    • Операційне приймальне (operational acceptance) — перевірка готовності до експлуатації руками адміністраторів: бекапи й відновлення, моніторинг, встановлення та оновлення.
    • Контрактне і регуляторне — відповідність контракту із замовником або вимогам регулятора (актуально для фінтеху, медицини, держсектору).
    • Альфа-тестування (alpha) — потенційні користувачі тестують продукт на боці розробника: на його середовищі, під наглядом команди.
    • Бета-тестування (beta) — зовнішні користувачі тестують продукт у себе: на власних пристроях, у власному оточенні, без нагляду. Класика для масових продуктів: бета ловить дефекти конфігурацій і сценаріїв, які неможливо відтворити в лабораторії.

    Різниця alpha/beta — не в «ступені готовності білда», як часто відповідають на співбесіді, а в місці та контролі: альфа — у розробника під наглядом, бета — у користувачів у дикій природі.

    Рівні у V-моделі

    V-модель (детально — у главі «SDLC: моделі розробки ПЗ») — найнаочніший спосіб побачити, звідки рівні беруться. Ліва гілка — деталізація від бізнес-вимог до коду; права — рівні тестування, і кожен рівень дзеркалить відповідний етап лівої гілки: перевірки цього рівня плануються і виводяться саме з того документа.

    тест-базис

    тест-базис

    тест-базис

    тест-базис

    Вимоги користувача

    Системні вимоги

    Архітектура системи

    Детальний дизайн

    Код

    Модульне тестування

    Інтеграційне тестування

    Системне тестування

    Приймальне тестування

    тест-базис

    тест-базис

    тест-базис

    тест-базис

    Вимоги користувача

    Системні вимоги

    Архітектура системи

    Детальний дизайн

    Код

    Модульне тестування

    Інтеграційне тестування

    Системне тестування

    Приймальне тестування

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

    Хто виконує на кожному рівні

    РівеньХто зазвичай виконуєТест-базис
    МодульнийРозробникиДетальний дизайн, код
    ІнтеграційнийРозробники і тестувальникиАрхітектура, контракти API
    СистемнийНезалежна команда тестуванняВимоги до системи
    ПриймальнийКористувачі, замовник, бізнес; ops-команда для операційногоБізнес-вимоги, acceptance criteria

    «Зазвичай» тут важливе слово: розподіл залежить від команди і моделі розробки. В Agile-командах межі розмиваються — тестувальник бере участь у рев'ю unit-покриття, розробник ганяє системні сценарії, UAT проводять щоспринту на демо. Але логіка відповідальності зберігається: чим нижчий рівень, тим ближче виконавець до коду; чим вищий — тим ближче до бізнесу.

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

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

    Підсумок

    • Рівень визначається об'єктом тестування: модуль → зв'язки модулів → система цілком → система в руках користувача. Не інструментом і не технікою.
    • Кожен рівень ловить свій клас дефектів: логіка — на модульному, стики й контракти — на інтеграційному, наскрізні сценарії й вимоги — на системному, відповідність бізнес-потребі — на приймальному.
    • Чим нижче знайдено дефект, тим дешевше виправлення і точніша локалізація; big bang економить на підготовці, але платить пошуком дефекту по всій системі.
    • Мета приймального рівня — не знайти дефекти, а ухвалити рішення про готовність; виконують його користувачі й бізнес, а не команда тестування.
    • У V-моделі кожен рівень дзеркалить етап розробки: тест-базис визначає рівень, і тести рівня можна проєктувати, щойно готовий відповідний документ.

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

    • «Назвіть рівні тестування і поясніть різницю між ними.» Інтерв'юер чекає не перелік назв, а різницю в об'єкті й меті. Сильна відповідь для кожного рівня називає, що перевіряємо і який клас дефектів там ловиться.
    • «Чим інтеграційне тестування відрізняється від системного?» Класична перевірка на розуміння: інтеграційне дивиться на стики між частинами, системне — на систему цілком проти вимог. Якщо відповідь зводиться до «інтеграційне — це менше, системне — більше», це провал.
    • «Що таке big bang, top-down, bottom-up? Що таке stub і driver?» Тут дивляться, чи розумієш ціну кожного підходу: big bang — дорога локалізація, top-down — потрібні заглушки, bottom-up — драйвери.
    • «Чим UAT відрізняється від системного тестування?» Очікують різницю в меті (рішення про готовність vs пошук дефектів), виконавцях і тест-базисі.
    • «Alpha vs beta?» Перевірка на точність: місце і контроль, а не «ступінь сирості».
    • «Регресійне тестування — це який рівень?» Питання-пастка на межу «рівні vs види»: регресія — вид, застосовний на будь-якому рівні.
    • «Навіщо мануальному QA знати про unit-тести?» Дивляться на зрілість: розумієш ти покриття нижніх рівнів як вхідні дані для свого ручного фокусу — чи вважаєш усе, що не UI, чужою територією.

    Джерела

    • ISTQB CTFL Syllabus 4.0 — глава покриває розділ 2.2.1 «Test Levels» (п'ять рівнів, форми приймального тестування).
    • ISTQB Glossary — канонічні означення: test level, component testing, stub, driver, alpha/beta testing.
    • Martin Fowler — UnitTest — що таке unit-тест, межі ізоляції та чому означення «модуля» різниться між командами.
    • Ham Vocke — The Practical Test Pyramid (martinfowler.com) — як рівні співвідносяться з вартістю і швидкістю тестів у сучасному стеку.