Тестування в мобільній розробці: що це, які види та як організувати

Автор: IT Sectr Опубліковано: 2026-03-31 Час читання: 9 хв

Тестування мобільних додатків — це процес перевірки того, що додаток працює коректно, не падає та відповідає вимогам. За даними Software Testing Help (2025), автоматизоване тестування скорочує час регресійних перевірок на 70–80% порівняно з ручним тестуванням. У цій статті розберемо рівні тестування, інструменти для iOS та Android, TDD та BDD, а також CI/CD для тестів.

Головне

  • Unit-тести перевіряють окремі функції та класи; інтеграційні — взаємодію модулів; E2E — повний користувацький сценарій.
  • iOS: XCTest для юніт-тестів, XCUITest для UI-тестів. Android: JUnit + Mockito + Espresso.
  • Кроссплатформенні фреймворки: Detox (React Native), Appium (універсальний), XCUITest (iOS).
  • TDD (Test-Driven Development) — спочатку тест, потім код; BDD — сценарії зрозумілою мовою.
  • CI/CD: тести запускаються автоматично при кожному пуші — це обов'язковий стандарт для комерційної розробки.

Рівні тестування: Unit, Integration, E2E

Unit-тестування

Unit-тести — основа тестування мобільних додатків. Вони перевіряють найменшу одиницю коду — одну функцію, метод або клас в ізоляції від решти системи. У мобільній розробці unit-тести пишуться на JUnit (Android) та XCTest (iOS). Хороший unit-тест має бути швидким, незалежним і повторюваним — він не повинен залежати від мережі, бази даних або UI-компонентів. Для ізоляції використовуються test doubles: моки, стаби та фейки.

Mockito (Java/Kotlin) та MockK (Kotlin-first) — популярні бібліотеки для створення мок-об'єктів на Android. На iOS для мокінгу використовуються OCMock, Cuckoo або ручні протоколи. Правило: unit-тести повинні покривати бізнес-логіку та моделі даних. UI-тести не повинні дублювати unit-тести — вони перевіряють взаємодію користувача з інтерфейсом.

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

Інтеграційні тести перевіряють взаємодію між компонентами: репозиторій з базою даних, ViewModel з API-сервісом, навігація між екранами. На відміну від unit-тестів, інтеграційні використовують реальні або наближені до реальності залежності (наприклад, in-memory база даних або mock-сервер). Robolectric — фреймворк для запуску Android-тестів на JVM без емулятора, що прискорює інтеграційні тести в 10 разів.

Snapshot-тести (Golden Tests) — особливий вид інтеграційних тестів, які порівнюють відрендерений UI-компонент з еталонним зображенням (snapshot). Якщо зовнішній вигляд змінився, тест падає — розробник бачить, що змінилося. Facebook SnapshotTestCase (iOS) та Shot (Android) — популярні інструменти для snapshot-тестування.

E2E та UI-тестування

E2E-тести (end-to-end) перевіряють повний користувацький сценарій від початку до кінця: запуск додатку, логін, виконання дії, перевірка результату. UI-тести — підмножина E2E, зосереджена на інтерфейсі. Інструменти: Espresso (Android), XCUITest (iOS), Detox (React Native). E2E-тести найповільніші, тому їх запускають окремо на CI — зазвичай на нічних збірках.

Інструменти iOS: XCTest та XCUITest

XCTest

XCTest — вбудований фреймворк Apple для unit-тестування мобільних додатків. XCTestRunner запускає тести на симуляторі або реальному пристрої. Тести успадковуються від XCTestCase, містять setUp та tearDown для підготовки та очищення. XCTest включає XCTAssert для перевірок (XCTAssertEqual, XCTAssertNil, XCTAssertTrue) та XCTWaiter для очікування асинхронних операцій.

