Подтвердить что ты не робот

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

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

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

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

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

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

С XCode 3.2.5

выполнялось следующее:

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

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

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

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

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

enter image description here

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

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

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

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

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

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

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

  • -SenTest Self (или All или тестовое имя - тип пользователя в терминале для получения списка)
  • {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}/Library/Поддержка приложений /iPhone Simulator/Пользователь"
  • DYLD_LIBRARY_PATH: ${BUILD_PRODUCTS_DIR}: ${DYLD_LIBRARY_PATH}
  • DYLD_NEW_LOCAL_SHARED_REGIONS: YES
  • DYLD_NO_FIX_PREBINDING: YES

Обратите внимание, что я также попробовал DYLD_FORCE_FLAT_NAMESPACE, но это просто закончилось сбой otest.

enter image description here

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

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

  • Задайте свою активную цель целевой unit test (LogicTestsDebug в моем случае)
  • Установите активный исполняемый файл в исполняемый файл otest

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

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

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

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

enter image description here

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

enter image description here

Последняя вещь...

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

Для этого вы можете перетащить свой тестовый комплект логики в целевую программу.

enter image description here

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

  • Продукт > Создать для > Тестирование
  • Поместите точку прерывания в часть теста, который вы хотите отлаживать
  • Продукт > Тест

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