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

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

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

    Зміст

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

    У роботі це розуміння потрібне щодня, навіть якщо ти ніколи не напишеш жодного 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-тест: браузер не стартує (тест не просить page) — жодної мережі, лише логіка функції
    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-рівень і пропускаєш стики.
    • Виглядає як «смоук і регресія — це теж рівні», а насправді це види/типи тестування, які існують на кожному рівні.
    • Виглядає як «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 v4.0 — пʼять рівнів у v4.0 (інтеграційний розділено на component integration і system integration) і межа «рівні — не види тестування».

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

    • ISTQB CTFL Syllabus v4.0 — компонентне тестування: обʼєкт, виконавці й типовий клас дефектів на нижньому рівні.
    • Martin Fowler — Unit Test (bliki) — чому термін «unit» неоднозначний: межу модуля визначає команда, тести пишуть самі програмісти своїм інструментарієм, і вони мають бути суттєво швидшими за решту.
    • Ham Vocke — The Practical Test Pyramid — піраміда тестування: чому дефекти дешевше ловити на нижніх рівнях — розгорнуто в розділі «Автоматизація».

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

    • ISTQB CTFL Syllabus v4.0 — два інтеграційні рівні й дефекти, які живуть саме на стиках модулів і систем.
    • ISTQB Glossary — канонічні означення дублерів, потрібних нижнім рівням: stub — заготовлені відповіді, driver — тимчасова заміна, яка смикає в ізоляції.

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

    • ISTQB CTFL Syllabus v4.0 — системний рівень: обʼєкт — поведінка продукту цілком проти вимог, виконавець — незалежна команда тестування.

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

    • ISTQB CTFL Syllabus v4.0 — пʼять форм приймального тестування — UAT, операційне, контрактне й регуляторне, альфа і бета — і мета рівня: рішення про готовність, а не пошук дефектів.
    • ISTQB Glossary — межа alpha/beta проходить за місцем: альфа — у тестовому середовищі розробника, бета — на зовнішньому майданчику.

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

    • ISTQB CTFL Syllabus v4.0 — V-модель: кожен рівень тестування дзеркалить етап розробки, а тестова основа рівня — документ відповідного етапу.

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

    • ISTQB CTFL Syllabus v4.0 — чим рівні відрізняються один від одного: тестова основа, типові виконавці й обʼєкт тестування на кожному.

    Пояснення

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

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

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