QASenior

Наскрізне тестування (E2E)

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

Доводить
Що частини тримаються разом
Ціна кейса
Найвища серед тестів
Правильна кількість
Мала, не нульова

Наскрізний набір одного магазину на одному екрані — дванадцять маршрутів, шов, який доводить кожен, і що в ньому справжнє

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

#МаршрутШов, який доводить лише вінСправжнє й підміненеЧас
1Знайти «синій светр», відкрити SKU 30417, додати, оплатити тестовою карткою, отримати номер замовленняФронтенд → оформлення → платежі → замовлення → черга → склад: замовлення приходить із правильними рядками й сумами (регресійний рядок 16)Усе своє — справжнє; пісочниця платіжного провайдера; тестовий ендпоінт складу90 с
2Зареєструватися, підтвердити пошту, увійти, перезавантажити — досі в акаунті. У Chromium і у WebKitCookie сесії крізь CDN, фронтенд і сервіс акаунтів, у справжньому рушії браузера (регресійний рядок 3)Справжнє; тестовий режим поштового провайдера доставляє в тестову скриньку2 × 60 с
3Скинути забутий пароль за посиланням із листаПосилання, яке будує сервіс акаунтів, доставляє пошта, відкриває редирект CDN і яке приймають один разСправжнє; тестова скринька45 с
4Застосувати SPRING10, змінити кількість, оплатитиСума на екрані — це сума, яку просять списати платіжного провайдераСправжнє; пісочниця70 с
5Оплатити карткою з 3-D Secure: перехід на перевірку банку й назадРедирект із магазину й назад — у ту саму сесію й той самий кошикСправжнє; сторінка перевірки в пісочниці80 с
6Картку відхилено; оплатити ще раз іншою карткоюКошик переживає відмову, і після цього існує рівно одне замовленняСправжнє; картка відмови з пісочниці75 с
7Спитати асистента замовлень «де моє замовлення» про замовлення, яке маршрут щойно оформивВіджет чату → асистент → get_order → замовлення, і повернений статус на екраніСправжні інструменти; відповіді моделі відтворюються із запису, як на сторінці «Тестування LLM-продуктів»40 с
8Почати повернення протягом 30 днів; етикетка для повернення приходить листомПовернення → замовлення → пошта, з прикріпленою етикеткою, яку можна прочитатиСправжнє; сервіс етикеток перевізника замінено заглушкою, форму якої перевіряє контрактний тест60 с
9Склад підтверджує, що повернення прибуло; гроші повертаютьсяВебхук від складу → повернення коштів → платежі → лист, із сумою, яку сплатилиСправжнє; вебхук складу надсилає тестова обвʼязка90 с
10Змінити адресу доставки після замовлення, до відвантаженняНова адреса доходить до складу раніше, ніж замовлення зберутьСправжнє50 с
11Оформити замовлення як гість, потім створити акаунт зі сторінки підтвердженняАнонімні кошик і замовлення стають клієнтськими й зʼявляються в його історії замовленьСправжнє70 с
12Агент підтримки повертає гроші за пошкоджений товар у бек-офісіБек-офіс і магазин ділять замовлення й платежі; агент може повернути гроші, але не може змінити цінуСправжнє; вхід для персоналу замінено тестовою особою60 с
Кожен із дванадцяти маршрутів існує заради одного шва — місця, де дві справжні частини магазину зустрічаються в розгорнутій системі і куди не дістає жоден нижчий тест, — і зелені номери ставлять кожен маршрут на його шов так, як його називає третя колонка таблиці. Cookie в справжньому рушії браузера (2), посилання з листа крізь CDN (3), сума, яку просять списати платіжного провайдера (4), і перехід на 3-D Secure та назад (5), рівно одне замовлення після відхиленої картки (6), шлях замовлення крізь чергу до складу (1, 10), виклик інструмента асистентом у замовлення (7), підтвердження складу, що запускає повернення коштів (9), етикетка для повернення (8), гостьове замовлення, що стає клієнтським (11), і межі бек-офісу (12). Усе, що маршрут перетинає, крім свого шва, уже доведено нижче, — тому маршрутів дванадцять, а не чотириста.

Що доводить лише наскрізний тест

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

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

