Тесты перестают работать под 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. Я использовал разные имена модулей для разных конфигураций. Итак, перейдите в Project
→ Build Settings
→ Product 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 Preferences
→ location
> Производные предварительные данные → выбрать местоположение сборки Unique
Ответ 9
Это ошибка в Xcode прямо сейчас. См. http://www.openradar.me/28095069.
Ответ 10
Выход из Xcode и удаление папки DerivedData при исправлении проблемы для меня.
$ sudo rm -Rf Library/Developer/Xcode/DerivedData
Позор вам, Apple!