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

Tests stop working under xcode 8 TEST_HOST error

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

Could not determine bundle identifier for MyProjectTest's TEST_HOST: "/Users/jakubmazur/Library/Developer/Xcode/DerivedData/MyProject-ejeepybggxvekxajlyngopeahiex/Build/Intermediates/CodeCoverage/Products/Testing-iphonesimulator/MyProject.app"

知道这里出了什么问题吗?我尝试清理项目 - 什么都没有。 在 Packaging 目标中的 Build Settings 中,我根据模式中的配置更改产品包标识符。它可能与此有关,但不确定。

-- 编辑

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

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

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

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

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

出于某种原因,下图中的 "Host Application" 设置对我来说是个问题。选择合适的目标可以解决这个问题。

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

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

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

虽然您看到的错误消息是关于调试配置中的包标识符,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

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

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

两种可能的解决方案:

如果您没有代码覆盖率: 转到单元测试目标的 Build Settings 并将 Enable Code Coverage Support 设置为 No and deactivate code构建方案测试设置中的覆盖率。 (编辑scheme,左边selectTest)。如果你想 运行 你的单元测试并且仍然得到 TEST_HOST 错误消息,请尝试构建 (CMD+B ) 或 运行ning 您的应用程序。然后你可以 运行 你的测试没有那个错误。瞧。

如果需要代码覆盖: 您可以按照特定的解决方法来填充 Intermediates/CodeCoverage/.. 文件夹。一旦应用程序在内部 Xcode 将按原样重建单元测试,但您需要将其填充一次。这就是你的做法:

  • 在应用程序和单元测试目标 select No for "Enable Code Coverage Support"
  • 然后在单元测试目标的 "General" 选项卡中将测试主机应用程序设置为 "None"
  • 取消选中 "Allow testing Host API"
  • 尝试开始单元测试。 Xcode 现在至少会尝试构建。如果 Xcode 出现构建错误(根据我的经验,有时 Xcode 会在这里抱怨 Cocoapods),请再次尝试构建。
  • 在单元测试目标中再次检查"Allow testing Host API"
  • 像上面那样再次尝试 运行测试。 Xcode应该投诉。
  • 现在将测试主机设置为应用程序。
  • 现在测试应该 运行 通过了。 (在你 运行 干净之前,你将不得不重新执行这些步骤..)

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

我发现测试不会 运行 除非你已经构建并且 运行 与你 运行 在 [=14= 上进行测试的目标相同] 你正在测试。

例如,如果我 运行 针对目标生产的测试,那么我必须先在 device/sim 上构建并 运行 目标生产 运行 测试。如果我不这样做,它会给我同样的错误。

我 运行 经常遇到这个错误,最终发现它是由 PRODUCT_NAME 调试和发布构建配置之间的变化引起的。

我们这样做是为了让 Debug 版本在安装到 phone 时具有不同的应用程序名称(以及不同的包 ID,以便我们可以将它们与 App Store 并排安装构建)。

我们还原了该更改并向构建配置添加了一个新的 APP_DISPLAY_NAME 设置,在构建类型之间改变了设置,并将 Info.plist 更改为使用 $(APP_DISPLAY_NAME) 而不是$(PRODUCT_NAME).

完成之后,重要的是进入项目中的测试目标并确保常规中的 'Host application' 设置实际设置为您的应用程序。

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

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

你真丢脸,Apple!

转到 xcode Preferences -> location > 派生数据高级 -> select 构建位置 Unique

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

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

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

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

  1. App TargetBuild Settings > Product Name 用于该构建配置(例如,"Debug"),
  2. 相同构建配置的测试目标构建设置>测试主机$(BUILT_PRODUCTS_DIR)...之后的部分)

因此,如果 #1 是(例如):

MyApp-Debug

,那么#2 必须是:

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

就我而言,我的方案是构建 AdHoc 配置,产品名称以 -DEV(开发)后缀结尾,但 测试目标 正在寻找以 -STG (staging) 后缀结尾的主机。