Розділіть маршрут на відрізки й протестуйте кожен із замінником там, де мала б бути наступна частина, — і кожен відрізок може пройти, коли маршрут падає. Дефект тут не в жодній частині: справжня черга між замовленнями й складом відмовляє повідомленню понад 256 КБ, а замінник у відрізку 3 приймав будь-що, тож велике замовлення проходить кожен тест відрізка й ніколи не доходить до складу. Замінник може поводитися лише так, як, на думку автора, поводиться справжня річ, — а саме це й під сумнівом на шві. Це те, що купує наскрізний тест і чого не може ніщо нижче: стики, запущені насправді. Кожен випадок наприкінці сторінки впав на такому стику — тест зупинився просто перед ним, або запускався проти замінника, або в місці, влаштованому не як продакшн.

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

Піраміда, кубок, стільник — три форми, один аргумент про ціну

Майк Кон описав піраміду тестів у книжці «Succeeding with Agile» 2009 року, а нотатка Мартіна Фаулера 2012 року зробила її відомою: багато юніт-тестів унизу, менше тестів сервісів посередині, мало наскрізних угорі — бо тести, що проходять наскрізь крізь інтерфейс, крихкі, дорогі в написанні й довго виконуються. Глосарій ISTQB тепер має для неї окремий запис. Відтоді намалювали й інші форми — кожну люди, що працювали над іншим видом систем, — і таблиця ставить їх поруч.

ФормаЗвідкиДе основна масаНаскрізніПасує, коли
ПірамідаМайк Кон, 2009; Мартін Фаулер, 2012Юніт-тестиМало, угоріБільшість логіки живе в одній кодовій базі
70 / 20 / 10Google Testing Blog, 201570% юніт, 20% інтеграційні10% — «як добра перша оцінка»Команді потрібне число, з якого почати
КубокКент Доддс, 2018Інтеграційні — «здебільшого інтеграційні», зі статичними перевірками в основіКількаФронтенд, де осмислена одиниця — компонент разом із дочірніми
СтільникSpotify, 2018Інтеграційні тести крізь власний API кожного сервісу«ще менше… (в ідеалі жодного)»Мікросервіси, де складність живе у взаємодіях
Ріжок морозиваАнтипатерн, який називають і Фаулер, і GoogleНаскрізні й ручні тестиБільшість наборуНіколи навмисно

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

Піраміду зазвичай малюють як пораду про пропорції, і за кількістю тести магазину — хрестоматійна піраміда: 2 140 юніт-кейсів, 406 API-, контрактних та інтеграційних кейсів і дванадцять маршрутів. Порахуйте ті самі тести за хвилинами — і форма перевертається. Юніт-кейси завершуються за 70 секунд, середній шар — приблизно за девʼять хвилин, а дванадцять маршрутів — приблизно за тринадцять: пів відсотка кейсів коштують більше часу, ніж усе інше разом, і це ще без часу, витраченого, коли один із них падає з причини, що не стосується зміни. У цьому весь аргумент за малу верхівку: не в тому, що наскрізні тести погані, а в тому, що кожен із них — найдорожчий тест у команді, тож він має доводити те, чого не доведе ніщо дешевше.

Чого коштує червоний маршрут — арифметика нестабільності

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

Розмір робить це ймовірнішим. Google виявив, що за тиждень нестабільними були 0,5% його малих тестів, 1,6% середніх і 14% великих. Маршрут — найбільший тест, який має команда. А малі ймовірності накопичуються: якщо кожен кейс падає без причини з імовірністю p, запуск n кейсів стає червоним, коли все гаразд, з імовірністю 1 − (1 − p)ⁿ. Таблиця це рахує.

Маршрутів у наборіКожен нестабільний у 0,5% запусків2% запусків5% запусків
125,8%21,5%46,0%
6026,0%70,2%95,4%
40086,5%≈ 100%≈ 100%
Малі ймовірності збою накопичуються. Якщо кожен маршрут падає без причини в частці p запусків, запуск n маршрутів стає червоним, коли все гаразд, з імовірністю 1 − (1 − p)^n, і крива росте швидше, ніж підказує інтуїція. При 2% на маршрут шістдесят маршрутів червоні в семи запусках із десяти; за найкращої ймовірності з таблиці чотириста червоні майже девʼять разів із десяти. Набір, що здебільшого червоний, перестають читати, — тому нові маршрути перестають додавати захисту задовго до того, як перестають додавати вартості. Магазин тримає дванадцять: по 0,5% кожен вони червоніють без причини приблизно раз на сімнадцять запусків — досить рідко, щоб кожен червоний запуск розслідували, а не перезапускали.

