Как запустить и отладить юнит-тесты для приложения iPhone - PullRequest
16 голосов
/ 14 февраля 2011

ПРИМЕЧАНИЕ. Модульное тестирование в настоящее время намного проще в настройке. Этот учебник на самом деле не относится к Xcode версии 5 и выше.

Это заняло у меня довольно много времени, но мне, наконец, удалось заставить его работать для моего проекта. Для создания «логических» тестов я следовал рекомендациям Apple по созданию логических тестов . Это прекрасно работает, когда вы понимаете, что логические тесты запускаются во время сборки.

Чтобы иметь возможность отлаживать эти тесты, необходимо создать собственный исполняемый файл, который будет вызывать эти тесты. Статья Шона Мицели в блоге Grokking Cocoa предоставляет всю информацию для этого. Однако следование этому не принесло немедленного успеха и потребовало некоторой настройки.

Я расскажу об основных шагах, представленных в уроке Шона, и предоставлю некоторую схему "для чайников", на которую у меня ушло некоторое время, чтобы выяснить:

  1. Установить цель, которая содержит модульные тесты, но НЕ запускает их
  2. Настройка исполняемого файла otest для запуска тестов
  3. Настройте переменные среды otest, чтобы otest мог найти ваши модульные тесты

Следующее было выполнено с XCode 3.2.5

Примечание для XCode 4

В XCode 4 можно ПРЯМО отлаживать ваши юнит-тесты. Просто напишите свой тест, добавьте его к своей цели в качестве одного из тестов и установите в нем точку останова. Это все. Больше придет.

Шаг 1 - Настройка цели

  1. Дублируйте вашу цель модульных тестов, расположенную под вашими целями проекта. Это также создаст дубликат вашего продукта модульных тестов (файл .octest). На рисунке ниже «LogicTest» является исходной целью.
  2. Переименуйте и объект модульных тестов, и продукт модульных тестов (файл .octest) в одно и то же имя. На рисунке ниже «LogicTestsDebug» является целью дублирования.
  3. Удалить фазу RunScript новой цели

Имя обоих может быть любым, но я бы избегал пробелов.

enter image description here

Шаг 2 - Настройка otest

Самым важным моментом здесь является получение правильного otest, то есть для вашей текущей iOS, а не для версии Mac по умолчанию. Это хорошо описано в уроке Шона. Вот еще несколько деталей, которые помогли мне все исправить:

  1. Перейти проект-> Новый пользовательский исполняемый файл. Откроется окно с предложением ввести имя исполняемого файла и путь к исполняемому файлу.
  2. Введите имя, которое вы хотите.
  3. Скопируйте и вставьте путь к вашему исполняемому файлу iOS otest. В моем случае это был /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/Developer/usr/bin/otest
  4. Нажмите ввод. Это приведет вас к странице конфигурации вашего исполняемого файла.
  5. Единственное, что нужно изменить на этом этапе, это выбрать «Тип пути: относительно текущего SDK». Не вводите путь, это было сделано на шаге 3. enter image description here

Шаг 3 - Настройка аргументов otest и переменных окружения

Спорные аргументы просты в настройке ... Но это оказалось моей самой большой проблемой. Сначала я назвал свою цель логического теста «Отладка LogicTests». С этим именем и «LogicTests Debug.octest» (с кавычками) в качестве аргумента для otest у меня продолжалось otest, заканчивающееся кодом завершения 1 и НИКОГДА не останавливаясь в моем коде ...

Решение : в имени цели нет пробела!

Аргументы для otest:

  1. -SenTest Self (или All или имя теста - наберите man otest в терминале, чтобы получить список)
  2. {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, но это просто привело к аварийному завершению.

enter image description here

Шаг 4. Запуск исполняемого файла otest

Чтобы запустить исполняемый файл otest и начать отладку тестов, вам необходимо:

  1. Установите свою активную цель на цель для юнит-теста (LogicTestsDebug в моем случае)
  2. Установите ваш активный исполняемый файл на ваш исполняемый файл otest

Вы можете создавать и запускать свой исполняемый файл и отлаживать свои тесты с точками останова.

В качестве дополнительного примечания, если у вас возникают проблемы с запуском исполняемого файла otest, это может быть связано с:

  1. Неправильный путь. Сначала у меня было много проблем, потому что я указывал на тест Mac. Я продолжал падать при запуске с кодом завершения 6.
  2. Неправильные аргументы. Пока я не удалил пробел из имени пакета (.octest), у меня постоянно возникал сбой с кодом выхода 1.
  3. Неправильный путь в переменных среды. В учебнике Шона есть много дополнительных вопросов, дающих некоторое представление о том, что пробовали другие люди. Набор, который у меня сейчас есть, кажется, работает, поэтому я предлагаю вам начать с этого.

Вы можете получить какое-то сообщение в консоли, которое может заставить вас думать, что что-то не так с вашими переменными среды. Вы можете заметить сообщение относительно CFPreferences. Это сообщение не препятствует правильной работе тестов, поэтому не сосредотачивайтесь на нем, если у вас возникли проблемы с запуском otest.

enter image description here

Последнее, когда все заработает, вы сможете остановиться на контрольных точках в своих тестах.

enter image description here

И последнее ...

Я читал во многих блогах, что основным ограничением встроенного XCode SenTestKit является то, что тесты нельзя запускать при создании приложения. Ну, как оказалось, на самом деле это довольно легко управлять. Вам просто нужно добавить свой пакет тестов логики в качестве зависимости от вашего проекта приложения. Это обеспечит сборку пакета логических тестов, т. Е. Все тесты будут выполнены до того, как будет построено ваше приложение.

Для этого вы можете перетащить пакет логических тестов на цель приложения.

enter image description here

Ответы [ 2 ]

7 голосов
/ 24 февраля 2011

Этот пост задуман как «практические рекомендации», а не как реальный вопрос. Поэтому этот ответ предназначен только для того, чтобы я мог пометить «как» как «ответил». Это, вероятно, будет помечено сообществом как нерегулярное. Я за предложениями о том, где размещать будущие статьи с инструкциями.

Последнее замечание на эту тему. Для тех, кто все еще задается вопросом, стоит ли писать юнит-тесты, я бы определенно сказал Да!

В настоящее время я пишу приложение с CoreData и извлекаю данные из веб-службы (синтаксический анализ xml). Полная модель может быть протестирована и отлажена без необходимости:

  1. запустить реальное приложение на симуляторе или устройстве. Отсутствие необходимости использовать устройство для запуска тестов - огромный выигрыш времени. Это разница между 2 минутами и 5 секундами за цикл.
  2. без необходимости создания представлений или контроллеров при тестировании модели. Полная разработка и тестирование могут сосредоточиться на модели только на первой итерации. Как только модель будет очищена для интеграции, последует дальнейшая разработка.

Для отладки парсинга xml я могу просто использовать «жестко запрограммированные» файлы, которыми я полностью управляю.

Суть, конечно, в том, чтобы писать тесты по мере реализации функций в коде. Это действительно экономит время в плане отладки всего приложения.

Вуаля, я оставлю это на этом.

0 голосов
/ 12 октября 2014

Мне удалось запустить тестовый пример в отладчике, выполнив следующие простые шаги:

  1. Product> Build For> Testing
  2. Установите точку останова в части теста, которую выхочу отладить
  3. Product> Test

Это на Xcode 6.0.1 и кажется намного более удобным, чем длинная процедура, описанная выше.

...