2013-10-07 2 views
32

Когда я запускаю свои тесты в XCode 5, основное окно моего приложения OS X появляется на экране в течение нескольких секунд во время выполнения тестов. Зачем? Даже если я раскомментирую все свои тесты, он все равно открывает мое главное окно.Модульное тестирование XCode 5: запускает мое приложение

+0

вышеперечисленные решения здесь касаются статического изменения того, что вы создаете, чтобы исключить исполняемые биты приложения. Это может быть то, что вы хотите, но очень простым и очень эффективным альтернативным решением является запуск ваших модульных тестов ** без делегата приложений **. К сожалению, [ответ на этот вопрос] (http://stackoverflow.com/a/39142986/2547229), который предлагает этот подход, имеет только один голос на данный момент.[Другой вопрос] (http://stackoverflow.com/q/15714697/2547229) по этой теме [более высокие голосовые ответы] (http://stackoverflow.com/a/15725328/2547229) с использованием подхода делегата. – Benjohn

+0

Я использую динамический делегат, и я поставил уточнение для обнаружения тестового прогона в [мой ответ] (http://stackoverflow.com/a/42065078/2547229). – Benjohn

ответ

37

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

Here является руководством по настройке тестового приложения и логического теста.

Если вы хотите изменить его к логическому тесту (так что работать быстрее и не нужно, чтобы начать свое приложение первым):

  1. идет строить настройки для модульного тестирования цели
  2. поиска Bundle
  3. удалить Bundle погрузчика и Test хост

enter image description here

+8

Когда я это делаю, тестовый объект не может правильно подключиться. Цель тестирования была создана XCode (с опцией New test target в тестовом навигаторе), и я не коснулся ее отдельно от нее. –

+0

@ DanielBruce попробуйте добавить загрузчик пакетов назад –

+0

Это было в случае с Xcode 4, может ли OP проверить, что это сработало? (Должен быть зарегистрированным разработчиком, чтобы увидеть ссылку) https://devforums.apple.com/message/867874#867874 – qnoid

10

Правильно, вам нужно удалить «Bundle Loader» и «Test Host» из ваших настроек сборки.

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

Это ан сообщения об ошибке, если вы опустили файл:

Undefined symbols for architecture i386: 
    "_OBJC_CLASS_$_Module", referenced from: 
     objc-class-ref in Lobic Network.o 
     objc-class-ref in Logic_Unit.o 
ld: symbol(s) not found for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Вы можете добавить недостающие файлы, выбрав файл реализации и воспитывая файл инспектор. Будет раздел с названием «Целевое членство», и вы также можете установить целевое членство файлов в свой модульный тест.

1

Я просто потерял утро на этом.

Проект был создан в XCode 4 и использовался SenTesting.

Пробовал мигрирующие тесты на XCode 5/XCTTest

Если бы тот же вопрос - приложение побежало в тренажере и тест никогда не начинал после попытки все (переход от приложения к логическим тестам, изменение XCTest, удалить SenTesting)

отказался от создания чистого проекта XCode 5.

Добавлено все мои файлы и тесты прошли нормально.

Может все-таки есть проблемы с раскадровкой, как они были построены с XCode 4.

Радикальные, но это работает так держать его в качестве последнего средства.

9

С XCTest файлы приложений НЕ ДОЛЖЕН быть включен в объекты XCTest.. Комплект XCTest связан с приложением, которое делает эти файлы доступными во время выполнения.

Чтобы сделать эту работу, обеспечить опцию компилятора «символов скрыты по умолчанию» установлен в NO в пределах целевого приложения.

Вот блоге со скриншотами для ясности: http://zmcartor.github.io/code/2014/02/24/slim-xctest-targets

Преимущества этого подхода заключается в том тесты цель строит гораздо быстрее.

+1

Я думаю, что немного стыдно, что Apple требует, чтобы у вас было компилирующее приложение до того, как любой из ваших тестов может работать ... Я бы предпочел, чтобы мои тесты имели одинаковые зависимости как мое приложение, но скомпилированное независимо от цели приложения (то есть Host Application должно быть пустым). Это возможно? – fatuhoku

+0

Ссылка мертва, к сожалению. – Benjohn

+0

привет, ссылка исправлена ​​ – HackaZach

1

На XCode5 приложение запускается. Этот ответ показывает, как изменить свой делегат при выполнении модульных тестов, чтобы он сразу же удалялся: https://stackoverflow.com/a/20588035/239408

+0

Это для меня, по крайней мере, намного лучшее решение. Жаль, что ваш ответ здесь не был проголосован, и что этот другой вопрос не тот, который попадает в мой гуглинг! – Benjohn

2

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

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

Следующие работали для меня в Xcode6.

File > New Target... 

Выберите комплект для тестирования какао из категории OS X.

enter image description here

Позаботьтесь, чтобы выбрать None из целевого раскрывающегося списка.

Specify new test target

Нажмите кнопку Готово. Добавьте соответствующие файлы в новую цель, как описано выше.

Теперь создайте схему для запуска теста.

Нажмите на схему выбора справа вверху и выберите New Scheme..., щелкните раскрывающийся список и перейдите по списку к новой цели. Теперь вы можете выбрать схему из схемы chooser и использовать ⌘U для запуска тестов.

enter image description here

4

В XCode 7, удаление Host Application не работает для меня. В действительности я использую следующее, чтобы избежать запуска приложений.

  1. Настройка испытаний Аргументы Схема enter image description here

  2. в main.m

    static bool isRunningTests() 
    { 
        NSDictionary* environment = [[NSProcessInfo processInfo] environment]; 
        NSString* testEnabled = environment[@"TEST_ENABLED"]; 
        return [testEnabled isEqualToString:@"YES"]; 
    } 
    
  3. изменить основной()

    int main(int argc, char * argv[]) { 
        @autoreleasepool { 
         if (isRunningTests()) { 
          return UIApplicationMain(argc, argv, nil, nil); 
         } else { 
          return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
         } 
        } 
    } 
    
Смежные вопросы