Ноутбук с юнит-тестами на изолированном macOS для Swift Testing и XCTest

2026 Swift Testing на посуточной аренде Mac: сосуществование с XCTest, шпаргалка #expect и матрица решений на 1–3 дня

В Xcode 26 уже есть шаблоны @Test, но удалить тысячи XCTestCase за день нельзя—UI- и performance-сьюты остаются на XCTest. На основной машине живут сертификаты и экспериментальные ветки; тотальная замена test target’ов покрасит CI на неделю. Материал для iOS-лидов, которым за 1–3 дня нужно перенести юниты на Swift Testing, сохранив смешанные target’ы: три боли, матрица сосуществования, семь шагов, таблица триажа, три метрики—со ссылками на строгую конкурентность Swift 6, узел CI macOS и FAQ SSH/VNC.

01. Три боли

1) Перекрёстное загрязнение DerivedData: Swift Testing по умолчанию параллелен. Старые singleton’ы XCTest и общие UserDefaults дают флейки.

2) UI/performance тащат в Swift Testing: В Xcode 26 UI и бенчмарки остаются на XCTest. Без границ в документации раздувается scope.

3) Локально зелёно, CI на старом scheme: Новый target не в Test action или -only-testing на legacy—без второго чистого Mac винят фреймворк.

02. Матрица сосуществования

ТипВыборПроверка на аренде
Чистые Swift-юнитыSwift Testing в приоритетеSendable
Параметризация@Test(arguments:)Индекс в логах CI
UI / XCUITestОставить XCTestОтдельный Test Plan
PerformanceОставить XCTestОкно CPU для baseline
SPM testTargetSwift Testing + swift testоба пути зелёные

03. Соответствия #expect

import Testing

struct TierTests {
    @Test(arguments: [0, 1, 99])
    func label(for count: Int) {
        #expect(!PriceTier.label(for: count).isEmpty)
    }
}

04. Семь шагов

  1. Заморозка: xcodebuild -version; при параллельной конкурентности — runbook Swift 6.
  2. Сосуществование: *UITests/performance оставить, новый unit target Swift Testing.
  3. Партии: чистая логика, ≤30 кейсов за раз.
  4. Теги/сериализация: Keychain, файлы, сеть.
  5. CI: scheme и гайд узла macOS.
  6. Артефакты: xcresult, оба фреймворка зелёные.
  7. Удаление: ключи, DerivedData; FAQ SSH/VNC.

05. Триаж и метрики

СимптомДействиеОшибка
Локально ОК, CI красныйСравнить scheme и argsВыключить параллель в CI
Случайные паденияserialized / изолированные suitesГлобально без параллели
Нет модуля TestingЛинковка, Swift ≥ 6@Test в app target
  • M1: 45–70 % юнитов — первые кандидаты (без UI/perf).
  • M2: 15–40 % ускорение прогона за счёт параллели.
  • M3: ~25 % меньше revert-обсуждений после двойного зелёного на аренде.

06. Linux CI vs посуточная аренда Mac

Linux-swift test не заменяет симулятор iOS, Test Plans, UI-оркестрацию. Для воспроизводимой приёмки двух фреймворков вне основной машины — Apple Silicon + Xcode 26. Посуточная аренда сжимает капекс на 1–3 дня. Тарифы, FAQ.

07. FAQ

Долгое сосуществование? Да, пока нет замены UI/performance.

Диск? Меньше 15 ГБ свободных — симулятор и параллельные тесты тормозят.