You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一SPM仓库中多Target的独立构建与测试问题咨询

如何在多Target的Swift Package中单独测试单个Target

问题概述

当Swift Package包含多个Target时,Xcode自动生成的单个Target对应的scheme默认不支持test操作,执行xcodebuild build test会报错:Scheme [TargetName] is not currently configured for the test action,只能通过Package scheme一次性测试所有Target,无法单独测试单个Target。

解决方案

方案1:手动创建支持测试的Target Scheme

这是目前可行的方案,步骤如下:

  • 在Package根目录下创建路径:.swiftpm/workspace/xcshareddata/xcschemes/
  • 为每个需要单独测试的Target创建对应的.xcscheme文件,以MultiPackage1为例,scheme文件需关联对应的测试目标(示例XML配置如下):
    <?xml version="1.0" encoding="UTF-8"?>
    <Scheme
       LastUpgradeVersion = "1400"
       version = "1.3">
       <BuildAction
          parallelizeBuildables = "YES"
          buildImplicitDependencies = "YES">
          <BuildActionEntries>
             <BuildActionEntry
                buildForTesting = "YES"
                buildForRunning = "YES"
                buildForProfiling = "YES"
                buildForArchiving = "YES"
                buildForAnalyzing = "YES">
                <BuildableReference
                   BuildableIdentifier = "primary"
                   BlueprintIdentifier = "MultiPackage1"
                   BuildableName = "MultiPackage1"
                   BlueprintName = "MultiPackage1"
                   ReferencedContainer = "container:MultiPackage.swiftpm">
                </BuildableReference>
             </BuildActionEntry>
             <BuildActionEntry
                buildForTesting = "YES"
                buildForRunning = "NO"
                buildForProfiling = "NO"
                buildForArchiving = "NO"
                buildForAnalyzing = "NO">
                <BuildableReference
                   BuildableIdentifier = "primary"
                   BlueprintIdentifier = "MultiPackage1Tests"
                   BuildableName = "MultiPackage1Tests.xctest"
                   BlueprintName = "MultiPackage1Tests"
                   ReferencedContainer = "container:MultiPackage.swiftpm">
                </BuildableReference>
             </BuildActionEntry>
          </BuildActionEntries>
       </BuildAction>
       <TestAction
          buildConfiguration = "Debug"
          selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
          selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
          shouldUseLaunchSchemeArgsEnv = "YES">
          <Testables>
             <TestableReference
                skipped = "NO">
                <BuildableReference
                   BuildableIdentifier = "primary"
                   BlueprintIdentifier = "MultiPackage1Tests"
                   BuildableName = "MultiPackage1Tests.xctest"
                   BlueprintName = "MultiPackage1Tests"
                   ReferencedContainer = "container:MultiPackage.swiftpm">
                </BuildableReference>
             </TestableReference>
          </Testables>
       </TestAction>
       <LaunchAction
          buildConfiguration = "Debug"
          selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
          selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
          launchStyle = "0"
          useCustomWorkingDirectory = "NO"
          ignoresPersistentStateOnLaunch = "NO"
          debugDocumentVersioning = "YES"
          debugServiceExtension = "internal"
          allowLocationSimulation = "YES">
          <BuildableProductRunnable
             runnableDebuggingMode = "0">
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "MultiPackage1"
                BuildableName = "MultiPackage1"
                BlueprintName = "MultiPackage1"
                ReferencedContainer = "container:MultiPackage.swiftpm">
             </BuildableReference>
          </BuildableProductRunnable>
       </LaunchAction>
       <ProfileAction
          buildConfiguration = "Release"
          shouldUseLaunchSchemeArgsEnv = "YES"
          savedToolIdentifier = ""
          useCustomWorkingDirectory = "NO"
          debugDocumentVersioning = "YES">
          <BuildableProductRunnable
             runnableDebuggingMode = "0">
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "MultiPackage1"
                BuildableName = "MultiPackage1"
                BlueprintName = "MultiPackage1"
                ReferencedContainer = "container:MultiPackage.swiftpm">
             </BuildableReference>
          </BuildableProductRunnable>
       </ProfileAction>
       <AnalyzeAction
          buildConfiguration = "Debug">
       </AnalyzeAction>
       <ArchiveAction
          buildConfiguration = "Release"
          revealArchiveInOrganizer = "YES">
       </ArchiveAction>
    </Scheme>
    
  • 将文件命名为MultiPackage1.xcscheme,放入上述创建的目录中
  • 之后即可通过命令单独测试该Target:
    xcodebuild -scheme MultiPackage1 -destination 'platform=iOS Simulator,id=4BE845BA-AE9E-4F53-B2FB-A5415C89950B' build test
    

方案2:通过SPM命令直接指定测试目标

无需修改scheme,直接使用swift test命令并指定测试目标,更适合CI自动化场景:

swift test --target MultiPackage1Tests

如果需要指定iOS模拟器环境,添加--destination参数即可:

swift test --target MultiPackage1Tests --destination 'platform=iOS Simulator,id=4BE845BA-AE9E-4F53-B2FB-A5415C89950B'

该命令会自动构建对应的主Target和测试Target,并执行测试。

说明

Xcode自动生成的单个Target scheme默认未关联对应的测试Target,因此无法直接执行test操作。手动创建scheme或使用swift test --target命令均可解决该问题,其中后者无需额外配置,更适合自动化流程。

内容的提问来源于stack exchange,提问作者CloudBalancing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:24:55