XCTest — Тестирование в Swift (iOS/macOS)

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое XCTest и зачем он нужен?

XCTest — это встроенный фреймворк от Apple для модульного, функционального и производительностного тестирования приложений на Swift (iOS, macOS, watchOS, tvOS). Он является аналогом таких библиотек, как pytest для Python или JUnit для Java, но полностью интегрирован в Xcode и Swift Package Manager. XCTest позволяет автоматически проверять корректность работы отдельных функций, классов, UI-компонентов и сетевых запросов, что критически важно для поддержания качества кода при разработке нативных приложений.

Как установить XCTest?

XCTest поставляется вместе с Xcode и не требует отдельной установки. Для начала работы достаточно создать новый проект в Xcode и добавить таргет для тестов (iOS Unit Testing Bundle или macOS Unit Testing Bundle). Если вы используете Swift Package Manager, просто добавьте зависимость import XCTest в свой тестовый файл. Для интеграции с CI/CD (например, GitHub Actions) добавьте скрипт: xcodebuild test -scheme YourScheme -destination 'platform=iOS Simulator,name=iPhone 14'.

Основные функции XCTest

  • Модульные тесты (Unit Tests) — проверка отдельных методов и классов с помощью XCTAssert.
  • Тесты производительности — измерение времени выполнения блоков кода через measure.
  • UI-тесты — автоматизация взаимодействия с интерфейсом через XCUIApplication.
  • Асинхронное тестирование — работа с ожиданиями через XCTestExpectation.
  • Параметризованные тесты — запуск одного теста с разными входными данными (через циклы).

Пример кода на Swift (iOS)

import XCTest

class CalculatorTests: XCTestCase {
    var calculator: Calculator!

    override func setUp() {
        super.setUp()
        calculator = Calculator()
    }

    override func tearDown() {
        calculator = nil
        super.tearDown()
    }

    func testAddition() {
        let result = calculator.add(2, 3)
        XCTAssertEqual(result, 5, "Ожидалось 5, получено \(result)")
    }

    func testPerformanceExample() {
        measure {
            _ = calculator.add(1000, 2000)
        }
    }

    func testAsyncNetwork() {
        let expectation = self.expectation(description: "Загрузка данных")
        NetworkService.fetchData { data in
            XCTAssertNotNil(data)
            expectation.fulfill()
        }
        waitForExpectations(timeout: 5)
    }
}

Когда использовать XCTest?

XCTest обязателен для всех коммерческих iOS/macOS проектов, особенно если вы работаете в команде или планируете публикацию в App Store. Он помогает предотвратить регрессии при рефакторинге, ускоряет код-ревью и автоматизирует проверку UI. Для тестирования сетевых запросов и работы с базой данных XCTest сочетают с моками (например, OHHTTPStubs). Если вы пишете библиотеку на Swift, XCTest — стандарт де-факто, так как он полностью поддерживается Xcode и Swift Package Index.

Рекомендаций