测试在 xcode 8 TEST_HOST 错误下停止工作

Posted

技术标签:

【中文标题】测试在 xcode 8 TEST_HOST 错误下停止工作【英文标题】:Tests stop working under xcode 8 TEST_HOST error 【发布时间】:2016-09-14 14:27:03 【问题描述】:

我想在 Xcode 8 下开始测试,但一开始就失败了。我的错误是:

无法确定 MyProjectTest 的 TEST_HOST 的包标识符: "/Users/jakubmazur/Library/Developer/Xcode/DerivedData/MyProject-ejeepybggxvekxajlyngopeahiex/Build/Intermediates/CodeCoverage/Products/Testing-iphonesimulator/MyProject.app"

知道这里有什么问题吗?我尝试清理项目 - 没有。 在Packaging 我的目标中的Build Settings 中,我更改产品捆绑标识符取决于我的架构中的配置。这可能与此有关,但不确定。

-- 编辑

确定如何缩小问题范围。当我更改方案中的设置以使用构建配置Debug 而不是Testing 似乎可以工作,但我需要单独的配置进行测试。

【问题讨论】:

您是否尝试删除 /Users/jakubmazur/Library/Developer/Xcode/DerivedData 下的所有内容? 是的,这是我的第一步 - 没用 您是否尝试重新创建您的Testing 方案?这不好玩,但应该会有所帮助。 是的,正如我在问题中所说,只要它在相同的配置中就可以了,当我更改配置时,我会遇到同样的错误 【参考方案1】:

出于某种原因,下图中的“主机应用程序”设置对我来说是个问题。选择合适的目标解决了这个问题。

这最终修改了我的 xcodeproj 中的以下值:

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

【讨论】:

【参考方案2】:

您可能还会遇到另一种情况。如果您需要不同的产品名称作为主要目标(例如 Debug、Staging、Production) - 并尝试使用 Xcode 主机应用程序选择器,它将向 TEST_HOST 构建设置写入不正确的值。

虽然您看到的错误消息是关于 Debug 配置中的包标识符,但 Xcode 实际上抱怨 Release 配置中的 TEST_HOST。

我通过手动更改 TEST_HOST 构建设置来修复它。例如,如果您将主要目标上的 ProductName 在 Debug 中设置为 AppDebug,在 Release 配置中设置为 AppRelease,则您的 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

【讨论】:

美男子!如何使@testable import 泛型?【参考方案3】:

我的项目有很多目标,所以我必须将测试目标的主机应用程序设置为“无”。 (Xcode 9.2)

【讨论】:

这是我的情况 =) 谢谢!【参考方案4】:

好吧,弄清楚。命名包有问题。不幸的是,Xcode 存在一些问题。我对不同的配置使用不同的模块名称。所以转到Project -> Build Settings -> Product Module Name 将所有配置中的名称更改为相同的名称,不带空格。

【讨论】:

我在项目级别定义了一个Product Module Name,它被我的应用程序/TEST_HOST 继承并被测试目标覆盖。我删除了项目中定义的Product Module Name,并在应用程序和测试目标上设置了该字段,然后一切又开始工作了。 @Kuba 即使在 Xcode 9 beta 4 中这也解决了我的问题...谢谢:) 嗨,难道不会把其他应用程序弄得一团糟吗?当我更改我的Product Module Name 时,我的应用程序无法再取消归档某些归档对象,因为发生了变化。【参考方案5】:

我也有一个包含多个方案的项目,每个方案都使用单独的配置(调试、AdHoc 等)和单独的产品名称构建应用程序(MyApp、MyApp_Dev、MyApp_Staging 等)。

谢天谢地,它们都具有相同的模块名称,因此我的单元测试源文件可以简单地使用@testable import MyApp,而不管活动方案如何。

为了克服这个错误,我只需要确保对于我想要测试的应用目标的每个方案,以下两个匹配:

    App TargetBuild Settings > Product Name 用于构建配置(例如“调试”), Test TargetBuild Settings > Test Host 用于相同的构建配置($(BUILT_PRODUCTS_DIR)... 之后的部分)

所以,如果 #1 是(例如):

MyApp-Debug

,那么#2 必须是:

$(BUILT_PRODUCTS_DIR)/MyApp-Debug.app/MyApp-Debug

在我的例子中,我的方案是构建 AdHoc 配置,其产品名称以 -DEV(开发)后缀结尾,但 测试目标 正在寻找一个以-STG(分期)的后缀。

【讨论】:

【参考方案6】:

