Как вы отлаживаете модульный тест в Xcode 3? - PullRequest
5 голосов
/ 09 января 2011

Я следовал инструкциям Apple , чтобы настроить модульное тестирование в своем проекте.Я следовал указаниям, чтобы сделать их зависимыми, поэтому тесты выполнялись при каждой сборке моего основного проекта.Это работает, и когда мои тесты проходят, приложение запускается;когда они этого не делают, я получаю ошибки сборки в строках неудачных модульных тестов.

Я хотел бы, однако, иметь возможность пошагово проходить код моего приложения, когда тесты не пройдены, но могу 't Xcode (3.2.5) настроен правильно.Проект - это проект Mac, а не iOS.

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

Обновление

Я нашел другую страницу, пытающуюся решить эту проблему ( здесь ) с помощьюдобавив аргументы и переменные окружения в мой основной исполняемый файл, но опять же, они не привели к остановке выполнения на моих точках останова.Я также заметил, что мои (обильные) операторы журнала теста не отображаются на моей консоли отладчика.

Я также обнаружил, что желтые точки останова означают, что код, который там не может быть найден во время выполнения.Они есть в моем классе тестовых случаев, так что это определенно объясняет, почему они не стреляют.

Ответы [ 5 ]

2 голосов
/ 27 мая 2011

У меня есть вариант того, что Hiedi Utley опубликовал в http://hiediutley.wordpress.com/2011/03/08/xcode3-debugging-ios-unit-tests/. Что мне не понравилось в этом, так это дублирование целей пакета модульных тестов, один из которых содержал фазу Run Script для выполнения модульных тестов после сборки и еще один, который не запускал юнит-тесты. Я заметил на панели «Информация» для этапа «Выполнить сценарий» переключатель «Запускать сценарий только при установке» и подумал, что это будет способом переключения между выполнением модульных тестов в обычном режиме и их запуском в отладчике.

В соответствии с инструкциями Hiedi создайте новый исполняемый элемент, скажем, LogicTestsGDB. Настройте его так:

Вкладка «Общие»:

  • Путь: Developer/usr/bin/otest ( Не ведущий /)
  • Тип пути: Relative to Current SDK
  • Установить рабочий каталог на: Build Products directory

Вкладка «Аргументы»:

  • Аргументы: Ваш комплект UnitTest (например, LogicTests.octest)
  • Переменные для установки в среде
    • DYLD_LIBRARY_PATH ... : ${BUILD_PRODUCTS_DIR}:${DYLD_LIBRARY_PATH}
    • DYLD_FRAMEWORK_PATH . : ${SDKROOT}/Developer/Library/Frameworks
    • DYLD_ROOT_PATH ...... : ${SDKROOT}
    • IPHONE_SIMULATOR_ROOT : ${SDKROOT}
    • OBJC_DISABLE_GC : YES
    • DYLD_NEW_LOCAL_SHARED_REGIONS : YES
    • DYLD_NO_FIX_PREBINDING : YES
    • CFFIXED_USER_HOME : ${HOME}/Library/Application Support/iPhone Simulator/

Готово. Теперь для отладки ваших юнит-тестов

  1. Откройте фазы сборки пакета и дважды щелкните по фазе Run Script .
  2. Проверьте Запускать скрипт только при установке опции
  3. Установите Active Target в качестве пакета для модульного тестирования (например, LogicTests.octest).
  4. Установите Активный исполняемый файл как созданный новый исполняемый файл (например, LogicTestsGDB)
  5. Нажмите Сборка и отладка

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

  1. Откройте фазы сборки пакета и дважды щелкните по фазе Run Script .
  2. Снимите флажок Запускать скрипт только при установке опции
  3. Установите Active Target в качестве создаваемого приложения
  4. Установите Активный исполняемый файл в качестве создаваемого приложения

Для автоматизации описанных выше шагов я создал простой скрипт AppleScript, который переключается между двумя состояниями:

property kApplicationName : "MyApp" -- name of the normal application to build
property kUnitTestName : "LogicTests" -- name of the bundle target to debug
property kUnitTestRunner : "LogicTestGDB" -- name of the executable to use when debugging the unit test bundle

tell application "Xcode"
    tell the active project document
    set theTarget to first target whose name is kUnitTestName
        set thePhase to first run script phase of theTarget
        if name of active target is kApplicationName then
            set active target to theTarget
            set theExecutable to first executable whose name is kUnitTestRunner
            set active executable to theExecutable
            set run only when installing of thePhase to true
        else
            set theTarget to first target whose name is kApplicationName
            set active target to theTarget
            set theExecutable to first executable whose name is kApplicationName
            set active executable to theExecutable
            set run only when installing of thePhase to false
        end if
        return "Targeting " & (name of active executable)
    end tell
end tell
2 голосов
/ 30 января 2011

У меня обычно нет проблем с отладкой моих тестов OCTest с помощью Xcode 3.2, включая остановку в точках останова.

Основная идея - сказать gdb запустить otest с вашим пакетом в качестве аргумента.Вы сделаете это, добавив /Developer/Tools/otest в качестве пользовательского исполняемого файла в свой проект XCode, а затем укажите имя своего пакета OCTest в качестве единственного аргумента (выберите «Редактировать активный исполняемый файл otest» в меню «Проект» и на второй вкладке добавьте строку с Foo.octest в верхнем поле для отладки теста Foo).

Теперь, если вы нажмете кнопку отладки, она начнет отладку вашего тестового пакета прямо сейчас и остановится на объявленных точках останова (если вы нажмете build и debugон может не запуститься, если тест не пройден).Также обратите внимание, что вам, возможно, придется установить переменную окружения на YES, чтобы отключить сборку мусора (в нижней части той же вкладки «Аргументы»), otest скажет вам, что именно вам нужно.

Если высделал все выше и до сих пор не может сделать шаг в ваш тестовый код, это может быть либо потому, что он скомпилирован с отключенной генерацией символов отладки - проверьте настройки сборки отладки, но, скорее всего, потому что тестовый код вообще не перекомпилируется.Скорее всего, так как ваши журналы не отображаются в консоли, NSLog должен писать в консоли Xcode.Очистите папки build и bin вручную, иногда, когда вы меняете путь или имя, в итоге вы загружаете устаревший код.Возможно, вы также захотите проверить, что файл не выпрыгнул из цели теста (является ли неудачный тест в том же файле без регистрации?).

1 голос
/ 21 марта 2011

Я также попробовал решения по ссылкам, которые вы указали, но у меня тоже не получилось.Но потом я нашел это: http://hiediutley.wordpress.com/2011/03/08/xcode3-debugging-ios-unit-tests/ - это работает как шарм :) Свежий материал тоже.

0 голосов
/ 19 марта 2011

Единственное, что мне помогло, это обновление до Xcode 4. Он прекрасно интегрируется.Было немного боли при переходе к нему, но теперь, когда все кончено, интеграция великолепна.Я полностью в состоянии пройти через мои тесты и код приложения.

0 голосов
/ 13 января 2011

разработайте свои модульные тесты, чтобы они обернули программу, находящуюся в проекте, у которого есть цель, затем просто откройте зависимый проект и работайте в нем. скорее всего это будет проект с библиотекой и исполняемым файлом, который вызывает библиотеку (2 цели). затем вы можете просто открыть проект и выполнить отладку, в то время как ваши модульные тесты в зависимости будут вызывать эту библиотеку. это более модульный подход.

удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...