Читайте таблицю як бюджет, а не як скаргу. Набір із шістдесяти маршрутів по 2% кожен червоний у семи запусках із десяти, коли все гаразд. Чотириста маршрутів за найкращої ймовірності з таблиці червоні майже дев’ять разів із десяти. Тому «просто додамо повтори» — хибний перший крок, а вдесятеро більше маршрутів — не вдесятеро більше захисту, а набір, який ігноруватимуть. Дванадцять маршрутів по 0,5% червоніють без причини приблизно раз на сімнадцять запусків — а таке команда може дозволити собі розслідувати щоразу.

Чому маршрут почервонівЩо це насправді означаєЩо це прибирає
Система справді зламанаПричина, заради якої маршрут існує.Ніщо не має — усе нижче є податком за збереження цього сигналу.
Тест перевірив раніше, ніж система завершилаПомилка часу в тесті — найбільша окрема причина нестабільності в дослідженні Ло та колег («Регресійне тестування»).Чекати на умову: лист у скриньці, замовлення на складі.
Дані були не такими, як припускав тестСпільний стан між маршрутами чи людьми.Кожен маршрут створює власних клієнта, замовлення й картку — і прибирає їх.
Елемент перемістився при редизайніУтримання, а не дефект.Шукати елементи за роллю й назвою або за test-id, ніколи за CSS-класом чи позицією.
Третя сторона повільна або лежитьВідкладене рішення: які залежності належать тесту.Вирішити письмово, для кожної залежності, — таблиця через розділ.

Обирайте маршрути, а не фічі

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

  • Шлях грошей — маршрути 1, 4–6

    Знайти, додати, оплатити — і замовлення приходить. Якщо наскрізний тест лише один, то це маршрут 1: він перетинає кожен сервіс, від якого залежить бізнес.

  • Увійти й лишитися — маршрути 2, 3, 11

    Зареєструватися, увійти, лишитися в акаунті після перезавантаження, відновити пароль. Поведінка сесій і cookie невидима для кожного нижчого тесту.

  • Через межу — маршрути 7–10

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

  • Жорстке правило — маршрут 12

    Межа доступу, обовʼязкове розкриття, перевірка віку. Місця, де помилка — юридична подія, а не тікет у підтримку.

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

Як зробити дванадцять маршрутів такими, яким вірять

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

  • Чекайте на умову, ніколи на тривалість. Фіксована пауза закоротка на завантаженій машині й марна на швидкій; очікування елемента, листа чи запису на складі і швидше, і стабільніше.
  • Дайте кожному маршруту власні дані. Він створює потрібних йому клієнта, замовлення й подарункову картку — і прибирає їх після себе. Маршрут, що залежить від запису, створеного кимось іншим, падає у вівторок без причини.
  • Знаходьте елементи так, як це робить людина, — за роллю й видимою назвою — або за , і ніколи за CSS-класом чи позицією: обидва змінюються щоразу, коли дизайнер торкається сторінки.
  • Керуйте годинником. Маршрут, що залежить від сьогоднішньої дати, проходить у березні й падає в останній день місяця; задайте дату — а тоді навмисно пройдіть дати, що ламають речі, — 30-й день повернення, 29 лютого.
  • Збирайте при падінні досить, щоб діагностувати без відтворення: трасу, відео, мережевий лог і консоль браузера. Ціна червоного маршруту — розслідування, і саме артефакти його скорочують.

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

