Как запустить и отладить юнит-тесты для приложения iPhone

ПРИМЕЧАНИЕ. В настоящее время юнит-тестирование намного проще в настройке. Этот учебник не очень актуален для 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 новой цели

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

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

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

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

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

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

Решение: нет места в вашем целевом имени!

Аргументы для тестирования:

  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, но это просто привело к аварийному завершению.

Шаг 4 - Запуск вашего самого исполняемого файла

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

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

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

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

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

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

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

Одна последняя вещь...

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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

  1. Продукт> Сборка для> Тестирование
  2. Поставьте точку останова в той части теста, которую вы хотите отладить
  3. Продукт> Тест

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

Другие вопросы по тегам