尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

用30多个样例fountain文件为解析器搭建单元测试:FountainTests测试体系完整指南

用30多个样例fountain文件为解析器搭建单元测试:FountainTests测试体系完整指南 用30多个样例fountain文件为解析器搭建单元测试FountainTests测试体系完整指南【免费下载链接】FountainAn open source implementation of the Fountain screenplay formatting language.项目地址: https://gitcode.com/gh_mirrors/foun/FountainFountain 是一种用纯文本编写剧本的格式语言本项目提供了它的开源 Objective-C 实现包含两个剧本解析器FastFountainParser 与 FountainParser。项目内的 FountainTests 测试目录积累了18 个样例 fountain 脚本、19 个测试类合计 30 多个测试文件用真实的剧本样例逐行锁定解析器的边界行为。本文将带你完整看懂这套 FountainTests 测试体系是如何为解析器搭建单元测试的。 测试体系长什么样打开 FountainTests/ 目录可以看到三类角色分工明确角色文件作用样例剧本Dialogue.fountain、Simple.fountain等 18 个文件测试素材故意包含各种边界写法测试基类BaseElementTests.m提供加载样例、取元素、报错信息的公共工具测试类SceneHeaderTests.m、BigFishTests.m等 18 个文件每个对应一类语法用断言验证解析结果这种样例文件 测试类一一对应的组织方式让每种 Fountain 语法都能被独立回归验证新增语法时只需加一对文件。 快速上手跑一遍全部测试如果你想在本地运行整套测试按下面两步即可git clone https://gitcode.com/gh_mirrors/foun/Fountain用 Xcode 打开Fountain.xcodeproj需要 macOS Xcode 环境。在 Scheme 中选择FountainTests测试目标按⌘U运行全部单元测试。看到绿色全通过就说明两个解析器对 18 个样例剧本的行为全部符合预期。 核心设计基类让每个用例三行代码完成加载所有元素类测试都继承自 BaseElementTests.m基类封装了 4 个关键方法pathForFile:从测试 Bundle 中按文件名取出.fountain文件路径loadTestFile:用 FastFountainParser 解析文件得到元素数组elementTypeAtIndex:/elementTextAtIndex:按下标取元素的类型和文本errorForIndex:断言失败时打印该元素的完整描述方便定位子类要做的只有两件事——在setUp里指定样例文件再按下标断言元素类型例如 SceneHeaderTests.m- (void)setUp { [super setUp]; [self loadTestFile:SceneHeaders]; } - (void)testInt { NSUInteger index 0; STAssertEqualObjects([self elementTypeAtIndex:index], Scene Heading, [self errorForIndex:index]); } 三大测试风格不同场景怎么选风格一元素类型断言式—— 最常用。给样例文件中的每一行边界写法分配一个元素下标断言它应该被解析成什么类型。典型代表 DialogueTests.m 和 SceneHeaderTests.m。风格二真实完整剧本回归式—— 用整部剧本验证整体结构。BigFishTests.m 加载《Big Fish》剧本批量检查指定下标处必须是场景头、角色名、对白或转场还专门验证了标题页的 6 个条目片名、credit、notes 等。BrickAndSteelTests.m 则用.txt扩展名的剧本测试确认解析器不挑扩展名。风格三读写往返式—— 最严格的闭环。FountainWriterTests.m 先把 Simple.fountain 读进 FNScript再写回字符串断言输出与输入逐字符一致FNScriptTests.m 则验证每个元素的description输出。代码注释里作者还自嘲了一句 DONT WRITE TESTS LIKE THIS!读起来颇为有趣 样例文件设计边界用例都藏在哪里18 个样例剧本FountainTests/ 目录各自盯住一类语法的刁钻角落几个值得学习的用例设计样例文件覆盖的边界场景Dialogue.fountain双人对白EVE ^、带括注的R2D2、纯数字角色名 23 (O.S.) 必须含字母SceneHeaders.fountain.FORCED SCENE HEADING强制场景头 vs... Not a forced不强制见 SceneHeaderTests.mSimple.fountain一站式覆盖标题页、分页符、 居中 、[[注释]]、 梗概、/* 骨坑 */、# 章节ForcedElements.fountain.前缀强制指定动作、角色、歌词类型其余 13 个缩进Indenting、多行动作MultilineAction、笔记Notes、分页PageBreaks、场景编号SceneNumbers、章节SectionHeaders、梗概Synopses、转场Transitions、居中CenteredText、骨坑Boneyard、双对白DualDialogue等每个样例文件都很小只写这一类语法最容易错的那几种写法这正是测试素材的精华小而准。✍️ 新增一个解析器测试用例三步完成想验证新加的解析逻辑照着现有模式走三步即可造样例在 FountainTests/ 新建MyFeature.fountain只放入要验证的边界语法。挂资源在 Xcode 中把该文件加入 FountainTests 目标的 Bundle Resources测试时才能通过 Bundle 找到它。写断言新建继承BaseElementTests的测试类setUp中调用[self loadTestFile:MyFeature]然后按元素下标断言elementTypeAtIndex:的返回值。另外注意README 说明默认解析器是 FastFountainParser逐行解析比正则版 FountainParser 快约 10 倍如需同时回归老解析器可在FNScript的相关方法上传入FNParserTypeRegex选项切换。❓ 常见问题为什么用样例文件而不是直接写字符串元素类用例用文件可以集中管理一批边界写法并复用而 FNScriptTests.m 这类需要精确控制内容的用例则直接loadString:内联字符串两种方式互补。测试覆盖了粗体、斜体等文本样式吗不覆盖。README 明确说明解析器刻意不处理文本样式只把样式标记原样保留给下游渲染层处理。测试文件放在哪里维护全部集中在 FountainTests/ 目录与 Fountain/ 下的解析器源码目录平级改解析逻辑时顺手就能找到对应的测试用例。一套好的单元测试体系本质是把最容易出错的角落变成永远不会回退的保证。FountainTests 用 18 个精心设计的样例剧本和三层测试风格为 Fountain 剧本解析器提供了这样一份完整指南——无论你要扩展解析器、移植代码还是学习解析器测试怎么写这个目录都值得逐行读一读。【免费下载链接】FountainAn open source implementation of the Fountain screenplay formatting language.项目地址: https://gitcode.com/gh_mirrors/foun/Fountain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表