2013-08-08 4 views
30

Некоторые фона:Не запускать симулятор при запуске UnitTests

У меня есть приложение IOS с целью сконфигурированный для запуска UnitTests. И я запускаю инструмент автоматизации автоматизации jenkins на своем MacBook, который автоматически создает это приложение и запускает все тесты (используя инструмент командной строки xcodebuild).

Все работает отлично с Xcode 4. Этот инструмент автоматизации сборки работал под другим пользователем и выполнял все эти тесты.

Недавно я переключился на Xcode 5, и он начал сбой, потому что он не может запускать Simulator.

Проблема

У меня есть схема UnitTests, которая сконфигурирована для выполнения тестов (логические тесты). AI запустить эти испытания с использованием одного из двух методов:

  • Команда U в Xcode

  • Или командной строки «/ USR/BIN/xcodebuild -схема UnitTests -sdk iphonesimulator -конфигурация Выпуск чистой сборки TEST_AFTER_BUILD = YES "

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

Есть ли способ избавиться от этого надоедливого запуска симулятора (потому что он прерывает мою автоматизацию сборки)?

Update 1

Кажется, найти очень похожий вопрос, но не может получить его работу: Run logic tests in Xcode 4 without launching the simulator

Update 2

Я нашел очень актуальный и интересный вопрос/ответ : Apple CI/Xcode Service and Jenkins

+0

Этот вопрос также может помочь. Шаги должны быть примерно одинаковыми для приложения iOS. http://stackoverflow.com/questions/19219706/xcode-5-unit-testing-starts-my-app –

+0

@CleverError: Спасибо. Я посмотрю на это. –

+0

Почему вы не хотите запускать симулятор? – quellish

ответ

12

Вы можете создать тестовое устройство Mac OSX вместо n iOS. Это требует, чтобы вы не включали никаких конкретных библиотек iOS в модульные тесты. Вы можете сделать это с помощью следующего:

  1. Выберите проект -> целевой ниспадающего -> "Добавить объект ..."
  2. Выберите "Mac OSX" -> "Другие" -> «Какао-Unit Тестирование Bundle»
  3. Создайте пакет тестирования, как вы бы нормальный проект

Теперь вы можете добавить источники модульного тестирования и запустить его как тест IOS без запуска тренажера.

+2

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

13

Я задал тот же вопрос инженерам-яблокам. К сожалению, похоже, что вы не можете этого сделать и остаться с iOS одновременно. Есть несколько трюков, которые вы можете сделать, чтобы проверить, тестируете ли вы. Вы можете поместить этот фрагмент кода в свой AppDelegate.ч или какой-либо другой глобальный класс говорить не загружать корневую ViewController и предотвратить wierdo щий вещи из развращают модульные тесты:

static BOOL isTesting() { 
    BOOL isTesting = !isEmpty([[[NSProcessInfo processInfo] environment] objectForKey:@"XCInjectBundle"]); 
    return isTesting; 
} 

Я также был инженер яблока проверить это добросовестная проверка. И, чтобы дать кредит, где кредит должен, это от: Programmatically determine current target (run or test) in iOS project

EDIT: Я также имел успех с этим, и это немного более прямо вперед:

static BOOL isTesting() { 
    return [[[NSProcessInfo processInfo] processName] isEqualToString:@"xctest"]; 
} 
+0

Я предполагаю, что вы хотели бы сделать: return isTesting; В отличие от 'return NO;' –

+0

Да, извините. Вложил код из проекта и не обратил внимания! – rfrittelli

+0

Это интересное решение! – LightningStryk

16

Использование Xcode 7 и xCtool.

xctool способен выполнять единичные тесты без симулятора.

Чтобы получить эту работу,

1. Обновите целевые настройки для запуска без приложения-хозяина.

Выберите проект -> затем проверьте цель -> Установите для хост-приложения значение none.

enter image description here

2. Установите xctool, если у вас его нет.

brew install xctool 

3. Выполните тесты с использованием терминала с xctool. Тест целевого

xctool -workspace yourWorkspace.xcworkspace -scheme yourScheme run-tests -sdk iphonesimulator 
+1

Возможно, вы столкнулись с ошибками компоновщика с классами, которые недоступны в тестовом комплекте, разрешите им работать. – rustylepord

+0

Это странно. Документация xctool гласит: «Если вы используете xctool в непрерывной интеграции, учетная запись пользователя, вызывающая xctool, должна иметь активный контекст графического интерфейса. Если нет, симулятор не сможет начать с загадочных предупреждений] (https://github.com/facebook/xctool). –

1

OSX может стать огромными хлопоты, потому что вы должны управлять собой, каким файл источника включить. Помещение @testable import YourAppName поверх ваших файлов XCTest является более удобным. Поэтому просто запретите запуск приложения в случае прогона XCTest.

В вашем AppDelegate поставил: (Swift 3 раствор)

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
{ 
    if ProcessInfo.processInfo.environment["XCInjectBundleInto"] != nil { 
     return false 
    } 

... 

Это не предотвратит симулятор от запуска, но сэкономит вам много времени.

+0

Я не понимаю, если это не остановит запуск симулятора, как это ответ на вопрос? – smileBot

0

Обход:

App будет еще запустить, но вы можете #if, чтобы определить, что вы не хотите работать.

подход:

  1. Создание пользовательской конфигурации сборки под названием Test дублируя Debug (Project> Info> создать новую конфигурацию)
  2. В Build Settings>Active Compilation Conditions для Test добавить TESTING
  3. Редактировать Схема> Информация> Конфигурация сборки, установить конфигурацию сборки в качестве теста
  4. Использовать #if !TESTING#endif вокруг c ode, который вы не хотите выполнять при тестировании.

рамочные:

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