首页/新闻资讯/正文详情

使用 Sourcery 的 LinuxMain 模板自动生成 LinuxMain.swift

发布时间:2026/9/26 10:02:46 来源:云帆数科 栏目:资讯中心
使用 Sourcery 的 LinuxMain 模板自动生成 LinuxMain.swift
代码生成开发工具【免费下载链接】SourceryMeta-programming for Swift, stop writing boilerplate code.项目地址https://gitcode.com/gh_mirrors/so/Sourcery点击查看免费下载导读在 Swift 工具链尚未普及测试自动发现test discovery的时期在 Linux 上运行 SwiftPM 测试需要手写LinuxMain.swift为每个XCTestCase子类补齐allTests静态数组并汇总到XCTMain。本指南围绕仓库官方文档 guides/LinuxMain.md 展开讲解如何借助 Sourcery 与内置的LinuxMain.stencil模板一次性为所有测试用例自动生成该文件读完本文你将掌握模板的触发方式、--args testimports参数、disableTests注解的使用以及模板在仓库中的源码实现与测试验证方式。为什么需要 LinuxMain.swiftLinuxMain.swift是 SwiftPM 在 Linux 平台上测试套件的统一入口文件。传统写法要求开发者手工完成两件事为每一个继承自XCTestCase的测试类声明静态allTests数组元素为(测试方法名, 方法引用)二元组在文件末尾将所有测试类的allTests通过testCase(...)包装后传给XCTMain([...])。当测试类数量增多、方法重命名或新增时手工维护这份清单极易遗漏或写错而 Sourcery 的 LinuxMain.stencil 模板正是为消除这一重复劳动而设计。模板的核心功能官方文档 guides/LinuxMain.md 明确了该模板的能力对全部测试用例生成allTests静态变量并把它们作为XCTestCaseEntry全部传入XCTMain。生成结果的形态如下文档原始示例import XCTest //testimports extension AutoInjectionTests { static var allTests [ (testThatItResolvesAutoInjectedDependencies, testThatItResolvesAutoInjectedDependencies), ... ] } extension AutoWiringTests { static var allTests [ (testThatItCanResolveWithAutoWiring, testThatItCanResolveWithAutoWiring), ... ] } ... XCTMain([ testCase(AutoInjectionTests.allTests), testCase(AutoWiringTests.allTests), ... ])需要注意仓库中实际模板生成的allTests声明带有完整的类型签名见 LinuxMain.stencilstatic var allTests: [(String, (AutoInjectionTests) - () throws - Void)] [...]这是 SwiftPM 在 Linux 上识别测试入口所要求的规范签名文档示例做了简化展示实际产出以模板为准。支持导入测试模块--args testimports若测试用例分散在多个模块中需要在生成文件顶部补充import语句。文档给出的运行方式是在命令行传入--args testimportsimport MyTests该值会被模板的{{ argument.testimports }}占位符原样输出对应 LinuxMain.stencil。例如sourcery --sources ./Tests --templates Templates/LinuxMain.stencil --output ./Tests/LinuxMain.swift --args testimportsimport MyTests从配置解析层面看args参数对应 Sourcery 配置中的args字典见 Sourcery/Configuration.swift 的public let args: [String: NSObject]定义在.sourcery.yml中可等价写成sources: - Tests templates: - Templates/LinuxMain.stencil output: Tests/LinuxMain.swift args: testimports: import MyTests多模块场景下可传入多行 import例如--args testimportsimport MyTests\nimport MyOtherTests。注解disableTests模板支持disableTests注解用于整体屏蔽某个测试类。在类声明上方添加// sourcery: disableTests class DisabledTests: XCTestCase { ... }模板在遍历时会跳过带该注解的类——既不会为其生成allTests扩展也不会将其加入XCTMain。仓库测试上下文 Templates/Tests/Context/LinuxMain.swift 中DisabledTests正是如此标注的可作为参考示例。模板源码逐段解读打开 LinuxMain.stencilStencil 语法可以完整还原它的生成逻辑import XCTest {{ argument.testimports }} {% for type in types.classes|based:XCTestCase %} {% if not type.annotations.disableTests %}extension {{ type.name }} { static var allTests: [(String, ({{ type.name }}) - () throws - Void)] [ {% for method in type.methods %}{% if method.parameters.count 0 and method.shortName|hasPrefix:test %} ({{ method.shortName }}, {{ method.shortName }}){{ , if not forloop.last }} {% endif %}{% endfor %}] } {% endif %}{% endfor %} // swiftlint:disable trailing_comma XCTMain([ {% for type in types.classes|based:XCTestCase %}{% if not type.annotations.disableTests %} testCase({{ type.name }}.allTests), {% endif %}{% endfor %}]) // swiftlint:enable trailing_comma关键点拆解types.classes|based:XCTestCasebased是 Sourcery 为 Stencil 注册的过滤器判断类型是否直接或间接继承自XCTestCase。其注册实现位于 SourceryStencil/Sources/StencilTemplate.swift对Type检查t.based[name] ! nil对Typed则下探到t.type?.based[name]。方法筛选条件只有parameters.count 0无参数且shortName以test前缀开头的方法才会进入allTests这与 XCTest 只把无参test开头方法当作测试用例的语义一致。disableTests过滤两处循环生成扩展、生成XCTMain条目都通过if not type.annotations.disableTests跳过被禁用类保证生成文件内部自洽。trailing comma 处理模板用// swiftlint:disable trailing_comma/enable包裹XCTMain数组避免生成的代码触发 SwiftLint 告警。仓库中的验证方式Sourcery 仓库自身就使用该模板并且通过测试确保模板输出稳定测试入口Templates/Tests/TemplatesTests.swift 中describe(LinuxMain template)用例调用check(template: LinuxMain)将实际生成结果与期望文件逐行比对忽略注释与首尾空白。输入上下文Templates/Tests/Context/LinuxMain.swift 定义了AutoInjectionTests、AutoWiringTests以及带disableTests注解的DisabledTestsLinux 专用变体见 Templates/Tests/Context_Linux/LinuxMain.swift。期望输出Templates/Tests/Expected/LinuxMain.expected 展示了DisabledTests被正确排除、剩余两个测试类各生成扩展并汇总进XCTMain的完整结果。实际生成Templates/Tests/Generated/LinuxMain.generated.swift 是测试运行时的产物Templates/Tests/TemplatesTests.swift 中generateFiles()通过sourcery --sources ... --templates ... --output ... --disableCache --verbose命令驱动生成这正是模板真实调用方式的可复现示例。从指南到落地使用步骤小结准备测试源码目录包含若干继承XCTestCase的类获取模板文件 LinuxMain.stencil可复制到自己的Templates/目录运行 Sourcerysourcery --sources ./Tests --templates ./Templates/LinuxMain.stencil --output ./Tests/LinuxMain.swift如测试分散在多个模块追加--args testimportsimport MyTests如需屏蔽个别测试类在类上方添加// sourcery: disableTests注解后重新生成。生成完成后将LinuxMain.swift纳入 SwiftPM 测试目标即可作为 Linux 测试入口使用仓库根目录的 LinuxMain.swift 本身即是由同类模板生成的产物可作为真实运行效果的参照。小结LinuxMain.stencil以“继承自 XCTestCase 的类 无参 test 前缀方法”为筛选规则自动产出符合 SwiftPM 规范的allTests与XCTMain入口并以disableTests注解提供细粒度豁免、以--args testimports支持多模块导入。配合仓库内 TemplatesTests.swift 的逐行比对测试模板的正确性得到了持续保障可以放心在自有项目中直接复用。赞分享代码生成开发工具【免费下载链接】SourceryMeta-programming for Swift, stop writing boilerplate code.项目地址https://gitcode.com/gh_mirrors/so/Sourcery点击查看免费下载相关推荐JTAppleCalendar代码生成框架使用Sourcery自动生成模板代码JTAppleCalendar代码生成框架使用Sourcery自动生成模板代码 你是否还在为JTAppleCalendar中重复编写相似的日历单元格和头部视图移动开发UI组件MJRefresh 与代码生成使用 Sourcery 自动生成刷新逻辑MJRefresh 与代码生成使用 Sourcery 自动生成刷新逻辑 你是否还在手动编写重复的下拉刷新和上拉加载代码每次修改刷新样式都要逐个修改控制器本移动开发UI组件终极指南如何用Sourcery自动生成async/await样板代码终极指南如何用Sourcery自动生成async/await样板代码 Swift的async/await语法让异步编程变得简单优雅但随之而来的是大量的样板代代码生成开发工具上一篇LZHAM常见问题解答从错误处理到性能瓶颈突破下一篇为什么Refactorator是Swift开发者必备工具5大核心功能深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Python 3.12.7在线沙盒:轻量级、可信赖的代码执行环境
Python 3.12.7在线沙盒:轻量级、可信赖的代码执行环境

