Какой у вас опыт в написании модульных (Unit) и UI-тестов для iOS?

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

Ответ

Имею опыт написания Unit-тестов (XCTest) для бизнес-логики и UI-тестов (XCUITest) для проверки пользовательских сценариев.

1. Unit-тесты (логика, ViewModel, сервисы):

  • Мокирование зависимостей через протоколы для изоляции тестируемого модуля.
  • Проверка состояний и побочных эффектов.
// Протокол для зависимости
protocol DataServiceProtocol {
    func fetchItems() -> [String]
}

// Мок для тестов
class MockDataService: DataServiceProtocol {
    var itemsToReturn: [String] = []
    func fetchItems() -> [String] { return itemsToReturn }
}

// Сам тест
class ViewModelTests: XCTestCase {
    func testViewModelLoadsItemsCorrectly() {
        // Arrange
        let mockService = MockDataService()
        mockService.itemsToReturn = ["Item1", "Item2"]
        let viewModel = MyViewModel(service: mockService)

        // Act
        viewModel.loadData()

        // Assert
        XCTAssertEqual(viewModel.displayedItems.count, 2)
        XCTAssertEqual(viewModel.displayedItems.first, "Item1")
    }
}

2. UI-тесты (XCUITest):

  • Использование accessibility identifiers для надежного поиска элементов.
  • Воспроизведение действий пользователя (tap(), swipe(), typeText()).
  • Проверка навигации и состояния UI (waitForExistence, exists).