Тесты перестают работать под xcode 8 Ошибка TEST_HOST

Я хочу начать тесты под Xcode 8, и он не работает в начале. Моя ошибка:

Не удалось определить идентификатор пакета для MyProjectTest TEST_HOST: "/Users/jakubmazur/Library/Developer/Xcode/DerivedData/MyProject-ejeepybggxvekxajlyngopeahiex/Build/Intermediates/CodeCoverage/Products/Testing-iphonesimulator/MyProject.app"

Любая идея, что здесь неправильно? Я пытаюсь очистить проект - ничего. В Build Settings в моей цели в Packaging я изменяю идентификатор Bundle продукта, зависит от конфигурации в моей схеме. Он может иметь какое-то отношение к этому, но не уверен.

- EDIT

Хорошо, как сузить проблему. Когда я изменяю настройки в схеме для использования конфигурации сборки Debug вместо Testing, похоже, работает, но мне нужна отдельная конфигурация для тестирования.

Ответ 1

Хорошо. Существует проблема с именами пакетов. К сожалению, есть проблема с Xcode. Я использовал разные имена модулей для разных конфигураций. Итак, перейдите в ProjectBuild SettingsProduct Module Name Измените имя во всех конфигурациях для одного и того же имени без пробелов.

Ответ 2

По какой-то причине проблема "Host Application" на рисунке ниже была проблемой для меня. Выбор правильной цели зафиксировал это.

Это изменило следующие значения в моем xcodeproj:

  • BUNDLE_LOADER = "$ (TEST_HOST)";
  • TEST_HOST = "$ (BUILT_PRODUCTS_DIR)/myappname.app/myappname";

Ответ 3

Есть еще один случай, с которым вы можете столкнуться. Если вам нужны разные имена продуктов для основной цели (например, Debug, Staging, Production) - и попробуйте использовать селектор приложений Xcode Host Application, он будет записывать неправильные значения в настройку сборки TEST_HOST.

И хотя сообщение об ошибке, которое вы видите, связано с идентификатором пакета в конфигурации Debug, Xcode фактически жалуется на TEST_HOST в конфигурации Release.

Я исправил его, вручную изменив настройку TEST_HOST. Например, если у вас есть ProductName для основной целевой установки в AppDebug в настройках Debug и AppRelease в Release, ваш TEST_HOST должен быть следующим:

Что Xcode устанавливает:

$(BUILT_PRODUCTS_DIR)/AppDebug.app/AppDebug

Что вам нужно установить:

Debug configuration: $(BUILT_PRODUCTS_DIR)/AppDebug.app/AppDebug
Release configuration: $(BUILT_PRODUCTS_DIR)/AppRelease.app/AppRelease

Ответ 4

Кажется, в Xcode8 есть несколько ошибок, которые могут вызвать это. Однако я нашел решение для случая, когда Xcode пытается найти приложение TEST_HOST в папке Intermediates/CodeCoverage/. (Я пробовал все другие решения с именами модулей и т.д., И это не сработало для меня.)

Сама проблема заключается в том, что Xcode даже не пытается создать приложение перед запуском тестов. Однако, когда Xcode сможет найти TEST_HOST в папке, которую он будет перестраивать при запуске тестов. Это как мы можем найти наш путь вокруг него.

Два возможных решения:

Если вам не нужно иметь покрытие кода: Перейдите к настройкам сборки unit test и установите Enable Code Coverage Support на No и, чтобы отключить покрытие кода в настройке теста схемы сборки. (Изменить схему, выберите Тест слева). Если вы хотите запускать модульные тесты и получать сообщение об ошибке TEST_HOST, попробуйте создать (CMD + B) или запустить приложение. Затем вы можете запускать свои тесты без этой ошибки. Вуаля.

Если вам требуется покрытие кода: Вы можете следовать определенному обходному пути, чтобы заполнить эту папку Intermediates/CodeCoverage/... Как только приложение будет внутри Xcode, он будет перестраиваться для модульных тестов, как следует, но вам нужно его заполнить один раз. Вот как вы это делаете:

  • В приложении и unit test выберите "Нет" для "Включить поддержку покрытия кода".
  • Затем на вкладке "Общие" цели unit test установите тестовое хост-приложение на "Нет"
  • Снимите флажок "Разрешить проверку хост-API"
  • Попробуйте запустить модульные тесты. Теперь Xcode по крайней мере попытается построить. Если Xcode дает ошибку сборки (иногда Xcode жалуется на Cocoapods здесь в моем опыте), попробуйте создать еще раз.
  • Повторно проверьте "Разрешить тестирование хост-API" снова в unit test target
  • Попробуйте выполнить тесты снова, как указано выше. Xcode должен жаловаться.
  • Теперь установите тестовый узел в приложение.
  • Теперь тесты должны пройти. (Пока вы не запустите чистую, вам придется повторить эти шаги.)

Я знаю, это надоедает. Но это единственное решение проблемы до сих пор.

Ответ 5

В Целевая аудитория → Настройка сборки → Тестирование → Тест-хост вы можете увидеть файл .app, который должен использоваться для тестирования.

Для меня неправильное имя файла **. app. И я заменил его **/Build/Intermediates/CodeCoverage/Products/Debug-iphonesimulator/**. App (проверьте, что файл .app присутствует в этом каталоге).

Ответ 6

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

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

Ответ 7

Я часто сталкивался с этой ошибкой и в конечном итоге обнаружил, что это было вызвано изменением PRODUCT_NAME между конфигурациями сборки Debug и Release.

Мы делали это так, чтобы сборки Debug имели другое имя приложения при установке на телефоне (а также другой идентификатор пакета, чтобы мы могли устанавливать их рядом с сборками App Store).

Мы вернули это изменение и добавили новый параметр APP_DISPLAY_NAME в конфигурацию сборки, варьировали между типами сборки и изменили Info.plist на использование $(APP_DISPLAY_NAME) вместо $(PRODUCT_NAME).

После этого важно войти в тестовую цель в проекте и убедиться, что параметр "Хост-приложение" в общем установлен на ваше приложение.

Ответ 8

перейти к xcode Preferenceslocation > Производные предварительные данные → выбрать местоположение сборки Unique

Ответ 10

Выход из Xcode и удаление папки DerivedData при исправлении проблемы для меня.

$ sudo rm -Rf Library/Developer/Xcode/DerivedData

Позор вам, Apple!