发布时间:2026/9/7 3:48:50
ECC Swift Testing 规则详解:用 Swift Testing 编写隔离、参数化与可注入的确定性测试 ECC Swift Testing 规则详解用 Swift Testing 编写隔离、参数化与可注入的确定性测试【免费下载链接】ECCThe agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.项目地址: https://gitcode.com/GitHub_Trending/ev/ECCECC 将面向 AI 编程助手Cursor、Claude Code 等的工程规范沉淀为一套可被按需加载的规则文件rules其中 Swift Testing 规则 就是这条链上针对 Swift 项目的测试规范它继承通用测试基线80% 覆盖率、TDD 流程并规定了 Swift Testing 框架下Test/#expect的写法、测试隔离方式、参数化测试与覆盖率采集方法。读完本文你能理解该规则在 ECC 规则体系中的加载机制掌握规则中每一类测试写法的完整代码范式并能结合仓库中配套的swift-protocol-di-testing技能落地一套基于协议依赖注入的 Swift 测试方案。规则文件定位Cursor 按需加载的语言专属扩展该规则以 Cursor Rules 的 Frontmatter Markdown 格式定义在.cursor/rules/swift-testing.md头部元数据声明了它的行为--- description: Swift testing extending common rules globs: [**/*.swift, **/Package.swift] alwaysApply: false ---三个字段决定了这条规则的工作方式globs: [**/*.swift, **/Package.swift]当 Cursor 上下文涉及任意.swift文件或 SwiftPM 的Package.swift清单时该规则会被自动纳入上下文alwaysApply: false它不是全局常驻规则只在上述文件出现时生效避免污染其他技术栈会话的上下文预算description供检索/匹配使用的简短描述。规则正文第一行即声明其定位This file extends the common testing rule with Swift specific content——它是对 通用测试规则 的 Swift 特化扩展。值得注意的是仓库中同一规范还存在一个不带 Cursor 专属 Frontmatter 的源版本 rules/swift/testing.md两者内容一致后者用paths字段同样匹配**/*.swift与**/Package.swift声明作用范围。从源码结构看.cursor/rules/目录是按语言 维度组织的规则集合每个语言包含 coding-style、hooks、patterns、security、testing 五个维度文件Swift 亦如此而scaffolds/cursor/目录则存放了 Cursor 侧的配套模板如 hooks.json供初始化 Swift 项目的工作区时复用整套规则。这种通用基线 语言扩展的分层设计是 ECC 规则体系的核心组织原则语言文件只写增量公共要求覆盖率门槛、TDD 流程统一维护在 common 层改一处即全局生效。继承的通用测试基线80% 覆盖率与强制 TDD.cursor/rules/swift-testing.md声明extends common testing rule而该基线.cursor/rules/common-testing.mdalwaysApply: true全局常驻对 Swift 项目同样生效包含以下硬性要求最低测试覆盖率 80%且三类测试全部必须覆盖单元测试——单个函数、工具、组件集成测试——API 端点、数据库操作端到端测试——关键用户流框架按语言选择Swift 场景通常由 Swift Testing 的 async 测试承担。强制 TDD 工作流六步1. 先写测试RED 2. 运行测试——应当失败 3. 写最小实现GREEN 4. 运行测试——应当通过 5. 重构IMPROVE 6. 验证覆盖率80%测试失败排查顺序使用tdd-guideagent对应仓库中的 agents/tdd-guide.md要求在新功能开发时 PROACTIVELY 启用→ 检查测试隔离 → 校验 mock 是否正确 → 修实现而非修测试除非测试本身写错。与 Swift 规则配套的 rules/common/testing.md 还补充了 AAA 结构与命名约定直接适用于 Swift 测试的编排Arrange-Act-Assert每个测试显式分三段——构造前置条件、执行被测行为、断言结果行为描述式命名测试名解释在什么条件下发生什么行为例如returns empty array when no markets match query、throws error when API key is missing。这正好与 Swift 规则中Test(User creation validates email)这种字符串描述符风格一致——Test的第一个参数即行为描述承担命名规范的作用。理解这一层的关系很重要.cursor/rules/swift-testing.md本身只写Swift 怎么写而必须写、写到什么程度、按什么流程写由 common 基线保证。核心内容一Swift Testing 框架的Test与#expect规则的第一个小节明确新测试一律使用 Swift Testingimport Testing使用Test宏与#expect宏而非 XCTest。规则给出的标准范式是异常路径断言Test(User creation validates email) func userCreationValidatesEmail() throws { #expect(throws: ValidationError.invalidEmail) { try User(email: not-an-email) } }要点解析Test(...)中的字符串是测试的行为描述对应 common 基线里的行为描述式命名要求#expect(throws:)是宏形式的断言throws:参数直接匹配具体错误值如ValidationError.invalidEmail比 XCTest 的XCTAssertThrowsError写法更贴近 Swift 的错误类型系统测试函数标注throws后try直接作用于被测调用无需额外包装。这一选择意味着仓库规则要求新代码统一迁移到 Swift Testing 生态它原生支持 Swift 并发下的async测试、await #expect(...)写法以及后文要讲的参数化与隔离特性。核心内容二测试隔离——init 建立、deinit 销毁规则对隔离性给出了一条明确的实现约定Each test gets a fresh instance — set up ininit, tear down indeinit. No shared mutable state between tests.即每个测试拿到全新实例在init中完成搭建、在deinit中完成拆除测试之间禁止共享可变状态。这条约定与 common 基线中测试失败先检查隔离Check test isolation的排查项形成闭环——隔离失效是共享状态污染、顺序依赖导致的偶发失败的最常见来源。从规则原文看它描述的是针对测试主体SUT包装类这一常见模式将 SUT 及其依赖封装为测试 fixture 类每个Test函数内部构造该类的实例利用 Swift 的引用计数保证deinit在函数结束时自动释放资源如关闭 mock 连接、清理临时目录。这与 Swift Testing 的运行模型匹配同一测试套件内各Test函数相互独立、可并行执行任何静态可变状态都会破坏可重复性。核心内容三参数化测试的arguments写法规则给出了参数化data-driven测试的标准形式Test(Validates formats, arguments: [json, xml, csv]) func validatesFormat(format: String) throws { let parser try Parser(format: format) #expect(parser.isValid) }其中Test宏的arguments:参数声明了一组测试数据测试框架会为每个元素生成一个独立的测试实例json、xml、csv各跑一次validatesFormat任一数据项失败都会精确定位到该值。相比在函数体内手写for循环遍历数据集合参数化的优势在于每个数据项在测试报告中是独立条目失败可直接看到是哪个 format 出了问题数据项之间无状态耦合符合上文禁止共享可变状态的隔离要求数据集合可以来自Collection扩展成多参数组合时框架会做笛卡尔积展开规则示例保持单参数形式多参数场景可从源码结构看按同样的arguments:机制叠加。对于 Swift 项目中同一逻辑对不同输入格式/配置应表现一致这类校验规则示例即解析器格式验证这是推荐的默认写法。核心内容四覆盖率采集规则给出的覆盖率命令是 SwiftPM 原生能力swift test --enable-code-coverage该命令在项目根目录含Package.swift的包下执行跑完测试后在.build/x86_64-unknown-linux-gnu/debug/或.build/apple/Products/Debug/macOS目录下生成codecov风格的.profdata/ LLVM coverage 产物可配合 Xcode 的覆盖率报告或llvm-cov工具链转换为可读报告。结合 common 基线的 80% 门槛Swift 项目的验证链路即swift test --enable-code-coverage跑全量测试 → 生成覆盖率数据 → 确认 ≥80% 且三类测试齐备。规则将**/Package.swift列入 glob 匹配正是因为 SwiftPM 包是该命令的触发前提——上下文里出现Package.swift即表示这是一个可用该命令闭环的 Swift 包。纵深扩展规则引用的swift-protocol-di-testing技能规则末尾的 Reference 一节指向仓库内的 swift-protocol-di-testing 技能protocol-based dependency injection and mock patterns with Swift Testing。该技能是 Swift Testing 规则在外部依赖如何 mock这一关键问题上的完整落地核心是把文件系统、网络、外部 API 抽象为小而专注的协议用默认参数注入生产实现、测试注入 mock实现零 I/O 的确定性测试。其完整流程分五步1. 定义单一职责协议每个协议只处理一类外部关注点并且因为要跨 actor 边界使用而要求Sendable// 文件系统访问 public protocol FileSystemProviding: Sendable { func containerURL(for purpose: Purpose) - URL? } // 文件读写操作 public protocol FileAccessorProviding: Sendable { func read(from url: URL) throws - Data func write(_ data: Data, to url: URL) throws func fileExists(at url: URL) - Bool }2. 生产默认实现public struct DefaultFileAccessor: FileAccessorProviding { public func read(from url: URL) throws - Data { try Data(contentsOf: url) } public func write(_ data: Data, to url: URL) throws { try data.write(to: url, options: .atomic) } public func fileExists(at url: URL) - Bool { FileManager.default.fileExists(atPath: url.path) } }3. 可配置错误的 Mock 实现Mock 的关键设计是可注入的错误属性用于确定性触发失败路径规则示例中的#expect(throws:)断言正是消费这些错误public final class MockFileAccessor: FileAccessorProviding, unchecked Sendable { public var files: [URL: Data] [:] public var readError: Error? public var writeError: Error? public func read(from url: URL) throws - Data { if let error readError { throw error } guard let data files[url] else { throw CocoaError(.fileReadNoSuchFile) } return data } // write / fileExists 同理 }4. 默认参数注入生产代码零改动即可用真实实现测试只需显式传 mockpublic actor SyncManager { public init( fileSystem: FileSystemProviding DefaultFileSystemProvider(), fileAccessor: FileAccessorProviding DefaultFileAccessor() ) { ... } }5. 用 Swift Testing 断言import Testing Test(Sync manager handles missing container) func testMissingContainer() async { let mockFileSystem MockFileSystemProvider(containerURL: nil) let manager SyncManager(fileSystem: mockFileSystem) await #expect(throws: SyncError.containerNotAvailable) { try await manager.sync() } }注意await #expect(throws:)的 async 形态Swift Testing 对并发被测对象actor、async throws提供原生支持这正是规则要求新测试使用import Testing而非 XCTest 的实际收益之一。该技能同时给出了边界清晰的最佳实践与反模式清单可直接作为 Code Review 检查项每个协议只管一件事禁止上帝协议跨 actor 边界必须Sendable生产走默认参数仅测试显式注入 mock只 mock 边界文件系统、网络、外部 API不要 mock 无外部依赖的内部类型避免用#if DEBUG条件编译代替正规依赖注入。规则如何被 Agent 消费从规则到工作流这套 Swift 规则并非孤立存在而是 ECC规则 代理 命令协同体系中面向 Swift 的一环触发在 Cursor 中打开任何.swift/Package.swift文件时swift-testing规则因globs匹配而进入上下文common 测试规则因alwaysApply: true始终在场两者叠加生效执行tdd-guideagent 按 common 基线强制先写测试的 RED-GREEN-REFACTOR 流程Swift 侧的测试写法Test、#expect、隔离、参数化则按本篇规则约束兜底涉及文件系统/网络等外部依赖的测试设计时Reference 指向的 swift-protocol-di-testing 提供协议划分与 mock 的完整范式仓库内还有 swift-concurrency-6-2、swift-actor-persistence 等技能可与 actor 测试场景互补。速查小结要求出处Swift 落地方式新测试统一 Swift Testingswift-testing.mdimport TestingTest#expect行为描述式命名common-testing.md / rules/common/testing.mdTest(User creation validates email)测试隔离swift-testing.md每测试全新实例init搭建、deinit拆除禁止共享可变状态参数化测试swift-testing.mdTest(..., arguments: [...])逐数据项独立执行覆盖率 ≥80%common-testing.mdswift test --enable-code-coverage强制 TDD 六步common-testing.mdRED → GREEN → REFACTOR → 验证覆盖率外部依赖 Mockswift-protocol-di-testing 技能单职责Sendable协议 默认参数注入 可配置错误的 Mock综合来看.cursor/rules/swift-testing.md的价值不在于单独的四小节内容而在于它与 common 基线、tdd-guideagent 和 DI 测试技能构成的完整闭环common 层规定必须写、按 TDD 写、覆盖 80%Swift 层规定用 Swift Testing 这样写技能层规定外部依赖这样 mock。在 Swift/SwiftPM 项目中启用 ECC 这套 Cursor 规则后AI 助手产出的测试代码会被约束在这一范式内——新测试一律Test/#expect、数据驱动、无共享状态、异常路径经 mock 确定性触发并可用swift test --enable-code-coverage一条命令闭环验证覆盖率门槛。【免费下载链接】ECCThe agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.项目地址: https://gitcode.com/GitHub_Trending/ev/ECC创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026/9/7 3:48:50

