Ключевой критерий — сохраняется ли исходная серьёзность проблемы при вызове XCTest из Swift Testing. Для постепенной миграции начните оценку с режима complete; перед выводами проверьте настройки конкретного Test Plan, потому что старый план может по-прежнему использовать limited. Strict выбирайте, если нужно блокировать определённые вызовы, а none оставляйте для временной диагностики: он способен скрыть полезные сигналы. Поведение режимов сверяйте с документацией Apple по миграции с XCTest и демонстрацией WWDC26.
Эта статья для разработчиков, которые сохраняют существующие XCTest-тесты и постепенно добавляют Swift Testing.
Она также пригодится инженерам, отвечающим за Xcode Test Plan и согласованность локального запуска с CI.
Технические руководители найдут критерии, чтобы разделить совместимую миграцию, строгие правила и временную диагностику.
Последняя проверка — 7 октября 2026 года; сведения сверены с примечаниями к выпуску Xcode 27, документацией по миграции и демонстрацией WWDC26. Если Apple обновит описание режимов или выпустит новые примечания для Xcode 27.x, проверьте параметры заново.
01 Граница взаимодействия: смешанный набор не означает замену фреймворка
Swift Testing и XCTest могут сосуществовать в одном тестовом пакете. Настройка взаимодействия не переводит весь проект с одного фреймворка на другой: она управляет тем, как обрабатываются отдельные ситуации, возникающие на границе между ними. Поэтому решение следует принимать по наблюдаемому поведению теста, а не по принципу «новый фреймворк должен заменить старый».
Например, тест, написанный с использованием Swift Testing, может вызвать проверку XCTest:
import Testing
import XCTest
@Test func validatesValue() {
XCTAssertEqual(2 + 2, 4)
}
Здесь важен не выбор синтаксиса для всего проекта, а способ, которым система учитывает вызов XCTAssertEqual внутри теста Swift Testing. Этот пример показывает предмет проверки; он не является подтверждением поведения конкретной конфигурации. Для миграции сравните, какие проблемы регистрируются, с какой серьёзностью и как они влияют на результат запуска. В документации Apple отдельно описаны назначение и организация тестирования в Xcode и область применения XCTest.
На практике возникают несколько разных рисков:
- Ложное чувство совместимости. Тесты обоих типов запускаются, но это ещё не доказывает, что межфреймворковые вызовы приводят к ожидаемому результату.
- Изменение видимости проблемы. В одном режиме сообщение может быть менее строгим, чем ожидает команда; в другом — стать основанием для отказа теста.
- Разные настройки в разных точках запуска. Локальный Test Plan, пакетный запуск и удалённый CI могут использовать не идентичные конфигурации.
- Унаследованное поведение. При обновлении Xcode существующий Test Plan не следует считать автоматически перенастроенным.
- Соблазн погасить сигнал. Если выбрать none только ради зелёного CI, можно потерять информацию о проблемах на границе API.
При чтении сообщений не смешивайте взаимодействие фреймворков с обычными проверками XCTest. Документация Apple для Issue.record описывает регистрацию проблемы и её серьёзность в Swift Testing. Используйте её, чтобы понимать, какие именно сообщения отслеживаете, но не делайте по одному API вывода о настройке всего тестового плана.
02 Четыре режима: выбирайте по нужному уровню контроля
Для команды режим — это политика обработки межфреймворковых проблем. Перед изменением настройки определите, хотите ли вы сохранить совместимость, удержать исходную серьёзность, запретить конкретное использование или временно отключить обработку. Описание значений и поведения проверяйте по официальным материалам Apple о миграции и выпуске Xcode 27, ссылки на которые приведены выше.
| Режим | Как использовать при принятии решения | Основной риск |
|---|---|---|
limited |
Оставить ограниченную совместимую обработку, если именно такое поведение требуется существующему набору | Можно ошибочно принять унаследованное значение за намеренно выбранную политику |
complete |
Начать с него оценку постепенной миграции, если важно сохранять исходную серьёзность межфреймворковой проблемы | Нужно подтвердить, что получаемые сообщения и итог теста соответствуют правилам проекта |
strict |
Применить, когда команда хочет запретить определённые вызовы между фреймворками | При включении без проверки можно заблокировать существующий сценарий, который ещё не мигрирован |
none |
Временно использовать как диагностический контроль, если требуется выяснить, связано ли наблюдаемое поведение с обработкой взаимодействия | Проблемы могут перестать отображаться; постоянное применение способно замаскировать дефект |
Это не универсальная шкала «плохо — хорошо». Strict не становится правильным выбором только потому, что он строже; limited не становится безопасным только потому, что позволяет тестам проходить. Выбор зависит от политики команды и проверенного результата.
Минимальный пример помогает сравнить режимы, но он не покрывает кодовую базу целиком. Зафиксируйте, какое сообщение появляется в каждом варианте и как его интерпретирует запуск. Если различия не воспроизводятся или настройка не влияет на проверяемый случай, сначала проверьте, что запущен именно тот Test Plan и тот набор тестов, который вы меняли.
03 Старый Test Plan требует отдельной проверки
Обновлённая среда разработки и обновлённая конфигурация тестирования — разные вещи. Более ранний Test Plan может сохранить limited, хотя команда ожидает, что при создании нового плана будет использовано другое значение. Поэтому не определяйте активный режим по версии Xcode и не переносите предположение о новых проектах на уже существующие.
Apple описывает организацию тестов и параметры плана в руководстве по настройке Test Plan. Для проверки откройте используемый в схеме тестовый план, найдите параметр взаимодействия Swift Testing и XCTest и прочитайте именно установленное значение. Затем проверьте, какой план фактически выбран для запуска. Сохранённое значение в одном плане ничего не говорит о другом плане или отдельном командном запуске.
Для старого проекта полезно сравнить существующий план с новым тестовым планом, созданным в той же рабочей среде. Сравнение не заменяет документацию и не доказывает, что новый план подходит для старого набора тестов. Оно лишь быстро показывает, отличается ли конфигурация, после чего можно проверить каждое значение на тестовом примере. Для подтверждения поведения используйте примечания Apple к Xcode 27 и демонстрацию миграции на WWDC26, упомянутые выше.
Не меняйте одновременно режим взаимодействия, схему запуска и сам тестовый пример. Если исчезнет сообщение или изменится статус запуска, вы не поймёте, какое изменение стало причиной.
04 Swift Package и Test Plan проекта нужно проверять независимо
Не переносите настройку из одного способа сборки в другой автоматически. У Swift Package и проекта Xcode могут различаться места конфигурации, выбранная версия инструментов и условия запуска. На поведение также могут влиять требования swift-tools-version. Поэтому утверждение «по умолчанию всегда одинаково» без проверки конкретного проекта будет ненадёжным.
| Что сравнить | Swift Package | Проект Xcode с Test Plan |
|---|---|---|
| Где искать настройку | Проверить конфигурацию пакетного тестирования и применяемую версию инструментов | Проверить фактически выбранный тестовый план и его значение |
| Что записать | swift-tools-version, команду запуска и результат тестового примера |
Версию Xcode, схему, выбранный план и результат того же примера |
| Как интерпретировать расхождение | Уточнить, относится ли оно к версии инструментов, пакету или способу запуска | Уточнить, не сохранился ли прежний режим в Test Plan |
Не предполагайте, что один инструмент автоматически передаст другому выбранный режим. Сначала выполните один и тот же смешанный тест в обоих вариантах, затем сопоставьте сообщения и итоговый статус. Для командного запуска Xcode ориентируйтесь на официальное описание запуска тестов и интерпретации результатов. Если тест работает через командную строку, но иначе ведёт себя в Xcode, зафиксируйте отличающиеся условия, а не исправляйте проблему переключением на none.
Для Swift 6.4 отдельно запишите фактическую версию компилятора и требования пакета. Само упоминание Swift 6.4 не определяет режим взаимодействия и не доказывает, что разные точки запуска используют одинаковые значения по умолчанию. Версию языка, Test Plan и команду запуска рассматривайте как самостоятельные параметры диагностики. Перед сравнением убедитесь, что в двух запусках проверяется один и тот же тестовый код, а не похожие, но отличающиеся копии.
05 Приёмка строится на видимости, серьёзности и воспроизводимости
До миграции договоритесь, что команда считает корректным результатом. Минимальные критерии: межфреймворковая проблема регистрируется или намеренно не регистрируется в соответствии с выбранной политикой; серьёзность сообщения соответствует ожиданиям; существующие XCTest-тесты продолжают исполняться; один и тот же проверочный сценарий даёт объяснимый результат в предусмотренных точках запуска.
Проводите проверку по этапам:
- Зафиксируйте исходное состояние. Запишите версию Xcode и Swift, выбранную схему, Test Plan, его режим и способ запуска. Для Swift Package добавьте в запись
swift-tools-version. - Выберите небольшой смешанный пример. Возьмите тест Swift Testing с вызовом XCTest API и сохраните рядом обычный XCTest-тест. Не меняйте оба теста одновременно.
- Проверьте установленный режим. Сверьте Test Plan проекта с документацией Apple. Для пакетного проекта отдельно установите, какая конфигурация применяется к его запуску.
- Снимите исходный результат. Сохраните текст сообщения, его серьёзность и общий статус. Не ограничивайтесь зелёной или красной отметкой: она не объясняет, что произошло с конкретной проблемой.
- Сравните подходящие режимы. Начните оценку постепенной миграции с
complete; переход кstrictобоснуйте требованием блокировать определённые вызовы. Дляlimitedзафиксируйте, зачем сохраняется совместимая обработка. - Повторите тот же сценарий в CI. Проверьте, какой план и какой инструмент запускаются на узле. Сверьте сообщения, а не только общий итог задания.
- Оформите решение команды. Запишите выбранный режим, ожидаемое поведение и условие повторной проверки. Если значение меняется, сохраните причину и результат контрольного запуска.
Чек-лист для приёмки:
- [ ] Для каждого тестового запуска известны версия инструмента, схема и фактически применяемый Test Plan.
- [ ] Выбрано конкретное значение режима, а не сделан вывод только по версии Xcode.
- [ ] Один и тот же пример проверен в релевантных локальном и CI-сценариях.
- [ ] Сообщение о межфреймворковой проблеме видно там, где этого требует политика проекта.
- [ ] Уровень серьёзности и влияние на результат теста соответствуют ожидаемым.
- [ ] XCTest-тесты и тесты Swift Testing проверены отдельно и в смешанном наборе.
- [ ] Режим
noneне используется как постоянный способ сделать CI зелёным. - [ ] Для изменения настройки сохранены исходный результат и повторная проверка.
Если поведение различается между локальным Xcode и CI, сначала сопоставьте выбранные планы, команды и версии инструментов. И только после этого решайте, следует ли унифицировать конфигурацию, мигрировать набор поэтапно или временно поддерживать два проверенных сценария. Не объявляйте режим единой причиной различий, пока контрольный пример не воспроизводит проблему.
Для удалённого узла применяйте ту же процедуру, что и для локальной машины: укажите точку запуска, план, версии и наблюдаемый результат. Не делайте вывод о пригодности сервиса по одному факту удалённого доступа — для задачи важны доступность нужной среды разработки и возможность получить проверяемые результаты тестов. Если вы оцениваете затраты на временную тестовую среду, сверяйте актуальные условия на странице тарифов CALMVPS, а не переносите цены или характеристики из старых заметок.
06 FAQ
Можно ли держать оба фреймворка в одном тестовом пакете?
Да. Совместное присутствие Swift Testing и XCTest само по себе не означает, что нужно переписывать весь набор. Настройка взаимодействия касается обработки отдельных ситуаций на границе фреймворков. Проверьте смешанный набор и убедитесь, что тесты регистрируют проблемы с ожидаемой серьёзностью; успешный запуск обоих типов тестов не заменяет такой проверки.
Как начать выбор между complete и limited?
При постепенной миграции начните оценку с complete, если вам важно сохранить исходную серьёзность межфреймворковых проблем. Оставляйте limited, когда команда осознанно принимает соответствующую совместимую обработку. Сравните оба результата на одинаковом тестовом примере и запишите, какое сообщение и итог запуска должны считаться нормой.
Почему старый план может продолжить использовать limited?
Старый Test Plan может сохранить собственную настройку после обновления Xcode. Поэтому проверьте параметр в плане, который действительно запускает схема, а не делайте вывод по установленной версии среды разработки. Сравнение с новым планом может выявить расхождение, но действующее значение нужно подтвердить в конфигурации и контрольном запуске.
Нужно ли ожидать одинакового значения по умолчанию у пакета и проекта Xcode?
Нет оснований считать настройки одинаковыми без проверки. Уточните требования swift-tools-version, применяемую версию инструментов, команду пакетного запуска и Test Plan проекта. Затем выполните один и тот же смешанный пример в обоих сценариях и сравните сообщения и статус. Это даст подтверждение для конкретной конфигурации, а не общее предположение.
Для решения о миграции сначала подтвердите режим действующего Test Plan, затем сравните один и тот же пример локально и в CI. Если у команды нет подходящей среды Mac для запуска Xcode-тестов, удалённая аренда может быть практичнее покупки отдельной машины для краткого проекта или проверки миграции. Но при постоянной высокой нагрузке, требованиях к физическим устройствам или длительном владении собственный Mac может оказаться уместнее. Перед тестированием удалённой схемы проверьте условия заказа Mac в CALMVPS и зафиксируйте результаты на своём наборе тестов.