Godot 客户端自动化测试:从脚本单测到可重复的场景冒烟

讨论 Godot 客户端测试分层、纯逻辑测试、场景冒烟、截图检查、CI 导出和测试数据。

Godot 项目也需要自动化测试

很多游戏团队觉得客户端测试只能靠 QA 手玩。确实,手感、美术和关卡体验需要人工判断,但大量基础问题完全可以自动化:配置能不能加载,存档能不能迁移,UI 页面能不能打开,场景有没有缺资源,玩家能不能从主菜单进入第一关,关键按钮点击后是否报错。Godot 项目越接近发布,越需要可重复的冒烟测试。

自动化测试的目标不是替代 QA,而是把低级回归挡在开发阶段。每次提交后,如果主菜单打不开、某个 Autoload 报错、战斗场景缺脚本,测试应该立刻失败,而不是等第二天测试同学手动发现。

flowchart TD
    A[纯逻辑代码] --> B[脚本单测]
    C[Resource/配置] --> D[资源校验测试]
    E[场景文件] --> F[场景加载冒烟]
    F --> G[关键流程自动操作]
    G --> H[截图/日志检查]
    B --> I[CI 报告]
    D --> I
    H --> I

先把可测试逻辑从 Node 里拿出来

Godot 的 Node 生命周期不太适合做所有逻辑测试。_ready()、场景树、信号、输入都依赖运行环境。如果背包排序、存档迁移、伤害公式、任务条件都写在 Node 脚本里,单测会很麻烦。更好的做法是把纯逻辑放到 RefCounted、Resource 或普通脚本类里。

比如伤害计算函数只接收攻击者属性、技能配置、防御者状态,返回结果。它不需要场景树。任务条件判断只接收玩家状态和任务配置。背包排序只接收物品列表。这样的逻辑可以用脚本测试快速覆盖。

Node 层负责把运行时数据传给逻辑层,并把结果表现出来。这样既方便测试,也让架构更清楚。

场景冒烟测试覆盖“能打开”

游戏客户端很多错误来自场景本身:脚本丢失、导出变量没填、资源路径错、控件改名导致 get_node 失败。场景冒烟测试可以批量加载关键 .tscn,实例化,进入场景树跑几帧,检查是否有错误日志。

不是所有场景都要完整玩一遍。第一层目标是能加载、能 _ready()、能释放。主菜单、设置页、背包页、战斗场景、角色预览、主要弹窗都应该覆盖。每新增一个核心页面,就把它加入冒烟列表。

场景测试要使用测试数据。比如背包页需要物品数据,排行榜需要榜单数据。不要连真实服务器,使用本地 mock 模型。这样测试稳定,也能覆盖边界数据。

关键流程要可脚本操作

更进一步,可以自动执行关键流程:启动游戏,进入主菜单,打开设置,切换语言,开始新游戏,进入第一关,移动角色,触发暂停,返回菜单。Godot 可以通过脚本模拟输入或直接调用场景路由。关键是流程要可重复。

输入模拟适合测试真实交互,但容易受布局和帧率影响;直接调用路由和按钮方法更稳定,但覆盖不到输入层。两者可以结合。冒烟测试追求稳定,专项测试再覆盖复杂输入。

流程测试要有超时。某一步超过时间未完成,立即失败并输出当前场景、活跃弹窗和日志。不要让 CI 卡住。

截图检查能发现明显 UI 回归

视觉质量最终靠人工,但自动截图可以发现大问题:页面空白、文本 key 未替换、弹窗超出屏幕、主题资源缺失。对关键页面,在固定分辨率和测试数据下截图,和基准图做简单比较或人工审阅。

截图测试不要过度追求像素完全一致。动画、字体渲染、平台差异都会造成细微变化。更实用的是检查非空、关键节点可见、错误文本不存在,或做宽松阈值比较。

多语言和安全区也适合截图冒烟。用长文本语言、极端安全区参数打开页面,至少能发现布局爆炸。

CI 导出和运行要分层

Godot CI 可以做几层:脚本静态检查、资源校验、编辑器无界面运行测试、导出包构建、导出包启动冒烟。每层耗时不同,不必每次提交都跑最重测试。开发分支跑快速门禁,夜间跑全量导出和真机测试。

导出包测试很重要。编辑器里能跑,不代表导出包资源路径、大小写、权限和平台 API 都正确。至少每天生成一次 Android、iOS 或桌面候选包,跑启动和主流程冒烟。

测试报告要对开发友好。失败时给出场景路径、错误日志、截图、随机种子和测试数据。只说“CI failed”没有帮助。

小结

Godot 客户端自动化测试可以从小处开始:纯逻辑单测、资源校验、场景加载冒烟,再逐步加入关键流程和截图检查。它不替代人工体验测试,但能让团队少在低级回归上浪费时间。项目越内容密集,自动化越能保护迭代速度。
我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

我会先把“所有核心场景能实例化并跑 3 帧”作为第一条门禁。它实现成本低,却能抓到大量缺脚本、空引用和资源路径错误,是 Godot 项目最值得早做的测试之一。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页