ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SwiftPM PackagePlugin 测试结果模型解析:深入 PackageManager.TestResult.TestTarget.TestCase.Test

SwiftPM PackagePlugin 测试结果模型解析:深入 PackageManager.TestResult.TestTarget.TestCase.Test 开发工具构建工具【免费下载链接】swift-package-managerThe Package Manager for the Swift Programming Language项目地址https://gitcode.com/gh_mirrors/sw/swift-package-manager点击查看免费下载导读本篇技术指南聚焦 Swift 包管理器SwiftPM为命令插件Command Plugin提供的PackageManager.test(_:parameters:)测试运行 API以及其返回值PackageManager.TestResult中最内层的单条测试结果模型TestResult.TestTarget.TestCase.Test。你将掌握该模型的结构、属性语义name、result、duration、其Result枚举的取值与判定逻辑以及如何在真实命令插件中消费这份测试结果并集成代码覆盖率数据为构建自定义测试工具链提供可直接落地的参考。从文档策展页看 API 形态在 SwiftPM 的 DocC 文档体系中PackageManager_TestResult_TestTarget_TestCase_Test.md 是PackagePlugin运行时模块 API 文档的策展Curation页面之一它把Test类型挂载到PackageManager.TestResult.TestTarget.TestCase之下并归类出两个主题分组Inspecting a Test in a Test Case即单条测试的检视属性包括name、result-swift.property、duration以及内嵌的结果枚举Result-swift.enum。在 DocC 中这类页面只负责“组织导航”真正定义类型与文档注释的实体位于源码中。因此要完整理解Test必须沿这条导航线索进入 PackageManagerProxy.swift 查看声明进入 PluginMessages.swift 查看它在宿主通信协议中的传输形态并结合测试用例验证实际行为。类型层级Test 在结果树中的位置Test不是孤立存在的它位于测试结果树的最深层。整棵树的层级关系在 PackageManagerProxy.swift 中定义如下PackageManager.TestResult ├── succeeded: Bool // 本次测试运行是否全部成功 ├── testTargets: [TestTarget] // 各测试目标的结果 │ └── TestTarget │ ├── name: String // 目标名称 │ └── testCases: [TestCase] // 目标下的测试用例 │ └── TestCase │ ├── name: String // 用例名称 │ └── tests: [Test] // 用例下的单条测试 │ └── Test │ ├── name: String │ ├── result: Result │ └── duration: Double └── codeCoverageDataFileURL: URL? // 覆盖率 profile 文件对应关系与 XCTest 的概念一致一个测试目标Test Target包含多个测试用例TestCase每个用例中包含多条测试方法Test。Test即最细粒度的单条测试结果。核心成员逐一解析Test的完整声明位于 PackageManagerProxy.swift/// The results of running a single test. public struct Test { /// The name of the test. public var name: String /// The test result. public var result: Result /// The duration of the test. public var duration: Double /// The result of running a single test. public enum Result: String { case succeeded, skipped, failed } }name测试名称name为String类型表示单条测试的名字通常即测试方法的函数名。结合仓库测试用例 PackageCommandTests.swift 的实际断言可见其值形如testBooleanInvariants、testNumericalInvariants、testStringInvariants即 XCTest 测试方法的名称。result测试结果Result 枚举result是Test.Result枚举为String原始值类型取值只有三个 case见 PackageManagerProxy.swiftCase语义succeeded测试通过skipped测试被跳过failed测试失败该枚举由宿主SwiftPM 或 IDE在传输层通过协议消息携带其 wire 格式定义于 PluginMessages.swift同为enum Result: String, Codable三个 case 一一对应。插件侧通过 PackageManagerProxy.swift 中的fileprivate init完成从传输枚举到公开 API 枚举的逐 case 映射switch语句保证三个取值全量覆盖任何新增 case 都会触发编译期检查。duration测试耗时duration为Double类型表示该条测试的运行时长。结合传输层 PluginMessages.swift 的定义同为Double它由测试宿主负责测量与填充插件侧在 PackageManagerProxy.swift 中直接透传。可据此实现超时告警、慢测试排名等自定义分析。底层协议一次 test 调用的完整链路Test数据不是凭空生成的它经历了一条明确的“插件 → 宿主 → 插件”通信链路。整条链路从 PackageManagerProxy.swift 的test(_:parameters:)方法开始public func test( _ subset: TestSubset, parameters: TestParameters ) throws - TestResult { try sendMessageAndWaitForReply(.testOperationRequest(subset: .init(subset), parameters: .init(parameters))) { guard case .testOperationResponse(let result) $0 else { return nil } return .init(result) } }链路各环节如下发起请求插件调用packageManager.test(...)将TestSubset.all或.filtered([正则])与TestParameters当前仅enableCodeCoverage: Bool封装为PluginToHostMessage.testOperationRequest通过消息通道发给宿主。其消息格式在 PluginMessages.swift 定义。该行为与命令行swift test功能等价支持--filter语义。宿主执行SwiftPM 或 IDE 完成增量构建后运行所选测试收集结果。返回响应宿主以HostToPluginMessage.testOperationResponse回传其TestResult结构在 PluginMessages.swift 中定义与公开 API 一一对应。逐层映射插件侧通过 PackageManagerProxy.swift 中的多个fileprivate init扩展将传输结构递归转换为公开的TestResult/TestTarget/TestCase/Test类型其中Test.Result的转换还带完整 switch 映射。从源码结构看这种“请求-响应”同步等待模型注释标记FIXME指出未来在支持 back deployment 后会改为异步使得test()目前是阻塞式 API插件应在拿到完整结果后再做后续处理。实战在命令插件中消费 Test 结果命令插件是消费这套 API 的典型场景。仓库集成测试 PackageCommandTests.swift 中构造了一个完整的示例包内包含库目标、两个测试目标与一个命令插件插件通过packageManager.test(.filtered([MyBasicTests]), parameters: .init(enableCodeCoverage: true))运行测试并逐层断言结果。实际插件中的典型消费代码如下import PackagePlugin main struct MyCommandPlugin: CommandPlugin { func performCommand(context: PluginContext, arguments: [String]) throws { do { let result try packageManager.test( .filtered([MyBasicTests]), parameters: .init(enableCodeCoverage: true) ) // 1. 整体是否成功 if !result.succeeded { // 汇总失败信息 } // 2. 逐目标 / 逐用例 / 逐测试遍历 for target in result.testTargets { print(Target: \(target.name)) for testCase in target.testCases { print( Case: \(testCase.name)) for test in testCase.tests { print( \(test.name): \(test.result) (\(test.duration)s)) } } } // 3. 覆盖率数据 if let coverageURL result.codeCoverageDataFileURL { print(Coverage: \(coverageURL.path)) } } catch { // 处理无法启动测试等情况 } } }上述代码的每一处断言都在集成测试中有对应验证见 PackageCommandTests.swift例如result.succeeded true整体成功标志result.testTargets[0].name MyBasicTests目标名result.testTargets[0].testCases[0].name MyBasicTests.TestSuite1用例名形如“目标名.用例名”result.testTargets[0].testCases[0].tests[0].name testBooleanInvariants单条测试名result.testTargets[0].testCases[0].tests[1].result .succeeded单条测试结果判定result.codeCoverageDataFile?.extension json开启覆盖率后生成的 profile 文件。需要说明的是codeCoverageDataFile属性返回Path?已被标记为废弃并更名为codeCoverageDataFileURL返回URL?自 Swift 6.0 起建议使用 URL 版本两者均指向.profdata文件可用llvm-cov等工具处理见 PackageManagerProxy.swift。上述断言中使用旧属性是因为集成测试基于较旧 tools-version5.6的包构造。典型使用模式与边界基于以上分析可以归纳Test结果的典型消费模式先判整体再查明细先检查TestResult.succeeded快速判定成败失败时再深入testTargets定位失败用例每个Test的result可直接与.failed比较筛选失败项。按层级聚合统计三层嵌套结构Target → Case → Test天然支持按目标、按用例做耗时聚合与失败计数。配合覆盖率使用TestParameters(enableCodeCoverage: true)与codeCoverageDataFileURL组合可在插件内实现“跑测试 生成覆盖率报告”的一体化工具。需要明确的边界test()在参数非法或测试无法启动时抛出错误测试本身的失败不会抛错而是体现在返回值中TestResult.succeeded false、对应Test.result .failed插件需自行检查。这一点从 PackageManagerProxy.swift 的文档注释与集成测试的断言方式都可以得到印证。关联文档与源码速查资料路径用途Test 策展文档PackageManager_TestResult_TestTarget_TestCase_Test.md本主题的 DocC 导航入口Result 枚举策展文档PackageManager_TestResult_TestTarget_TestCase_Test_Result.mdResult枚举的导航入口TestResult 策展文档PackageManager_TestResult.md根级结果类型导航TestTarget / TestCase 策展文档PackageManager_TestResult_TestTarget.md、PackageManager_TestResult_TestTarget_TestCase.md层级类型导航公开 API 声明PackageManagerProxy.swifttest()、TestResult、Test等的定义与映射传输协议定义PluginMessages.swift宿主-插件消息中的TestResult结构集成测试PackageCommandTests.swift插件调用packageManager.test并逐层断言结果的端到端验证结语PackageManager.TestResult.TestTarget.TestCase.Test是 SwiftPM 命令插件测试能力的“最后一公里”——它把宿主SwiftPM 或 IDE运行测试后产生的细粒度结果以name、result、duration三个字段和三层嵌套结构呈现给插件开发者。结合TestSubset.filtered的过滤能力与TestParameters.enableCodeCoverage的覆盖率采集能力插件可以构建出与swift test同等能力、但完全定制化的测试工具链。理解它的声明PackageManagerProxy.swift、传输PluginMessages.swift与消费PackageCommandTests.swift三个层面即可在自己插件的performCommand中自如地读取与利用测试结果。赞分享开发工具构建工具【免费下载链接】swift-package-managerThe Package Manager for the Swift Programming Language项目地址https://gitcode.com/gh_mirrors/sw/swift-package-manager点击查看免费下载相关推荐SwiftPM 命令插件参数解析指南深入理解 PackagePlugin 的 ArgumentExtractorSwiftPM 命令插件参数解析指南深入理解 PackagePlugin 的 ArgumentExtractor ArgumentExtractor 是 Sw开发工具构建工具一个键驯服 Mac 窗口Loop 窗口管理完整上手指南一个键驯服 Mac 窗口Loop 窗口管理完整上手指南 屏幕上同时开着 6 个窗口编辑器、终端、浏览器、两张参考图、一个音乐播放器。你把这个拖到左边、那个拖桌面应用Vulhub × Apache Shiro CVE-2010-3863URI 未标准化导致的认证绕过漏洞实战与源码剖析Vulhub × Apache Shiro CVE 2010 3863URI 未标准化导致的认证绕过漏洞实战与源码剖析 本文以 Vulhub 中的 shiro开发工具构建工具上一篇Wagtail 2.11.7 安全版本富文本字段 URL 协议校验修复CVE-2021-29434深入解析下一篇Genkit JS 多 Agent 编排实战用 agents() 中间件构建 Orchestrator Sub-Agent 协作系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表