Подтвердить что ты не робот

Не запускайте симулятор при запуске unittests

Немного фона:

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

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

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

Проблема

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

  • Команда U в Xcode

  • Или командная строка "/usr/bin/xcodebuild -схема UnitTests -sdk iphonesimulator -configuration Релиз чистой сборки TEST_AFTER_BUILD = YES"

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

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

Обновление 1

Кажется, он находит очень похожий вопрос, но не может заставить его работать: Запустить логические тесты в Xcode 4 без запуска симулятора

Обновление 2

Я нашел ОЧЕНЬ актуальный и интересный вопрос/ответ: Apple CI/Xcode Service и Jenkins

4b9b3361

Ответ 1

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

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

Чтобы сделать это,

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

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

введите описание изображения здесь

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

brew install xctool

3. Запустите тесты с помощью терминала с помощью xctool.

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

Ответ 2

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

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

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

EDIT: У меня также был успех с этим, и это немного более прямолинейно:

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

Ответ 3

Вы можете создать Mac OSX Unit Test вместо iOS unit test. Это требует, чтобы вы не включали никаких конкретных библиотек iOS в модульные тесты. Вы можете сделать это через:

  • Выберите проект → снимок цели → "Добавить цель..."
  • Выберите "Mac OSX" → "Другое" → "Cocoa Блок тестирования оборудования"
  • Создайте тестовый комплект, как обычный проект

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

Ответ 4

Цель тестирования 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
    } 

...

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

Ответ 5

Обход проблемы:

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

Подход:

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

Каркасы:

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