1. 这不是“在线IDE”,而是一个轻量级Python沙盒执行环境你搜“Python在线运行工具”,页面上弹出一堆带编辑器界面的网站——有语法高亮、有终端输出、甚至还能点按钮运行,看起来很专业。但真正用过的人心里都清楚:那些多数是基于… · 2026/9/26 10:02:46

MySQLTuner 索引体检:基于 Performance Schema 的未使用索引与冗余索引检测指南
MySQLTuner 索引体检:基于 Performance Schema 的未使用索引与冗余索引检测指南

数据库运维 【免费下载链接】MySQLTuner-perl MySQLTuner is a script written in Perl that will assist you with your MySQL configuration and make recommendations for increased performance and stability. 项目地址: https://gitcode.com/gh_mirrors/my/My… · 2026/9/26 10:02:46

Qlib 量化投资平台实战指南:从安装到回测的 5 个关键问题
Qlib 量化投资平台实战指南:从安装到回测的 5 个关键问题

Qlib 量化投资平台实战指南:从安装到回测的 5 个关键问题 【免费下载链接】qlib Qlib is an AI-oriented Quant investment platform that aims to use AI tech to empower Quant Research, from exploring ideas to implementing productions. Qlib supports diver… · 2026/9/26 10:02:45

MCP与大模型协作学习笔记:用TaoToken统一Key跑通Gradio+SSE的AI Agent实践
MCP与大模型协作学习笔记:用TaoToken统一Key跑通Gradio+SSE的AI Agent实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 10:45:28

