Xcode 3.1.3 проблемы юнит-тестирование плагина - PullRequest
3 голосов
/ 23 октября 2009

После блогов Криса Хансона и Apple Автоматическое модульное тестирование с Xcode 3 и Objective-C Я начал внедрять модульные тесты для своих проектов. Однако я использую много плагинов (загружаемых пакетов) и не могу понять, как их протестировать.
Я решил использовать подход, описанный Крисом Хансоном, для тестирования фреймворков. Я начал с проекта Cocoa Bundle, добавил основной класс и изменил тип на плагин.
Затем я добавил пакет модульного тестирования, добавил плагин в качестве прямой зависимости (инструкции Apple) и установил следующие параметры сборки:

Bundle Loader: $ (BUILT_PRODUCTS_DIR) /CocoaPlugin.plugin/Contents/MacOS/CocoaPlugin
Тестовый хост: $ (BUNDLE_LOADER)

Проблема в том, что как только я это сделаю и создаю тестовую цель, я получаю следующее сообщение:

ошибка: тестовый хост '/Users/elisevanlooij/Documents/Plug-ins/CocoaPlugin/build/DebugCocoaPlugin.plugin/Contents/MacOS/CocoaPlugin' аварийно завершился с кодом 127 (возможно, произошел сбой). [код 126 в другом плагине]

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

Ответы [ 2 ]

2 голосов
/ 03 ноября 2009

Сделай шаг назад. Ваш параметр Bundle Loader является ошибочным, и добавление пользовательского исполняемого файла не повлияет на компиляцию пакета модульного теста.

Вам нужно, чтобы ваш пакет модульных тестов создавался без ошибок (и предупреждений!), И ваши тесты будут выполняться автоматически (у вас есть хотя бы один действительный класс SenTestCase с хотя бы одним допустимым методом тестирования, верно?).

Итак, Вы говорите, что ваш тестовый пакет компилируется без предупреждений, и вы написали несколько тестов, используя классы и методы из вашего плагина? Если это так, вы должны позаботиться о том, чтобы позаботиться о загрузке пакета плагинов в пакет модульных тестов и определении какого-либо API, поскольку у пакета плагинов нет общедоступных заголовков, верно?

см. Документы Apple здесь

Загрузка плагинов в плагины (по сути, то, что вы пытаетесь сделать) не легка, и они не волшебным образом «связаны» во время компиляции, как фреймворки в блоге Криса Хансона, на который вы также ссылаетесь. Они не были бы плагинами, если бы были.

Самый простой способ - вообще не тестировать свой плагин, а добавить файлы, которые вы хотите протестировать, непосредственно в пакет модульных тестов. По крайней мере, так вы сможете приступить к тестированию своего кода, не тратя время на динамическую загрузку пакетов.

Но если это неудовлетворительно, вы можете получить то, что вы пытаетесь сделать, для работы с небольшими усилиями - вам определенно следует добавить тесты, чтобы убедиться, что ваш плагин загружен и что символы, которые вы считаете доступными, ДЕЙСТВИТЕЛЬНО доступны , Как только ваши тесты будут в порядке, вы должны следить за другим отличным блогом Криса Хэнсона, посвященным пакетам отладочных тестовых модулей , показывающим, как выполнить ваши тесты в отладчике - вы сможете отследить любые ошибки.

1 голос
/ 07 ноября 2009
  1. Ваш

    Загрузчик пакетов: $ (BUILT_PRODUCTS_DIR) /CocoaPlugin.plugin/Contents/MacOS/CocoaPlugin

    правильно. Это означает, что когда связывая свой тестовый пакет, вы не включаете туда тестируемые классы, и они будут искать от CocoaPlugin. Это настройка времени компиляции и должна вызывать ваш тест связка для компиляции / ссылки успешно. (См. -Bundle_loader в man ld )

  2. Ваш

    Тестовый хост: $ (BUNDLE_LOADER)

    неверно. Ваш тестовый хост должен быть либо приложением (с NSApplicationMain, вызываемым из основного метода), либо не установленным. Этот параметр TEST_HOST - это параметр времени выполнения для запуска модульных тестов. У вас есть два варианта:

    • Не устанавливайте TEST_HOST, а загружайте плагин из вашего тестового пакета. Например, вы можете сделать это, используя метод initlaize.

    • Создайте фиктивное приложение test_host, которое загрузит ваш плагин, затем вызовет NSApplicationMain и используйте это приложение в качестве вашего TEST_HOST.

Метод +initalize для вашего тестового пакета для загрузки плагина будет выглядеть следующим образом:

+ (void)initialize
{
    NSBundle* bundle = [NSBundle bundleWithPath:pathToPlugin];
    [bundle load];
    NSLog(@"Loaded:%@\n",bundle);
}

Основной метод в вашем хост-приложении dummy_test может выглядеть так:

int main(int argc,const char** argv)
{
  NSBundle* bundle = [NSBundle bundleWithPath:pathToPlugin];
  [bundle load];
  NSLog(@"Loaded:%@\n",bundle);
  return NSApplicationMain(argc,argv);
}

Другие идеи для тестирования плагинов:

  • использовать независимый пакет: не указывайте ни BUNDLE_LOADER, ни TEST_HOST, а также помещайте ваши классы из плагина в пакет unittest.
  • вставьте свои тестовые примеры в плагин и попытайтесь получить этот юнит-тест. Просто слабая ссылка SenTestingKit к вашему плагину и добавьте этап сценария с: TEST_RIG=/Developer/Tools/otest "${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...