Как я могу запустить OCUnit (SenTestingKit) с NSDebugEnabled, NSZombieEnabled, MallocStackLogging? - PullRequest
2 голосов
/ 25 сентября 2010

У меня ошибка, похожая на ошибку в этой записи . Теперь я уверен, что где-то допустил какую-то глупую ошибку, возможно, связанную с освобождением объекта или наблюдателя или чего-то еще, но, поскольку я не могу найти способ отладки кода, я думал, что смогу использовать NSDebugEnabled, NSZombieEnabled и MallocStackLogging (как показано здесь ).

Можно ли это сделать с помощью OCUnit? Если так, то как? Я просто не могу найти "исполняемый файл" для установки этих параметров ...

Спасибо! Aviad.

Ответы [ 4 ]

3 голосов
/ 30 июня 2013

Возможно, это было исправлено в последних X-кодах, но я получаю зомби, выполняя

  1. Переход к схемам (cmd <) </li>
  2. Открыть тест, затем вкладка Аргументы
  3. Снимите флажок «Использовать аргументы действия« Выполнить »и переменные среды»
  4. »+» переменная среды «NSZombieEnabled» = «ДА»
3 голосов
/ 09 октября 2010

К сожалению, решение Дейва не сработало - я продолжал получать ошибки и ошибки.В конце концов я заставил GHUnit работать над моим проектом, обнаружил проблему путем отладки, но у него были свои проблемы, поэтому теперь я использую и его, и OCUnit, который немного лучше интегрирован с точки зрения отображения результатов в результатах.таб.

вздох .Когда мы сможем увидеть хороший , полный модуль модульного тестирования для Obj-C?

2 голосов
/ 14 февраля 2011

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

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

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

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

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

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

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

Шаг 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.

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

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

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

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

  1. -SenTest Self (или Все или имя теста - наберите 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

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

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

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

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

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

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

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

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

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

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

2 голосов
/ 25 сентября 2010

Ну, NSZombieEnabled и друзья - это переменные окружения, что означает, что их нужно запускать на исполняемом файле.Настройка по умолчанию для пакета модульного тестирования заключается в том, чтобы тесты выполнялись во время процесса build , а не во время выполнения.

Таким образом, способ исправить это - сделать так, чтобы ваштесты не выполняются на этапе сборки, а вместо этого запускаются как часть исполняемого файла.

Вот как я это делаю:

  1. Внутри целевого объекта связки Unit Test удалитеФаза сборки "Run Script".Именно этот шаг выполняет тесты после их компиляции.
  2. В меню «Проект» выберите «Новый пользовательский исполняемый файл ...» и назовите его чем-то значимым, например «otest»
  3. Сделайте исполняемый файлпуть к двоичному файлу otest, который должен находиться в /Developer/Tools/otest
  4. Установить следующие переменные окружения в исполняемом файле otest:
    • DYLD_FRAMEWORK_PATH => {UnitTest.bundle}/Contents/Frameworks
    • DYLD_LIBRARY_PATH => {UnitTest.bundle}/Contents/Frameworks
  5. Установите следующие аргументы программы в исполняемом файле otest:
    • -SenTest All (это запустит весь модультесты)
    • {UnitTest.bundle}

Теперь вы можете выбрать свой пакет модульных тестов в качестве активной цели и исполняемый файл otest в качестве активного исполняемого файла, а затемпостроить и отладить.Это позволит вам устанавливать контрольные точки, устанавливать другие переменные окружения (например, NSZombieEnabled) и т. Д.

Если вы хотите только отладить определенный набор или определенный модульный тест, вы можете изменить аргумент -SenTest Allдо -SenTest MyUnitTestSuite или -SenTest MyUnitTestSuite/myUnitTestMethod.

...