JavaFX03:scene 配 TaoToken,统一 Key 接入 AI 工具链
JavaFX03:scene 配 TaoToken,统一 Key 接入 AI 工具链

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 10:45:28

如何取消 Cursor 订阅并保留本地配置:TaoToken 统一 Key 接入 Cline 的 settings.json 骨架
如何取消 Cursor 订阅并保留本地配置:TaoToken 统一 Key 接入 Cline 的 settings.json 骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 10:45:28

开篇|3天从0到1入门AI应用开发
开篇|3天从0到1入门AI应用开发

AI 应用工程师 系列课程 开篇|3天从0到1入门AI应用开发 15 课 收官篇,带你走完 AI 应用工程师成长之路 作者:小马过河R  认知 → 原理 → 基础能力 → Agent 进阶 → 综合实战 本篇为系列课程开篇:先给你一张完整的地图&#… · 2026/9/26 10:45:28

【异常】智谱OpenClaw 内置集成欠费报错排查:从 request id 定位到 config.toml 修复
【异常】智谱OpenClaw 内置集成欠费报错排查:从 request id 定位到 config.toml 修复

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 10:45:28

ADUC7024精密模拟MCU实战:ARM7内核与工业变送器设计要点
ADUC7024精密模拟MCU实战:ARM7内核与工业变送器设计要点

这两年做工业仪表和传感器变送器的方案,我手里过过的MCU不算少,但每次讲起ADI的ADUC7024BSTZ62,还是会花点时间。原因很简单:这颗芯片太“有性格”了。第一次翻开数据手册,看到ARM7TDMI内核、62KB Flash、2KB SRAM这些… · 2026/9/26 10:45:21

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码