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 testTarget | Swift 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. Семь шагов
- Заморозка:
xcodebuild -version; при параллельной конкурентности — runbook Swift 6. - Сосуществование:
*UITests/performance оставить, новый unit target Swift Testing. - Партии: чистая логика, ≤30 кейсов за раз.
- Теги/сериализация: Keychain, файлы, сеть.
- CI: scheme и гайд узла macOS.
- Артефакты:
xcresult, оба фреймворка зелёные. - Удаление: ключи, 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 ГБ свободных — симулятор и параллельные тесты тормозят.