ЗалежністьУ маршрутах магазинуЧому
Платіжний провайдерСправжній, у пісочниціШлях грошей — суть маршрутів 1 і 4–6; у пісочниці є картки для успіху, відмови й 3-D Secure.
Поштовий провайдерСправжній, у тестовому режимі, у тестову скринькуМаршрути 2, 3, 8 і 9 закінчуються листом, за яким клієнт діє.
Сервіс етикеток перевізникаЗаглушка, яку перевіряє контрактний тестПеревізник не має пісочниці; маршрут доводить бік повернення, що належить магазину.
Модель асистентаВідтворюється із записуМаршрут 7 доводить сантехніку; відповіді оцінює нічне оцінювання.
Аналітика, карти, маркетинговий чатЗаблоковані на межі мережіНе входять у результат жодного маршруту — і найчастіше дають повільні випадкові червоні.

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

Три збої, де тест зупинився за крок до кінця

У жодному з цих випадків тестування не пропустили. Щоразу тест запускався й проходив. Він перевіряв крок до потрібного результату, зупинявся просто перед швом, де жив дефект, або запускався в місці, влаштованому не як продакшн.

ЗбійЩо тестували — і що сталосяКрок, до якого тест не дійшов
Windows Azure, 29 лютого 2012Сам баг дня 29 лютого розповідає сторінка «Моделювання даних». Тієї ночі, лагодячи сім наполовину оновлених кластерів, інженери перевірили виправлення на одному сервері: його віртуальні машини «запустилися успішно й виглядали здоровими». Пакет також ніс мережевий плагін, зібраний для новішого агента. Його розгорнули на всі сервери цих кластерів одночасно, і їхні віртуальні машини втратили мережу.Результат, потрібний клієнту: чи можу я дістатися до своєї машини? Microsoft написала, що тест не перевіряв мережевого доступу до віртуальних машин; другу спробу о 3:40 ночі перевірили, «цього разу підтвердивши доступ до ВМ».
TSB, 22 квітня 2018Вікенд міграції розповідає сторінка «Планування релізу». Продакшн працював у двох дата-центрах поруч. 28 лютого форум із тестування вирішив перевіряти продуктивність обох разом; потім банк прийняв пропозицію тестувати один, щоб не зупиняти живі сервіси на кшталт банкоматів. Після запуску клієнт входив через один дата-центр, а наступний запит ішов до іншого, де сесії не було: «ваша сесія закінчилася».Топологія продакшну. Постанова FCA: сервіси можуть працювати наскрізно з одним користувачем і не працювати під навантаженням, а якби тест провели в обох дата-центрах, проблему, ймовірно, виявили б.
Boeing Starliner, 20 грудня 2019Безпілотний випробувальний політ пропустив увімкнення двигуна для виходу на орбіту: годинник місії в капсулі був хибним, тож ПЗ вважало, що це сталося кілька годин тому, і корабель так і не долетів до космічної станції. Boeing тестував ПЗ шматками. Спільна симуляція з виробником ракети зупинялася на відокремленні; увімкнення мало відбутися приблизно через пів години після старту. Друга помилка — хибна карта двигунів службового модуля — пройшла кваліфікаційний тест на емуляторі, що теж не мав правильної карти.Наступний шов. Керівник програми Boeing: якби той інтегрований тест тривав на кілька хвилин довше, він виявив би проблему. Замінник на шві доводить лише те, у що його збудували вірити.

Де це вироджується

Чесне обмеження в тому, що дванадцять маршрутів доводять, що дванадцять шляхів спрацювали один раз, в одному середовищі, з одним набором даних. Наближене до продакшну — не продакшн: справжній трафік, справжні треті сторони й справжній календар приходять лише після розгортання. Там естафету переймають smoke-ворота й синтетичний моніторинг, що за розкладом проганяють ті самі маршрути проти продакшну. А наскрізний набір не знайде дефекту на шляху, яким ніхто не пройшов; він лише стежить, щоб пройдені шляхи не ламалися непомітно.

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

Коли це застосовувати

Застосовуйте, коли

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

Уникайте, коли

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

Джерела й метод

На чому стоїть ця стаття

  • 12 джерел
  • 3 задокументовані збої
  • Перевірено 18 жовтня 2026 р.

Дослідження з Claude. Пошук і звірку першоджерел зроблено з Claude (Anthropic). Відбір, текст і перевірку фактів — редакція Anatomy of IT Product.

Було корисно?

Поділіться з тим, хто працює над тією ж задачею.