В мире разработчиков приложений для iOS время — самый ценный ресурс. Каждый разработчик стремится минимизировать задержки между написанием кода и получением обратной связи от тестов. Если вам кажется, что запуск тестов в Xcode занимает слишком много времени — вы не одиноки. Многие сталкиваются с этим барьером, который снижает скорость и качество разработки. Обычный запуск набора тестов с помощью xcodebuild test может занимать у вас десятки секунд, а то и минуты, особенно если проект растёт и требует больше усилий на сборку и подготовку симуляторов.
Это не просто неудобство — это серьёзное препятствие для эффективного цикла разработки, в особенности если вы следуете методологии TDD (Test Driven Development) или используете современные инструменты вроде Claude Code, которые требуют молниеносной реакции на изменения. Решение этой проблемы оказалось необычным и в то же время очень элегантным. Всё сводится к тому, чтобы вынести основную бизнес-логику, модели и UI-компоненты в отдельный программный пакет Swift Package — «MyAppCore». Поясним, что Swift Package — это своего рода модуль, который можно собрать и тестировать независимо от основного проекта приложения. Самое важное — пакет поддерживает swift test, современный и быстрый командный инструмент для запуска тестов, созданный Apple.
В итоге теперь весь основной код находится в этом пакете, а само приложение превращается в тонкую оболочку, которая просто подключает и отображает содержимое из пакета. Такое архитектурное разделение позволяет резко сократить время на запуск тестов. Вместо привычных 25 секунд и больше с xcodebuild, теперь swift test выполняет все тесты менее чем за секунду, а именно около 0.4 секунды на устройстве MacBook Pro с чипом M4, что даёт ускорение более чем в 60 раз. Представьте себе, сколько новых возможностей появляется у разработчика: мгновенная проверка кода, возможность часто и быстро запускать тесты, получая почти мгновенную обратную связь.
Это коренным образом меняет процесс работы и позволяет сосредоточиться на качестве и быстром итеративном развитии. Почему стандартное тестирование через Xcode такое медленное? Всё дело в том, что xcodebuild запускает полноценный билд проекта, который в случае iOS приложения включает в себя компиляцию всех файлов, код-сайнинг, подготовку и запуск симулятора, а затем само выполнение тестов. Особенно UI-тесты затягивают процесс, ведь для них требуется полноценная работа симулятора или реального устройства. Помимо этого Xcode может в течение нескольких секунд после успешного завершения тестов просто «зависать» перед закрытием процесса. Это создает суперфрустрирующий опыт для разработчика.
Суть предложенного решения в вынесении кода в Swift Package. Теперь весь код, кроме минимального количества файла, который требуется для запуска приложения (например, метод main и окно), находится в этом пакете. Это значит, что Swift Package можно протестировать отдельно с использованием swift test — утилиты, предназначенной именно для этого. Она не запускает симулятор, не занимается код-сайнингом, требуя лишь собрать сам пакет и выполнить тесты в нём. Такое разделение значительно снижает накладные расходы и ускоряет процесс.
Реализация этой стратегии не представляет особых сложностей и может быть проведена в несколько этапов. Сначала создаётся Swift Package, где содержится основная бизнес-логика, модели и представления. Затем этот пакет импортируется в проект приложения и используется как основа для фронтенда. Главное — грамотно настроить связь между приложением и пакетом, корректно установить зависимости и обеспечить, чтобы все публичные API были доступны. Важно осознавать, что такой подход меняет архитектуру приложения, переводя его в более модульный и компонентный стиль, что само по себе улучшает поддержку и расширяемость проекта.
Приложение остаётся тонкой оболочкой, напрямую не содержащей в себе большую часть функционала, что облегчает не только тестирование, но и сопровождение. Преимущества использования Swift Package для тестирования в том, что теперь тесты запускаются не в контексте эмулятора, а непосредственно в процессе сборки пакета. Это позволяет сэкономить время на запуск и завершение симулятора, а также на другие фоновые операции Xcode. В результате разработчик получает более четкую и понятную консольную выдачу при запуске тестов через swift test, в отличие от громоздкого и зачастую трудно читаемого вывода xcodebuild. Полученные результаты просто впечатляют.
Сокращение времени выполнения с 25 секунд до долей секунды — это огромный рывок, который позволяет повысить продуктивность в десятки раз. Если представить рабочий день с 480 минутами, количество циклов разработки с быстрыми тестами может вырасти с примерно тысячи до нескольких десятков тысяч. Это фундаментально меняет динамику рабочего процесса. Однако есть и потенциальные подводные камни. Перенос ресурсов, таких как изображения и статические файлы, в Swift Package может вызвать определённые трудности.
Также некоторые функции Xcode могут работать иначе в такой модульной системе, и потребуется некоторое время на адаптацию рабочего процесса. Несмотря на это, многие команды уже практикуют подобные подходы, что подтверждает их эффективность и жизнеспособность. Кроме того, этот подход выдвигает новые надежды на будущие улучшения инструментов Apple. Сейчас тестовые возможности как xcodebuild, так и Swift Package Manager недостаточно скоординированы друг с другом, но есть признаки того, что Apple движется в сторону более лёгких, быстрых и удобных командных инструментов для современных Swift проектов. Это значит, что в будущем разработчики смогут использовать ещё более совершенные способы быстрого тестирования без лишних задержек.
В целом, решение вынести логическую часть приложения в Swift Package и запускать тесты с помощью swift test — это простой, но мощный приём, который повышает эффективность процесса разработки в iOS разы. Для тех, кто испытывает проблемы с производительностью и не хочет мириться с долгим ожиданием результатов тестов, этот подход — отличный способ улучшить рабочий процесс. Если вы только начинаете свой путь в современной iOS разработке или уже давно работаете, но хотите избавиться от надоедливых задержек в тестировании, стоит попробовать эту стратегию. Она не требует кардинальной переработки дизайна приложения, но принесёт заметные преимущества. Быстрый запуск тестов означает меньше времени на ожидание и больше времени на созидание.
В итоге выигрывает и качество конечного продукта, ведь ошибки выявляются быстрее, а исправления вносятся сразу, пока идея свежа в голове разработчика. Такая оптимизация рабочего процесса — один из ключевых факторов успешной и современной разработки. Переход на модульную архитектуру с использованием Swift Package и swift test поможет не только ускорить тестирование, но и заложить основу для более масштабируемого и поддерживаемого проекта в будущем. Это тренд, который уже сегодня меняет подход к созданию приложений на iOS и macOS. В заключение, время — это ресурс, который сложно восполнить.
Решение Джастина Сирлса вынести код в Swift Package и использовать swift test не только экономит его, но и меняет подход к разработке, делая процесс более современным, гибким и быстрым. Если вы стремитесь к максимально высокой продуктивности и качеству вашего кода, подобный подход стоит изучить и применить уже сейчас. Ускорение тестирования в 60 раз — это не фантастика, а реальная возможность, которую стоит использовать в профессиональной разработке.