Понимание архитектур мобильных приложений

Прежде чем эффективно тестировать мобильное приложение, нужно понять, как оно было создано. Архитектура напрямую определяет, какие инструменты вы используете, какие типы багов ожидать и на чём сфокусировать усилия тестирования.

Существует три основных подхода к созданию мобильных приложений, каждый со своими последствиями для тестирования.

Нативные приложения

Нативные приложения создаются специально для одной платформы с использованием официального языка и SDK.

Характеристики

ПлатформаЯзыкIDEUI-фреймворк
iOSSwift или Objective-CXcodeUIKit или SwiftUI
AndroidKotlin или JavaAndroid StudioJetpack Compose или XML Views

Примеры: Apple Maps, Google Maps, большинство банковских приложений, Instagram (в основном нативный).

Последствия для тестирования

Преимущества для тестировщиков:

  • Полный доступ к платформо-специфичным инструментам тестирования (XCUITest, Espresso)
  • Предсказуемое поведение — следует гайдлайнам дизайна платформы
  • Лучшая производительность — меньше багов, связанных с performance
  • Прямой доступ ко всему оборудованию и API устройства

Вызовы для тестировщиков:

  • Необходимы отдельные наборы тестов для iOS и Android
  • Требуется знание обоих экосистем тестирования
  • Два кодовых базы означают два источника багов
  • Больший общий объём тестирования (2x платформы)

Инструменты нативного тестирования

Стек тестирования iOS:

XCTest → Unit-тесты
XCUITest → UI-автоматизация
Instruments → Профилирование производительности

Стек тестирования Android:

JUnit + Mockito → Unit-тесты
Espresso → UI-автоматизация (in-process)
UI Automator → UI-автоматизация (cross-process)
Android Profiler → Профилирование производительности

Гибридные приложения

Гибридные приложения оборачивают веб-технологии (HTML, CSS, JavaScript) в нативный контейнер с компонентом WebView.

Характеристики

АспектДетали
Основная технологияHTML/CSS/JavaScript
КонтейнерНативная оболочка с WebView
ФреймворкиCordova, Ionic, PhoneGap
Доступ к устройствуЧерез плагины/мосты
ДистрибуцияApp Store / Play Store

Как работают гибридные приложения

┌─────────────────────────┐
│    Нативная оболочка     │
│  ┌───────────────────┐  │
│  │     WebView        │  │
│  │  ┌─────────────┐  │  │
│  │  │  HTML/CSS/JS │  │  │
│  │  │  (Ваше App) │  │  │
│  │  └─────────────┘  │  │
│  └───────────────────┘  │
│  ┌───────────────────┐  │
│  │  Нативные плагины  │  │
│  │  (Камера, GPS...) │  │
│  └───────────────────┘  │
└─────────────────────────┘

Проблема WebView

Компонент WebView — крупнейший источник багов в гибридных приложениях:

  • Android: WebView основан на Chrome, но поставляется отдельно и обновляется независимо
  • iOS: WKWebView использует движок рендеринга Safari, более консистентный, но различается между версиями iOS
  • Samsung: Браузер Samsung Internet может влиять на поведение WebView на устройствах Samsung

Кроссплатформенные приложения

Кроссплатформенные фреймворки позволяют писать код один раз и развёртывать на iOS и Android с более нативным опытом, чем гибридные приложения.

Основные фреймворки

ФреймворкЯзыкРендерингКомпания
React NativeJavaScript/TypeScriptНативные компоненты через мостMeta
FlutterDartСобственный движок (Skia/Impeller)Google
Kotlin MultiplatformKotlinНативный UI на каждой платформеJetBrains
.NET MAUIC#Нативные элементы управленияMicrosoft

React Native

React Native использует JavaScript-мост для связи с нативными компонентами UI:

JavaScript-поток ←→ Мост ←→ Нативный поток
  (Ваш код)        (JSON)  (Рендеринг UI)

Flutter

Flutter использует принципиально другой подход — рендерит всё собственным движком:

Dart-код → Движок Skia/Impeller → Пиксели на экране
(Нативные UI-компоненты не используются)

Сравнение для тестировщиков

