TL;DR

  • Espresso: Android-native, быстрый, надёжный, встроен в Android Studio
  • Appium: Кросс-платформа, много языков, black-box тестирование
  • Скорость: Espresso в 2-5x быстрее (работает in-process)
  • Надёжность: Espresso имеет автоматическую синхронизацию, меньше flaky тестов
  • Для Android-only: Espresso (рекомендован Google)
  • Для кросс-платформы: Appium (один codebase для Android + iOS)

Время чтения: 9 минут

Appium и Espresso — два ведущих фреймворка тестирования Android. Espresso — нативный фреймворк Google, созданный специально для Android. Appium — кросс-платформенный, поддерживает Android, iOS и другие с одним API.

Быстрое Сравнение

ФункцияEspressoAppium
ПлатформаТолько AndroidAndroid, iOS, Windows
ЯзыкиJava/KotlinЛюбой (Python, Java, JS и др.)
СкоростьОчень быстрыйСредняя
Тип тестовWhite-boxBlack-box
НастройкаПростая (Android Studio)Сложная (нужен сервер)
СинхронизацияАвтоматическаяЧасто нужны ручные ожидания
ПоддержкаGoogleOpen-source сообщество
CI/CDПросто (Gradle)Больше настройки

Различия Архитектуры

Архитектура Espresso

Espresso работает внутри процесса приложения:

Тест → Процесс App → UI Thread → Views
        ↓
   Один процесс = прямой доступ + авто-sync

Прямой доступ к UI thread позволяет автоматическую синхронизацию.

Архитектура Appium

Appium использует WebDriver протокол извне:

Тест → HTTP → Appium Server → UiAutomator2 → App
        ↓
   Внешний = гибкий, но медленнее

Внешнее общение добавляет задержку, но позволяет кросс-платформенное тестирование.

Примеры Тестов

Espresso Тест (Kotlin)

@RunWith(AndroidJUnit4::class)
class LoginTest {

    @get:Rule
    val activityRule = ActivityScenarioRule(LoginActivity::class.java)

    @Test
    fun userCanLogin() {
        // Ввод username
        onView(withId(R.id.username))
            .perform(typeText("testuser"), closeSoftKeyboard())

        // Ввод password
        onView(withId(R.id.password))
            .perform(typeText("secret"), closeSoftKeyboard())

        // Клик login
        onView(withId(R.id.loginButton))
            .perform(click())

        // Проверка welcome message
        onView(withText("Welcome"))
            .check(matches(isDisplayed()))
    }
}

Appium Тест (Python)

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class TestLogin:
    def setup_method(self):
        caps = {
            "platformName": "Android",
            "deviceName": "Pixel_6",
            "app": "/path/to/app.apk",
            "automationName": "UiAutomator2"
        }
        self.driver = webdriver.Remote("http://localhost:4723", caps)

    def teardown_method(self):
        self.driver.quit()

    def test_user_can_login(self):
        # Ввод username
        username = self.driver.find_element(AppiumBy.ID, "com.app:id/username")
        username.send_keys("testuser")

        # Ввод password
        password = self.driver.find_element(AppiumBy.ID, "com.app:id/password")
        password.send_keys("secret")

        # Клик login
        self.driver.find_element(AppiumBy.ID, "com.app:id/loginButton").click()

        # Ожидание и проверка
        WebDriverWait(self.driver, 10).until(
            EC.presence_of_element_located((AppiumBy.XPATH, "//*[@text='Welcome']"))
        )

Код Espresso более лаконичен с автоматической синхронизацией.

Бенчмарк Скорости

Тестирование 10-шагового user flow:

МетрикаEspressoAppium
Выполнение теста~5 секунд~15-25 секунд
Время стартаБыстроМедленно (нужен сервер)
Параллельные тестыПростоСложная настройка
Flaky тестыРедкоЧаще

In-process выполнение Espresso делает его значительно быстрее.

Синхронизация

Авто-Sync Espresso

// Espresso автоматически ждёт:
// - UI thread idle
// - Завершения AsyncTasks
// - Окончания анимаций

onView(withId(R.id.button))
    .perform(click())  // Ждёт автоматически

onView(withText("Success"))
    .check(matches(isDisplayed()))  // Явное ожидание не нужно

Ручные Ожидания Appium

# Appium часто нужны явные ожидания
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Ожидание элемента
element = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((AppiumBy.ID, "button"))
)
element.click()

# Снова ожидание для результата
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((AppiumBy.XPATH, "//*[@text='Success']"))
)

Автоматическая синхронизация Espresso значительно уменьшает flaky тесты.

Когда Выбрать Espresso

  1. Android-only приложение — iOS версия не нужна
  2. Приоритет скорости — быстрая обратная связь в CI/CD
  3. Нужна надёжность — авто-sync уменьшает flakiness
  4. Разработчики пишут тесты — тесты рядом с кодом
  5. Интеграция Android Studio — простая настройка и отладка

Когда Выбрать Appium

  1. Кросс-платформа — Android + iOS с общими тестами
  2. QA команда пишет тесты — гибкость языков (Python, Java)
  3. Black-box тестирование — тестирование APK без исходников
  4. Существующие Selenium навыки — знакомый WebDriver API
  5. Web + mobile гибрид — можно тестировать WebViews

Комбинирование Фреймворков

Некоторые команды используют оба:

Unit/Component Tests → Espresso (быстро, надёжно)
        ↓
Integration Tests → Espresso (in-process)
        ↓
E2E/Cross-Platform → Appium (iOS + Android)

Лучшее из обоих миров: Espresso для скорости, Appium для покрытия.

CI/CD Интеграция

Espresso в CI

# GitHub Actions
- name: Run Espresso tests
  run: ./gradlew connectedAndroidTest

Простая Gradle команда, встроена в Android экосистему.

Appium в CI

# GitHub Actions
- name: Start Appium server
  run: appium &

- name: Run Appium tests
  run: pytest tests/

- name: Stop Appium
  run: pkill -f appium

Больше настройки нужно для Appium сервера.

FAQ

Espresso лучше Appium для Android?

Espresso быстрее и надёжнее для Android-only тестирования благодаря in-process выполнению и автоматической синхронизации. Это рекомендованный Google фреймворк для Android UI тестирования. Appium лучше когда нужно кросс-платформенное тестирование (Android + iOS) или хочется писать тесты на других языках кроме Java/Kotlin. Выбирай Espresso для Android-only приложений с приоритетом скорости.

Appium медленнее Espresso?

Да, значительно. Espresso работает внутри процесса приложения с прямым доступом к UI thread, выполняя тесты за секунды. Appium общается через HTTP протокол к внешнему серверу, добавляя задержку к каждому взаимодействию. Для типичного 10-шагового теста, Espresso может занять 5 секунд, тогда как Appium — 15-25 секунд.

Можно использовать Appium и Espresso вместе?

Да, и многие команды так делают. Типичный подход: использовать Espresso для быстрых unit и integration UI тестов во время разработки (быстро ловить проблемы), и Appium для end-to-end кросс-платформенных тестов (убедиться что Android и iOS ведут себя одинаково). Это использует скорость Espresso и кросс-платформенность Appium.

Что проще настроить?

Espresso значительно проще. Он встроен в Android Studio — добавь зависимости в Gradle, напиши тесты, запусти. Appium требует установки Appium сервера, настройки драйверов (UiAutomator2), конфигурации capabilities и управления lifecycle сервера. Для Android-only тестирования, настройка Espresso почти zero-config.

Смотрите также