飞利浦CDM摇头机主轴伺服原理与故障排查

简介:CDM主轴伺服原理是光盘驱动器维修与DIY改造中的关键知识点,这份文档主要面向音响维修人员、CD机发烧友及电子爱好者。内容围绕PHILIPS摇头机系统展开,系统梳理了CDM1、CDM2、CDM3、CDM4/19、CDM4PRO等型号的主轴马达类型与伺服电路差异&…

2026/9/7 3:48:50

sokit-1.3-win32-chs:TCP/UDP调试助手实战指南

简介:面向 Windows 32 位系统的 sokit 1.3 是一款轻量级网络端口工具,定位为 windows 端口小工具,主要服务于网络管理员、开发者和普通用户。它能够扫描并列出开放端口、实时监听端口活动、测试指定端口连通性、识别占用端口的进程&#xff0…

2026/9/7 4:48:54

RAG检索增强生成:让大模型从凭记忆到查证回答

一个做企业内部知识库的团队曾经问过我一个很具体的问题:手里有几千份产品文档,也接入了市面上效果不错的大模型,但每次问技术细节,模型都回答得模棱两可。更头疼的是,回答出错的时候,没人能说清楚这个答案…

2026/9/7 4:48:54

拆解Agent内核:源码背后的五层架构与工程实践