Приклад простого XCTest-тесту: створення моделі User, перевірка коректності ініціалізації, форматування імені та підрахунку віку. Code Coverage в Xcode показує, які рядки коду покриті тестами — ціль для комерційних проєктів: мінімум 70–80% покриття бізнес-логіки. XCTest інтегрований з Xcode Server та CI-системами через xcodebuild test.

XCUITest

XCUITest — фреймворк Apple для UI-тестування. Працює через accessibility-ідентифікатори: XCUIElementQuery знаходить кнопки, поля введення, таблиці за label, identifier або типом. XCUITest записує послідовність дій (record/playback) та генерує код тесту. Важливо: всі UI-елементи повинні мати accessibilityIdentifier для стабільної роботи тестів.

Інструменти Android: JUnit, Espresso, Robolectric

JUnit та Mockito

JUnit — базовий фреймворк для модульного тестування мобільних додатків на Java/Kotlin. На Android використовується JUnit 4 (остання стабільна версія 4.13.2) та JUnit 5 для нових проєктів. Mockito — бібліотека для створення мок-об'єктів: when(mock.method()).thenReturn(value) — стандартний патерн для ізоляції тестованого класу від залежностей.

Приклад JUnit-тесту для Android:

java
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

@RunWith(MockitoJUnitRunner.class)
public class LoginViewModelTest {

    @Mock
    AuthRepository authRepository;

    @Test
    public void login_emptyEmail_returnsError() {
        LoginViewModel vm = new LoginViewModel(authRepository);
        String result = vm.login("", "password123");
        assertEquals("Email cannot be empty", result);
        verify(authRepository, never()).authenticate(any());
    }
}

Espresso та UI Automator

Espresso — фреймворк Google для UI-тестів Android. Espresso автоматично синхронізується з UI-потоком: onView(withId(R.id.button)).perform(click()).check(matches(isDisplayed())). Espresso простий у написанні та стабільний завдяки вбудованому очікуванню ідл-стану додатку. UI Automator — фреймворк для кросспрограмних тестів, який може взаємодіяти з системними елементами (діалогами дозволів, шторкою сповіщень).

Кроссплатформенні інструменти: Detox, Appium

Detox для React Native

Detox — сіро-сірий E2E-фреймворк для тестування React Native мобільних додатків від Wix. Detox працює на обох платформах з однієї кодової бази тестів, використовуючи Espresso (Android) та XCUITest (iOS) під капотом. Detox автоматично чекає, поки додаток стане ідл (немає анімацій, мережевих запитів, таймерів), і лише тоді виконує наступну дію.

Appium

Appium — універсальний кроссплатформенний фреймворк, що підтримує Android, iOS, Web та гібридні додатки. Appium використовує WebDriver протокол і підходить для будь-яких мов програмування (Java, Python, JS, Ruby). Appium Server працює як HTTP-сервер, який транслює команди в нативні UI Automator / XCUITest команди. Основний недолік Appium — швидкість: тести виконуються повільніше, ніж нативні Espresso або XCUITest.

Порівняння інструментів тестування iOS та Android
Критерій iOS Android
Unit-тести XCTest JUnit 4/5 + Mockito
UI-тести XCUITest Espresso, UI Automator
Snapshot-тести FBSnapshotTestCase Shot, Roborazzi
Автоматизація жестів XCUIGesture UiAutomator touch
Code Coverage Xcode Code Coverage Jacoco
CI інтеграція xcodebuild test Gradle connectedCheck

TDD та BDD: методології тестування

TDD: Test-Driven Development

TDD — методологія тестування мобільних додатків, при якій тест пишеться до реалізації коду. Цикл Red-Green-Refactor: (1) написати тест, який не проходить (Red), (2) написати мінімальний код, щоб тест пройшов (Green), (3) відрефакторити код, зберігаючи проходження тесту. TDD дає 100% покриття тестами нової функціональності та чисту архітектуру, оскільки тест — це перша специфікація вимоги.

BDD: Behaviour-Driven Development

