Какие сущности вы тестировали в iOS-приложениях на предыдущем месте работы?

«Какие сущности вы тестировали в iOS-приложениях на предыдущем месте работы?» — вопрос из категории Тестирование, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

На предыдущем проекте я покрывал тестами следующие сущности и слои приложения:

1. Unit-тесты для бизнес-логики:

  • ViewModels/Presenters: Тестирование преобразования данных и реакций на действия пользователя.
  • Сервисы (Networking, Data): Использование моков и стабов для изоляции логики.
  • Менеджеры и хелперы: Проверка чистых функций и утилит.
// Пример теста ViewModel
func test_LoginViewModel_OnValidCredentials_SetsStateToLoggedIn() {
    // Arrange
    let mockAuthService = MockAuthService()
    mockAuthService.loginResult = .success(())
    let viewModel = LoginViewModel(authService: mockAuthService)

    // Act
    viewModel.login(email: "valid@email.com", password: "password123")

    // Assert
    XCTAssertTrue(viewModel.isLoggedIn)
    XCTAssertEqual(viewModel.state, .success)
}

2. UI-компоненты (Snapshot-тесты):

  • Тестирование кастомных UIView и UIViewController на соответствие макетам.
  • Проверка различных состояний (загрузка, ошибка, контент).
  • Использовалась библиотека iOSSnapshotTestCase (FBSnapshotTestCase).

3. Интеграционные тесты:

  • Сетевой слой: Тестирование реальных запросов к мок-серверу или с использованием URLProtocol для перехвата трафика.
  • Локальная база данных: Проверка операций сохранения, извлечения и миграций в CoreData и Realm.
  • Взаимодействие модулей: Например, тест цепочки ViewModel -> Service -> CoreData.

4. UI-тесты (XCTest):

  • Критические пользовательские сценарии (onboarding, покупка, создание контента).
  • Тесты на доступность (VoiceOver, Dynamic Type).

Инфраструктура: Тесты интегрировались в CI/CD (GitHub Actions/Jenkins) для автоматического прогона при каждом пулл-реквесте.