Программно определить текущую цель (запуск или тест) в проекте iOS

Есть ли способ программно определить, если вы используете код в целевом тесте против обычной цели запуска при разработке приложений для iOS?

У меня есть проверка проверки, является ли эта переменная нулевой или нет, поскольку она только в моей тестовой цели, но это кажется довольно взломанным.

[[[NSProcessInfo processInfo] environment] objectForKey:@"XCInjectBundle"] 

8 Solutions collect form web for “Программно определить текущую цель (запуск или тест) в проекте iOS”

Вы должны определить правильное значение для «Макросы препроцессора» в настройках цели.

Во время выполнения вы можете проверить это с ifdef предложения ifdef .

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

Скриншот Схемы

В моем коде приложения теперь я могу проверить, тестирую ли я или нет:

 - (void)logError:(NSError*)error{ if([[[NSProcessInfo processInfo] arguments] containsObject:@"-FNTesting"]) return; NSLog(@"LOG THE ERROR"); } 

Благодаря @cameronspickert для того, чтобы быть одним из единственных мест, где я действительно мог найти, как использовать настраиваемый аргумент

http://cameronspickert.com/2014/02/18/custom-launch-arguments-and-environment-variables.html

Теперь мы можем просто проверить это с помощью одной строки кода для « UITesting ».

 [[[NSProcessInfo processInfo] arguments] containsObject:@"-ui_testing"] 

-ui_testing появится только при тестировании приложения.

В Xcode 6 вы можете проверить значение XPC_SERVICE_NAME в переменных среды, чтобы узнать, работает ли Simulator или приложение напрямую.

При запуске непосредственно переменная будет иметь что-то вроде UIKitApplication:com.twitter.FabricSampleApp[0xb9f8]

При выполнении модульных тестов это будет выглядеть так: com.apple.xpc.launchd.oneshot.0x10000008.xctest

 + (BOOL)isRunningUnitTests { NSString *XPCServiceName = [NSProcessInfo processInfo].environment[@"XPC_SERVICE_NAME"]; BOOL isTesting = ([XPCServiceName rangeOfString:@"xctest"].location != NSNotFound); return isTesting; } 

Протестировано на Xcode 7.3

Создайте категорию в NSProcessInfo .

 @implementation NSProcessInfo (RunningTests) - (BOOL)ag_isRunningTests { return ([self.environment objectForKey:@"XCTestConfigurationFilePath"] != nil); } @end 

Спасибо! Помогает. Вот несколько примеров:

 func isRunningTests() -> Bool { var arguments = NSProcessInfo.processInfo().arguments as! [String] println("arguments ===\(arguments)") let testArgs = arguments.filter({ $0 == "-FNTesting" }) if !testArgs.isEmpty { return true } return false } 

В настройках проекта на вкладке «Информация» создайте новую конфигурацию (в дополнение к умолчанию «Отладка» и «Выпуск»). Затем вы сможете определить различные макросы препроцессора в целевых настройках (на вкладке «Настройки сборки») для каждой конфигурации. XCode уже использует это, чтобы добавить «DEBUG = 1» для конфигурации Debug, которая позволяет вам использовать «#ifdef DEBUG» в вашем коде. Вы можете добавить любые другие макросы, которые вам нравятся, например «TESTING = 1».

Спасибо @ steven-hepting, ваш ответ помог мне указывать в правильном направлении, чтобы решить мою проблему.

Но при использовании «Host Application» в ваших модульных тестах «XPC_SERVICE_NAME» вернет ту же строку, что и обычный запуск приложения (очевидно). Таким образом, ваша проверка не всегда работает. Вот почему я также проверяю TestBundleLocation . Протестировано с помощью Xcode 7.2 (7C68).

 + (BOOL)isRunningUnitTests { NSDictionary<NSString *, NSString *> *env = [NSProcessInfo processInfo].environment; // Library tests NSString *envValue = env[@"XPC_SERVICE_NAME"]; BOOL isTesting = (envValue && [envValue rangeOfString:@"xctest"].location != NSNotFound); if (isTesting) { return YES; } // App tests // XPC_SERVICE_NAME will return the same string as normal app start when unit test is executed using "Host Application" // --> check for "TestBundleLocation" instead envValue = env[@"TestBundleLocation"]; isTesting = (envValue && [envValue rangeOfString:@"xctest"].location != NSNotFound); return isTesting; } 
  • iOS: когда использовать идентификатор подписи кода в конфигурации сборки?
  • XC Testing Framework iOS (XCode 6.1) Тест-сессия завершена (80) без проверки
  • Издевательские ожидания в Киви (iOS) для делегата
  • IOS Sandbox Test User account Управление подпиской
  • Как выбрать элементы для Frank с помощью UIQuery / UISpec?
  • Получить «Закупку» для покупки приложения
  • Неожиданная ошибка при подключении ACDOAuthSigner: Ошибка домена = XPCObjectsErrorDomain Code = 2
  • TeamCity + Xcode 6 - Запустить тестовое действие не удается
  • Приложение для тестирования бета-тестирования TestFlight для iOS
  • Выполнять тесты GUI iOS monotouch автоматически из командной строки
  • Как мой тест XCode UI обнаруживает, что экран изменился?
  • Interesting Posts

    iOS / Слишком частое событие rssi из драйвера ..?

    быстрая проверка, если два массива содержат один и тот же элемент и получить элемент?

    Форматирование новой строки не поддерживается в свойстве contentDescription объекта CSSearchableItemAttributeSet

    ленивый атрибут в Swift эквивалентен ленивому Init getter в Objective C

    Странный сбой при использовании нового эффекта PageCurl при чтении PDF с помощью MonoTouch и iOS 5.0

    Когда & зачем вы используете @interface ClassName (Private)? – Цель-C

    iOS – wait_fences MFMessageComposeViewController

    Изображения не отображаются на устройстве, а в симуляторе

    API поиска iTunes возвращает старые данные в моем APP

    Перехватить входящий вызов ios sdk (Non Jailbreak)

    Подпрограмма iOS Parse PFObject с быстрым поведением

    forge.facebook.ui callback, вызванный нулевым значением в iOS

    Как измерить истинную производительность FPS OpenGL ES?

    Ошибка тестирования песочницы In-App-Purchase

    Xcode Watchkit: ни один из действительных профилей подготовки не разрешил указанные права: beta-reports-active, com.apple.security.application-groups

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.