ПРИМЕЧАНИЕ. Модульное тестирование в настоящее время намного проще в настройке. Этот учебник на самом деле не относится к Xcode версии 5 и выше.
Это заняло у меня довольно много времени, но мне, наконец, удалось заставить его работать для моего проекта.
Для создания «логических» тестов я следовал рекомендациям Apple по созданию логических тестов .
Это прекрасно работает, когда вы понимаете, что логические тесты запускаются во время сборки.
Чтобы иметь возможность отлаживать эти тесты, необходимо создать собственный исполняемый файл, который будет вызывать эти тесты. Статья Шона Мицели в блоге Grokking Cocoa предоставляет всю информацию для этого. Однако следование этому не принесло немедленного успеха и потребовало некоторой настройки.
Я расскажу об основных шагах, представленных в уроке Шона, и предоставлю некоторую схему "для чайников", на которую у меня ушло некоторое время, чтобы выяснить:
- Установить цель, которая содержит модульные тесты, но НЕ запускает их
- Настройка исполняемого файла otest для запуска тестов
- Настройте переменные среды otest, чтобы otest мог найти ваши модульные тесты
Следующее было выполнено с XCode 3.2.5
Примечание для XCode 4
В XCode 4 можно ПРЯМО отлаживать ваши юнит-тесты. Просто напишите свой тест, добавьте его к своей цели в качестве одного из тестов и установите в нем точку останова. Это все. Больше придет.
Шаг 1 - Настройка цели
- Дублируйте вашу цель модульных тестов, расположенную под вашими целями проекта. Это также создаст дубликат вашего продукта модульных тестов (файл .octest). На рисунке ниже «LogicTest» является исходной целью.
- Переименуйте и объект модульных тестов, и продукт модульных тестов (файл .octest) в одно и то же имя. На рисунке ниже «LogicTestsDebug» является целью дублирования.
- Удалить фазу RunScript новой цели
Имя обоих может быть любым, но я бы избегал пробелов.
Шаг 2 - Настройка otest
Самым важным моментом здесь является получение правильного otest, то есть для вашей текущей iOS, а не для версии Mac по умолчанию. Это хорошо описано в уроке Шона. Вот еще несколько деталей, которые помогли мне все исправить:
- Перейти проект-> Новый пользовательский исполняемый файл. Откроется окно с предложением ввести имя исполняемого файла и путь к исполняемому файлу.
- Введите имя, которое вы хотите.
- Скопируйте и вставьте путь к вашему исполняемому файлу iOS otest. В моем случае это был /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/Developer/usr/bin/otest
- Нажмите ввод. Это приведет вас к странице конфигурации вашего исполняемого файла.
- Единственное, что нужно изменить на этом этапе, это выбрать «Тип пути: относительно текущего SDK». Не вводите путь, это было сделано на шаге 3.
Шаг 3 - Настройка аргументов otest и переменных окружения
Спорные аргументы просты в настройке ... Но это оказалось моей самой большой проблемой. Сначала я назвал свою цель логического теста «Отладка LogicTests». С этим именем и «LogicTests Debug.octest» (с кавычками) в качестве аргумента для otest у меня продолжалось otest, заканчивающееся кодом завершения 1 и НИКОГДА не останавливаясь в моем коде ...
Решение : в имени цели нет пробела!
Аргументы для otest:
- -SenTest Self (или All или имя теста - наберите man otest в терминале, чтобы получить список)
- {LogicTestsDebug} .octest - где {LogicTestsDebug} необходимо заменить именем пакета логического теста.
Вот список переменных среды для копирования / вставки:
- DYLD_ROOT_PATH: $ SDKROOT
- DYLD_FRAMEWORK_PATH: "$ {BUILD_PRODUCTS_DIR}: $ {SDK_ROOT}: $ {DYLD_FRAMEWORK_PATH}"
- IPHONE_SIMULATOR_ROOT: $ SDKROOT
- CFFIXED_USER_HOME: "$ {HOME} / Библиотека / Поддержка приложений / iPhone Simulator / Пользователь"
- DYLD_LIBRARY_PATH: $ {BUILD_PRODUCTS_DIR}: $ {DYLD_LIBRARY_PATH}
- DYLD_NEW_LOCAL_SHARED_REGIONS: ДА
- DYLD_NO_FIX_PREBINDING: ДА
Обратите внимание, что я также пробовал DYLD_FORCE_FLAT_NAMESPACE, но это просто привело к аварийному завершению.
Шаг 4. Запуск исполняемого файла otest
Чтобы запустить исполняемый файл otest и начать отладку тестов, вам необходимо:
- Установите свою активную цель на цель для юнит-теста (LogicTestsDebug в моем случае)
- Установите ваш активный исполняемый файл на ваш исполняемый файл otest
Вы можете создавать и запускать свой исполняемый файл и отлаживать свои тесты с точками останова.
В качестве дополнительного примечания, если у вас возникают проблемы с запуском исполняемого файла otest, это может быть связано с:
- Неправильный путь. Сначала у меня было много проблем, потому что я указывал на тест Mac. Я продолжал падать при запуске с кодом завершения 6.
- Неправильные аргументы. Пока я не удалил пробел из имени пакета (.octest), у меня постоянно возникал сбой с кодом выхода 1.
- Неправильный путь в переменных среды. В учебнике Шона есть много дополнительных вопросов, дающих некоторое представление о том, что пробовали другие люди. Набор, который у меня сейчас есть, кажется, работает, поэтому я предлагаю вам начать с этого.
Вы можете получить какое-то сообщение в консоли, которое может заставить вас думать, что что-то не так с вашими переменными среды. Вы можете заметить сообщение относительно CFPreferences. Это сообщение не препятствует правильной работе тестов, поэтому не сосредотачивайтесь на нем, если у вас возникли проблемы с запуском otest.
Последнее, когда все заработает, вы сможете остановиться на контрольных точках в своих тестах.
И последнее ...
Я читал во многих блогах, что основным ограничением встроенного XCode SenTestKit является то, что тесты нельзя запускать при создании приложения. Ну, как оказалось, на самом деле это довольно легко управлять. Вам просто нужно добавить свой пакет тестов логики в качестве зависимости от вашего проекта приложения. Это обеспечит сборку пакета логических тестов, т. Е. Все тесты будут выполнены до того, как будет построено ваше приложение.
Для этого вы можете перетащить пакет логических тестов на цель приложения.