Ответ
Различия обусловлены экосистемами платформ: фрагментацией, инструментами, языками и процессами публикации.
1. Фрагментация устройств и ОС
- Android: Высокая фрагментация. Множество производителей, моделей, размеров экранов, версий ОС и кастомных прошивок. Требуется тестирование на широком наборе устройств.
- iOS: Низкая фрагментация. Ограниченный набор устройств Apple и несколько актуальных версий iOS. Проще покрыть основные конфигурации.
2. Инструменты и среды разработки
- iOS: Основная среда — Xcode. Для UI-тестирования используется XCTest (фреймворк Apple). Для дистрибуции бета-версий — TestFlight.
- Android: Основная среда — Android Studio. Для UI-тестирования используются Espresso (для View-системы) и Jetpack Compose Testing (для Compose). Для бета-тестирования и тестов на реальных устройствах — Firebase Test Lab.
3. Языки и фреймворки для автоматизации
- iOS: Нативные тесты пишутся на Swift (реже Objective-C) с XCTest. Для кроссплатформенной автоматизации можно использовать Appium (с WebDriverAgent).
- Android: Нативные тесты пишутся на Kotlin (реже Java) с Espresso/Jetpack. Appium использует UiAutomator2.
4. Примеры UI-тестов
iOS (Swift, XCTest UI Tests):
func testLoginSuccess() {
let app = XCUIApplication()
app.launch()
// Ввод данных, знание accessibility идентификаторов
app.textFields["usernameField"].tap()
app.textFields["usernameField"].typeText("user@test.com")
app.secureTextFields["passwordField"].tap()
app.secureTextFields["passwordField"].typeText("password")
app.buttons["loginButton"].tap()
// Проверка результата по появлению элемента
XCTAssertTrue(app.staticTexts["welcomeMessage"].waitForExistence(timeout: 5))
}
Android (Kotlin, Espresso):
@Test
fun testLoginSuccess() {
// Ввод данных и действия с View, найденными по ID из R.java
onView(withId(R.id.usernameField))
.perform(typeText("user@test.com"), closeSoftKeyboard())
onView(withId(R.id.passwordField))
.perform(typeText("password"), closeSoftKeyboard())
onView(withId(R.id.loginButton)).perform(click())
// Проверка результата
onView(withId(R.id.welcomeMessage))
.check(matches(isDisplayed()))
}
5. Процесс публикации и ревью
- iOS (App Store): Строгий и часто непредсказуемый процесс ревью от Apple. Могут отклонять из-за нарушений гайдлайнов, использования приватных API. Время ревью — от нескольких часов до дней.
- Android (Google Play): Более формализованный и предсказуемый процесс автоматизированной проверки. Ручное ревью проводится выборочно или для определенных категорий приложений. Публикация обычно происходит быстрее.
6. Другие аспекты
- Навигация: Разные жесты и паттерны (кнопка "Назад" в Android vs. swipe-жесты в iOS).
- Разрешения: Модели запроса и управления разрешениями отличаются.
- Тестирование сборки: В Android нужно тестировать разные варианты сборки (debug, release, с разными типами подписи).