Программно определить текущую цель (запуск или тест) в проекте 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; } 
  • Как настроить тест EarlGrey для ожидания просмотра или события?
  • Можно ли запускать тесты XCTest в приложении iOS?
  • IOS Test Failure - «Нет реализации для ...»
  • Контроллеры iOS для тестирования Cedar
  • Приложение для тестирования бета-тестирования TestFlight для iOS
  • Получить «Закупку» для покупки приложения
  • Имитировать изменения ориентации в iOS для целей тестирования
  • Проверьте электронную почту во время тестирования пользовательского интерфейса Xcode?
  • Что такое сообщение об ошибке vendorID, связанное с «Не удается подключиться к iTunes» для покупки в приложении?
  • iOS: тестирование кода не найдено
  • Как упростить создание пользовательских приложений для iOS для Spotlight
  • IOS Sandbox Test User account Управление подпиской
  • Interesting Posts

    Планирование второго уведомления, если вначале игнорируется в быстром (или завершении любого действия, если уведомление игнорируется)

    iO Печать текущего экрана

    Как получить список пользователей SharePoint по имени паттерна

    Facebook SDK: приложение не зарегистрировано как схема URL

    фиксированная ориентация не работает на ipad ios 8 swift xcode 6.2

    Программа сбоев классов достижимости – не знаю, почему

    Возможно ли AVRCP на BLE с iOS?

    IOS Objective C – ошибка при передаче параметра между двумя контроллерами представления

    Как проверить, имеет ли объект NSMutableArray уже (объект __bridge id) в массиве

    Средство просмотра документов для приложений телефонной заставки

    Добавить значения в NSMutableDictionary в iOS с Objective-C

    Застревает с добавлением цели в кнопку в программном режиме 3

    Как получить все наблюдатели NSNotificationCenter?

    Цель C DESede / CBC / PKCS5Padding

    На основе чего работает iOS App Slicing? Есть ли какой-нибудь код или другой материал, необходимый для этого?

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