АспектНативныеГибридныеReact NativeFlutter
ПроизводительностьЛучшаяХудшаяХорошаяОчень хорошая
Доступ к APIПолныйЧерез плагиныЧерез модулиЧерез плагины
Консистентность UIНативнаяВеб-подобнаяПочти нативнаяПопиксельно идентичная
ИнструментыПлатформо-специфичныеВеб + мобильныеDetox, Appiumflutter_test, Appium
ОтладкаПлатформенныеDevTools + нативныеReact DevTools + нативныеFlutter Inspector
Очаги баговEdge case-ы платформыРендеринг WebViewПроблемы мостаБаги виджетов

Стратегии тестирования по архитектуре

Стратегия для нативных приложений

Фокус на платформо-специфичном поведении:

  1. Отдельные планы тестирования для iOS и Android
  2. Платформо-специфичные UI-тесты на XCUITest (iOS) и Espresso (Android)
  3. Общие API-тесты, валидирующие поведение бэкенда
  4. Тестирование матрицы устройств, приоритизированное по аналитике пользователей

Стратегия для гибридных приложений

Фокус на консистентности WebView:

  1. Кросс-девайсное тестирование WebView — тестирование на разных версиях WebView
  2. Верификация плагинов — тестирование каждого нативного плагина на обеих платформах
  3. Тестирование производительности — гибридные приложения склонны к медлительности
  4. Офлайн-поведение — кэширование WebView может приводить к устаревшему контенту
  5. Тестирование сбоев моста — что происходит, когда вызов нативного плагина падает?

Стратегия для приложений React Native

Фокус на надёжности моста:

  1. Производительность моста — отслеживание потерянных кадров при интенсивном трафике
  2. Тестирование нативных модулей — платформо-специфичные модули требуют специфичных тестов
  3. Тестирование hot reload — проверка, что hot reload не маскирует проблемы
  4. Обнаружение утечек памяти — коммуникация через мост может приводить к утечкам
  5. Совместимость библиотек — экосистема React Native развивается быстро

Стратегия для приложений Flutter

Фокус на рендеринге виджетов:

  1. Тестирование виджетов — встроенный фреймворк тестирования Flutter
  2. Тестирование platform channels — проверка связи между Dart и нативным кодом
  3. Тестирование доступности — Flutter требует явных аннотаций semantics
  4. Golden image тестирование — сравнение UI с эталонными скриншотами
  5. Performance overlay — мониторинг производительности рендеринга

Упражнение: Определите архитектуру

Для каждого описания определите наиболее вероятную архитектуру и назовите две проблемы тестирования.

  1. Банковское приложение с Face ID на iOS и отпечатком пальца на Android, с платформо-специфичными анимациями и скроллингом 60fps
  2. Внутренний корпоративный справочник с профилями сотрудников, созданный за 3 месяца командой веб-разработчиков
  3. Приложение соцсети, где лента выглядит идентично на iOS и Android, с плавными анимациями и кастомными UI-компонентами
Решение
  1. Нативное приложение — интеграция Face ID/отпечатка, платформо-специфичные анимации и высокая производительность. Проблемы: (a) Отдельные наборы тестов для каждой платформы; (b) Тестирование биометрии требует физических устройств.

  2. Гибридное приложение (Cordova/Ionic) — короткие сроки, команда веб-разработчиков, внутренний инструмент. Проблемы: (a) Различия рендеринга WebView; (b) Совместимость плагинов.

  3. Flutter-приложение — попиксельно идентичный UI с кастомными компонентами. Проблемы: (a) Доступность требует явных аннотаций semantics; (b) Кастомные виджеты нуждаются в визуальном регрессионном тестировании.

Советы из продакшен-опыта

Совет 1: Всегда проверяйте реальную архитектуру. Разработчики могут сказать, что приложение на React Native, но некоторые экраны могут быть нативными ради производительности.

Совет 2: Кроссплатформенность не означает «тестируем один раз». Даже Flutter по-разному взаимодействует с каждой ОС для разрешений, уведомлений, deep links и фоновой обработки.

Совет 3: Следите за циклами обновлений. Кроссплатформенные фреймворки обновляются часто. Включайте тестирование обновлений фреймворка в стратегию регрессии.

Ключевые выводы

  • Нативные приложения обеспечивают лучшую производительность и доступ к устройству, но требуют отдельных кодовых баз и наборов тестов
  • Гибридные приложения разделяют код, но страдают от несогласованности WebView
  • React Native связывает JavaScript с нативными компонентами — следите за багами моста
  • Flutter рендерит независимо от нативного UI — фокусируйтесь на тестировании виджетов и доступности
  • Архитектура приложения напрямую определяет инструменты, стратегию и фокус тестирования