BDD — розширення TDD, де тести пишуться природною мовою у форматі Given-When-Then. Given (контекст) — When (дія) — Then (очікуваний результат). BDD-тести зрозумілі всім учасникам команди: розробникам, тестувальникам, аналітикам та замовникам. Mock vs Stub vs Fake: Mock перевіряє взаємодію (чи був викликаний метод), Stub повертає фіксовані дані, Fake — спрощена робоча реалізація (наприклад, in-memory БД). В IT Sectr ми використовуємо TDD для критичної бізнес-логіки та BDD для приймальних сценаріїв.

Test Doubles — загальна назва для об'єктів, що замінюють реальні залежності в тестах. Їх чотири типи: Dummy (об'єкт для заповнення параметрів, не використовується), Stub (повертає задані значення), Spy (записує виклики для перевірки), Mock (визначає очікувані виклики). Розуміння різниці критично важливе для правильного проєктування тестів.

CI/CD та Device Farm

Автоматизація тестів в CI/CD

CI/CD — Continuous Integration та Continuous Delivery: практика автоматичної збірки та тестування мобільних додатків при кожній зміні коду. У мобільній розробці CI/CD пайплайн включає: лінтинг, unit-тести, інтеграційні тести, збірку APK/IPA та UI-тести. GitHub Actions та Bitrise — популярні платформи для мобільного CI/CD. Тести повинні виконуватися швидко: unit-тести за 1–2 хвилини, інтеграційні за 5–10, UI-тести за 15–30 хвилин.

Device Farm

Device Farm — ферма реальних пристроїв для тестування. Firebase Test Lab (Android) та Xcode Cloud (iOS) надають хмарний доступ до сотень моделей пристроїв. Device Farm виявляє проблеми, які не видно на емуляторах: особливості екранів різних розмірів, продуктивність на старих пристроях, проблеми з сумісністю. В IT Sectr ми використовуємо Firebase Test Lab для Android та Xcode Cloud для iOS на регулярній основі.

Часті запитання

Який відсоток покриття тестами вважається нормальним?

Для комерційних проєктів мінімум 70–80% покриття бізнес-логіки. UI-код покривати складніше — для нього достатньо 50%. Головне не відсоток, а якість тестів: тестуйте критичні сценарії, граничні випадки та обробку помилок.

Чим Mock відрізняється від Stub?

Mock перевіряє взаємодію — чи був викликаний певний метод з певними параметрами. Stub повертає заздалегідь задані дані. Mock перевіряє поведінку, Stub — стан.

Чи варто писати тести на UI?

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

Що таке Snapshot Test?

Snapshot Test (Golden Test) порівнює відрендерений UI-компонент з еталонним зображенням. Якщо зовнішній вигляд змінився (шрифт, відступ, колір), тест падає — розробник перевіряє, чи це усвідомлена зміна. Ідеально для компонентних бібліотек.

Як прискорити E2E-тести?

Запускайте E2E-тести паралельно на кількох пристроях, використовуйте Cloud Device Farm та розділяйте тести на незалежні групи. Оптимізуйте тести: мінімізуйте очікування, використовуйте моки для мережевих запитів.

Підсумки

  • Unit-тести — основа піраміди тестування: швидкі, ізольовані, покривають бізнес-логіку.
  • iOS: XCTest для unit, XCUITest для UI. Android: JUnit + Mockito, Espresso для UI, Robolectric для швидких інтеграційних тестів.
  • Кроссплатформенні фреймворки: Detox (React Native), Appium (універсальний), XCUITest (iOS-native).
  • TDD — тест до коду, BDD — сценарії мовою бізнесу (Given-When-Then).
  • CI/CD — автоматичний запуск тестів при кожному пуші обов'язковий для сучасної розробки.
  • Device Farm — тестування на реальних пристроях у хмарі для виявлення апаратних проблем.
  • Піраміда тестування: багато unit, менше інтеграційних, ще менше E2E — оптимальне співвідношення швидкості та покриття.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект