Testing Vocabulary: Unit Tests, Mocks, Stubs, and More (англійською)
Пояснення основних термінів тестування програмного забезпечення: модульні тести, тести інтеграції, моделі, шаблони, підробки, покриття тестів, TDD, BDD, регресійне тестування і ще 20 термінів.
Тестування має свій власний словник — і частини його справді заплутані навіть для досвідчених розробників. У чому різниця між імітацією і стержнем? Коли це тест інтеграції проти тесту end-to-end? У цьому довіднику роз’ яснені найважливіші терміни тестування, щоб ви могли чітко обговорити стратегію тестування з вашою командою.
Типи тестів
Одиниця вимірювання
** Unit test ** тестує одну, ізольовану частину функціональності — зазвичай одну функцію або один метод класу — в ізоляції від її залежностей.
«Я написав тести для обчислення дисконтної логіки»
Ключові характеристики: швидкий, ізольований, без зовнішніх залежностей (база даних, файлова система, мережа).
Тестування інтеграції
** Перевірка інтеграції ** перевіряє, як декілька компонентів взаємодіють один з одним. Вона може включати реальну базу даних, реальний виклик API або декілька модулів, що працюють разом.
«Тести інтеграції перевіряють, що платіжна служба правильно викликає API розрахунку»
Повільніше, ніж тести модулів, але виявляє проблеми, які не враховуються тестами модулів (невідповідні інтерфейси, помилки налаштування тощо).
Елементи 2-го типу (англ. 2-type elements)
** End-to-end тест ** тестує весь поток програми з точки зору користувача - від інтерфейсу через backend до бази даних і назад. Інструменти: Cypress, Playwright, Selenium.
Наші E2E тести імітують реєстрацію користувача, входять в систему і завершують покупку
Найповільніший і найдорожчий у обслуговуванні, але ловить найбільш реальні помилки.
Димовий тест
** Смоук- тест ** — це швидкий набір базових перевірок, які перевіряють запуск програми і роботу основних функцій. Запускати після розгортання, щоб негайно виявити критичні помилки.
«Ми завжди запускаємо димові тести після розгортання — якщо сторінка входу завантажується і база даних відповідає, ми продовжуємо»
Регресійний тест
** Регресійний тест ** перевіряє, чи зміна не порушила існуючі функціональні можливості. Після виправлення вади, буде написано регресійний тест, щоб переконатися, що ця помилка не повториться.
Після рефакторингу модуля auth, всі регресійні тести пройшли
Випробування ефективності
** Перевірка продуктивності ** вимірює поведінку системи під навантаженням — часи відповіді, пропускну здатність, використання ресурсів.
Варіанти: тест навантаження (нормальна очікувана навантаження), тест напруги (над нормальною пропускною здатністю), тест на різке збільшення навантаження (раптові різкі підвищення навантаження).
Тест безпеки
** Перевірка безпеки ** шукає вразливості у програмі. Включає перевірки OWASP, тестування проникнення і автоматичне сканування.
Перевірка прийнятності
** Перевірка прийнятності ** перевіряє, чи відповідає функція бізнес- вимогам і готова до прийняття. Зазвичай засновано на критеріях прийняття, написаних у історіях користувачів.
Дві категорії: звичайні, шкідливі, шкідливі, шкідливі
Ці терміни часто плутають. Вони всі є «тестовими подвійними» — заміни для реальних залежностей, використовуваних в тестах.
Mock
** mock ** це тестовий дубль, який перевіряє * поведінку * — зокрема, чи були певні методи викликані, з правильними аргументами, правильну кількість разів. Якщо очікуваного виклику не відбудеться, перевірка зазнає невдачі.
«Я насміхався над службою електронної пошти і перевірив, що вона була викликана один раз з правильною адресою отримувача»
Stub
** stub ** — це тестовий дублікат, який повертає * заздалегідь визначені відповіді * на виклики методів. Він не робить жодних тверджень про те, як його використовувати — він просто надає консервовані дані.
«Я замінив репозиторий користувача, щоб повернути фіксовану об’єкт користувача — тому тест не потребує бази даних»
** Ключова відмінність: ** Моки перевіряють * виклики були зроблені *. «Статті» (англ.
Fake
** fake ** — це спрощена, але працююча реалізація залежності, наприклад, база даних у пам’ яті замість справжньої, або черга повідомлень у пам’ яті. Складніше, ніж звичайний фрагмент, але легше, ніж справжня річ.
Spy
** spy ** — це тестовий дублікат, який обгортає реальний об’ єкт і записує, яким чином його використовували. На відміну від мока (який замінює повністю), шпигун викликає через реальну реалізацію за замовчуванням.
Випробування якості
Кодування (кодування)
** Охоплення тестування ** вимірює відсоток коду, який виконується за допомогою тестів. Зазвичай розбивається на:
- ** Покриття рядків ** — % виконаних рядків
- ** Покриття гілок ** — % виконаних гілок (шляхи if/else)
«Ми маємо 80% покриття лінії — але є не покриті гілки в обробці помилок.»
Висока ступінь покриття є метою, але 100% покриття не означає, що тести хороші. Покриття вимірює кількість, а не якість.
Assertion
** твердження ** — це вираз у тесті, який перевіряє очікувану умову. Якщо твердження зазнає невдачі, то і тест зазнає невдачі.
assert result == 42абоexpect(result).toBe(42)
Випробувальний полігон
** Набір тестів ** — це набір тестів — це може бути набір всіх тестів у файлі, класі або у всьому тестовому проекті.
«Повний тестовий набір займає 12 хвилин, щоб запустити на CI.»
Профілактичні дослідження
flaky test це тест, який іноді проходить, а іноді не проходить без будь-яких змін коду — зазвичай через проблеми з часом, залежності від порядку тестування або ненадійність зовнішньої служби.
Цей тест є неефективним — він провалюється приблизно в 1 з 10 запусків на CI
Неякісні тести знижують довіру до набору тестів: коли тести випадково зазнають невдачі, справжні невдачі ігноруються.
Тестування підходів
ТДД (Test-Driven Development)
** TDD ** це практика розробки, де ви пишете тест * перед * кодом:
- Написати тест на невдачу
- Напишіть мінімальний код, щоб його було прийнято
- Refactor
Цикл називається Red-Green-Refactor.
БДД (Behavior-Driven Development)
** BDD ** є розширенням TDD, де тести написані простою мовою, що описує поведінку. Тести структуровані так: ** Заданий ** [контекст] ** Коли ** [дія] ** Тоді ** [очікуваний результат]. Інструменти: Cucumber, SpecFlow, Gherkin.
Якщо користувач зареєстрований, то після натискання кнопки «Експорт» завантажується файл CSV
АТД (Acceptance Test-Driven Development)
** ATDD ** включає написання приймальних тестів перед початком розробки, співпрацюючи з власниками продукту і зацікавленими сторонами, щоб визначити, що означає «створено».
Випробування CI/CD
Випробування трубопроводу
** Тестовий конвеєр ** є автоматизованою послідовністю тестів, що виконуються на кожному затвердженні коду або PR — зазвичай: тести модулів → тести інтеграції → (тестування E2E необов’ язкове).
Тестовий бігун
** Програма для виконання тестів ** — це інструмент, який знаходить і виконує тести, а також повідомляє про їх результати. Приклади: Jest (JavaScript), pytest (Python), JUnit (Java), RSpec (Ruby).
Тест-драйв
У ** звіті про тестування ** наведено підсумки успішних, невдалих або пропущених тестів, а також повідомлення про час і помилки. Створено тестовим запуском, часто публікується на панелях CI.
Краткий справочник
| Term | One-liner |
|---|---|
| Unit test | Tests one function/class in isolation |
| Integration test | Tests how components work together |
| E2E test | Tests full user flows end-to-end |
| Smoke test | Quick check that core functionality works after deploy |
| Regression test | Ensures a bug fix doesn’t reappear |
| Mock | Verifies that specific calls were made |
| Stub | Returns fixed data; no behaviour verification |
| Fake | Simplified but working implementation |
| Spy | Wraps real object; records calls |
| Flaky test | Fails non-deterministically |
| TDD | Write test first, then code |
| BDD | Tests describe behaviour in plain language |
| Coverage | % of code executed by tests |
Національні мови: рідкісні мови в окремих регіонах
Будьмо чесними - розуміння технічної термінології - це тільки половина битви. Справжній виклик для розробників, які вивчають професійну англійську, часто полягає у тому, як ви поширюєте ці знання у команді. Це не просто про те, щоб знати, що означає «тестування модулів»; це про формулювання вашого зворотнього зв’язку, пояснення вашого підходу і ефективне співробітництво з колегами, які можуть мати різні джерела або рівень досвіду. Розгляньте таке: старший розробник, який переглядає ваш запит на збирання, може сказати: « Це добре, але чи можете ви додати деякі додаткові * надійні* перевірки до цих тестів модулів? Нам потрібно переконатися, що крайні випадки повністю покриті. “Ця фраза - “більш асертивна” - не відразу очевидна в своєму значенні; це означає, що потрібна більша впевненість у здатності тесту виявити потенційні проблеми. Аналогічно, повідомлення Slack з проханням про допомогу може бути сформулюване так: «Чи може хтось пояснити, як використовувати можливості насмішок jest, щоб ізольувати цей компонент?» Слово «можливості» підступно переміщує розмову від простого *використання * насмішок до розуміння їх потенціалу - це запрошує обговорення стратегічного застосування.
Інша поширена ситуація полягає у поясненні вашої стратегії тестування під час перегляду коду. Замість того, щоб сказати « Я використовую шаблони », що може звучати дещо оборонно, ви можете сказати: « Щоб полегшити фокусоване тестування модулів, я використовую шаблони для зовнішніх залежностей, що дозволяє мені перевірити, що основна логіка функціонує правильно у окремому режимі ». Зауважте, що тут використано більш формальний лексикон — це демонструє глибше розуміння того, « чому » за цією технікою. Цей підхід особливо важливий при співпраці з міжнародними командами, де прямі переклади можуть не вловлювати тонкощі англійського технічного словника. Бути точним і ретельно вибирати свої слова може уникнути непорозумінь і збудувати довіру у команді розробників. Також важливо пам’ятати, що запитання про пояснення - “Чи можете ви розібратися, що ви маєте на увазі під “надійним” в цьому контексті?” - цілком прийнятно, демонструючи бажання вчитися і покращувати комунікацію.
Нарешті, при написанні описів PR, чіткість є найважливішою. Уникайте нечітких вказівок на зразок « Тестування завершено ». Замість цього спробуйте щось більш описове: « Реалізовано тести модулів, які охоплюють потоки розпізнавання ядра за допомогою Jest mocking для служби бази даних користувача. Покриття тестування на даний момент становить 85%. » Це надає негайний контекст і демонструє рівень деталізації, який очікується в професійних умовах. Це також надає змогу рецензентам швидко оцінити обсяг ваших зусиль з тестування.
Ось приклад того, як ви можете використовувати jest для змальовування залежності:
jest --env nodeargs --maxWorkers 1 --testEnvironment jsdom --coverageReporters cli --coveragePathMap ./coverage/pathmap.json --collectCoverageFrom="./src/**/*.js" --testName=myTest
Ця команда використовує потужні можливості jest для вилучення компонента для тестування, зосереджуючись на його внутрішній логіці без покладання на зовнішні залежності. Це ключова концепція при обговоренні стратегічного використання моків і заголовків.