把 DeepSeek-Honeycomb 这样的 Agent 源码打开时,很多人第一反应是找“内核”文件。以为找到了核心循环,就算看懂了整个项目。但真正阅读过几份 Agent 源码之后,你会发现“内核”不是一个文件,不是一个大类,也不是一段…

2026/9/7 4:48:54

1Panel AI网关开放:统一模型接入、密钥管理与成本控制实战解析

1Panel的AI网关正式开放了。这次不是单纯给自家面板加个插件,而是把AI网关做成了一个独立产品线,并且直接放出了“10人及以下团队免费使用”的档位。作为一直在用1Panel管理服务器的老用户,我第一时间就去体验了一轮。把它拆开来看&#xff0…

2026/9/7 0:47:43

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/7 0:14:19

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/7 0:14:17

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/7 0:03:36

基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现

这次我们来看一个把目标检测算法和桌面端工具结合得很典型的项目:基于 YOLOv8 PyQt5 的麦穗稻穗检测识别系统。这个项目本身不是新概念,但它的价值在于落地形态很完整。YOLOv8 负责核心的麦穗稻穗目标检测,PyQt5 负责提供可视化的桌面交互界…

2026/9/7 0:03:36

UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南

简介:UL 1642是锂电池安全领域的重要规范,本中文版资源适合锂电池制造商、检测机构工程师及产品认证相关人员阅读,用于理解电池在设计与制造层面的安全要求、测试方法与合规要点。资源共1个PDF文件,压缩包大小834KB,便…

2026/9/7 0:03:36

BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析

简介:BS EN 13814-1:2019是英国采纳欧洲标准EN 13814-1:2019的正式版本,由BSI标准出版,重点规定游乐设施和游乐设备在设计与制造环节的安全准则,与BS EN 13814-2:2019、BS EN 13814-3:2019共同取代旧版BS EN 13814:2004。该标准面…

2026/9/6 11:40:10

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/6 19:33:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…