使用 xcodebuild 对 Swift 包运行测试:错误测试必须在具体设备上运行

问题描述

我正在尝试使用 Package.swift 为我的 Swift 包(由 xcodebuild 定义)运行测试:

xcodebuild -scheme "package-name-Package" -configuration "Debug" -sdk "iphonesimulator14.5" -arch "x86_64" test`

不幸的是,我不断收到此错误

xcodebuild: error: Failed to build workspace package-name with scheme package-name-Package.
    Reason: Cannot test target “Target1Tests” on “Any iOS Simulator Device”: Tests must be run on a concrete device
Cannot test target “Target2Tests” on “Any iOS Simulator Device”: Tests must be run on a concrete device
Cannot test target “Target3Tests” on “Any iOS Simulator Device”: Tests must be run on a concrete device

我不确定要使用什么 -sdk。我已经阅读了 xcodebuild -showsdks输出并进行了适当的选择(我需要为 iOS 构建/测试)。我试过 iphoneos iphonesimulatoriphoneos15.0iphonesimulator15.0iphonesimulator14.5iphoneos14.5 作为 sdk。 (Xcode 12 和 Xcode 13 beta,使用 xcode-select

解决方法

感谢支持善良的陌生人,我确实设法弄明白了:有两种方法。

主要的解决方案是使用 -destination 而不是 -sdk。好的,? _dump:

Xcode 工作区中的 Swift 包 (WorkspaceName.xcworkspace)

我的首选选项:我最终将 Swift 包放在 Xcode 工作区中。我的意思是将包含 Swift 包(以及工作区)的根目录拖到 Xcode 项目导航器/工作区中。

优点是每次启动 Xcode 时不会生成 Xcode 方案,而是与工作区相关联。这意味着每次启动 Xcode 时都不会重置您的修改(例如添加环境变量)。

xcodebuild -workspace ./WorkspaceName.xcworkspace -scheme SchemeName -destination 'platform=iOS Simulator,name=iPhone 12' test

注意事项:

  • 如果要构建项目,只需设置正确的方案并将test替换为build
  • Here 是 Xcode 13 Beta 上可用的目的地列表。一个例子是:{ platform:iOS Simulator,id:FD90A730-A1D5-4BBC-B61A-0324400EE9EA,OS:15.0,name:iPhone 12 }
  • 您可以从 Xcode 工作区或通过运行 SchemeName
  • 获取 xcodebuild -list
  • 使用的目的地是 platform=iOS Simulator,name=iPhone 12。您可以从包含 Xcode 项目、工作区或包的目录中的 xcodebuild -workspace ./WorkspaceName.xcworkspace -scheme SchemeName -showdestinations 获取目标列表。
  • 我通过只是选择 platformname 属性使其工作,而不指定 OS 或 `ID。这很好,因为 CI 系统可能适用于不同操作系统的不同 Xcode,尽管您可能更愿意指定它。
  • 您需要正确格式化目的地,xcodebuild 将它们打印在 json 中,但您应该以逗号分隔并以等号提供它们。

没有 Xcode 工作区的 Swift 包

如果您没有工作区,您可以:

  • 运行xcodebuild -list
  • 选择最有意义的方案(可能是标有 your-package-name-is-here-Package 的方案)
  • 运行:
xcodebuild -scheme SchemeName -destination 'platform=iOS Simulator,name=iPhone 12' test
  • 警告:实际上要确保不要在同一目录中有工作区。 (即不包含您的 Swift 包,因为 Xcode 会混淆。)如果它看到一个工作区,它不会检测基于当前目录中的 Package.swift 自动生成的 Xcode 方案.