Xcode8 中似乎有几个错误可能导致此问题。但是,对于 Xcode 尝试在 Intermediates/CodeCoverage/ 文件夹中查找 TEST_HOST 应用程序的情况,我找到了解决方案。 (我用模块名称等尝试了所有其他解决方案,但它对我不起作用。)

问题本身似乎是 Xcode 在运行测试之前甚至没有尝试构建应用程序。 然而一旦 Xcode 能够在文件夹中找到 TEST_HOST,它在启动测试时重建。这样我们才能找到解决方法。

两种可能的解决方案:

如果您没有必须拥有代码覆盖率: 转到您的单元测试目标的构建设置并将Enable Code Coverage Support设置为在构建方案的测试设置中停用代码覆盖率。 (编辑方案,选择左侧的 Test)。如果您想运行单元测试并且仍然收到 TEST_HOST 错误消息,请尝试构建 (CMD+B) 或运行您的应用程序。然后您可以运行测试而不会出现该错误。瞧。

如果您需要代码覆盖率: 您可以按照某种解决方法来填充 Intermediates/CodeCoverage/.. 文件夹。一旦应用程序在 Xcode 中,它将按照应有的方式重建单元测试,但您需要填充一次。这就是你的做法:

在应用程序和单元测试目标中为“启用代码覆盖支持”选择 然后在单元测试目标的“常规”选项卡中将测试主机应用程序设置为“无” 取消选中“允许测试主机 API” 尝试开始单元测试。 Xcode 现在至少会尝试构建。如果 Xcode 出现构建错误(根据我的经验,有时 Xcode 会在此处抱怨 Cocoapods),请再次尝试构建。 在单元测试目标中再次检查“允许测试主机 API” 尝试按上述方式再次运行测试。 Xcode 应该抱怨。 现在将测试主机设置为应用。 现在应该运行测试。 (在您运行干净之前,您必须重新执行这些步骤..)

我知道,这很麻烦。但这是迄今为止解决问题的唯一方法。

【讨论】:

【参考方案7】:

测试目标>>构建设置>>测试>>测试主机你可以看到应该用于测试的.app文件。

对我来说 **.app 文件名错误。我将其替换为 **/Build/Intermediates/CodeCoverage/Products/Debug-iphonesimulator/**.app(检查此目录下的 .app 文件)。

【讨论】:

我刚刚完全删除了Test Host,它适用于我的测试目标并且它有效。我这样做是为了一个框架,我不确定这是否会改变事情。【参考方案8】:

我经常遇到这个错误,最终发现它是由 Debug 和 Release 构建配置之间的不同 PRODUCT_NAME 引起的。

我们这样做是为了让 Debug 版本在安装在手机上时具有不同的应用名称(以及不同的捆绑包 ID,因此我们可以将它们与 App Store 版本并排安装)。

我们恢复了该更改并将新的 APP_DISPLAY_NAME 设置添加到构建配置中,改变了构建类型之间的设置,并将 Info.plist 更改为使用 $(APP_DISPLAY_NAME) 而不是 $(PRODUCT_NAME)。

完成此操作后,进入项目中的测试目标并确保“常规”中的“主机应用程序”设置实际上已设置为您的应用程序,这一点很重要。

【讨论】:

【参考方案9】:

我发现测试不会运行,除非你在你正在测试的设备/sim 上构建并运行你正在运行测试的相同目标。

例如,如果我针对目标 Production 运行测试,那么我必须先在设备/sim 上构建并运行目标 Production,然后才能运行测试。如果我不这样做,它会给我同样的错误。

【讨论】:

【参考方案10】:

转到 xcode Preferences -> location > Derived Data Advance -> 选择构建位置 Unique

【讨论】:

【参考方案11】:

这是目前 Xcode 中的一个错误。见http://www.openradar.me/28095069。

【讨论】:

不,这里不是这样。我尝试在 9.3 上运行 此链接似乎没有引用 @Kuba 描述的 TEST_HOST 错误。【参考方案12】:

退出 Xcode 并删除 DerivedData 文件夹为我解决了这个问题。

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

苹果你真丢脸!

【讨论】:

以上是关于测试在 xcode 8 TEST_HOST 错误下停止工作的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 8:UI 测试远程按钮错误:找不到焦点元素

删除 XCode 8 中的单元测试

可以在 IOS 8 (Xcode 6) 模拟器中测试应用内购买吗?

Xcode 5 应用程序在 IOS 8 的已发布版本下无法运行

Xcode 8:UI 测试找不到正在测试的库

Xcode 8 App安装失败,出现未知错误