自动化烟测不等于完整测试
个人开发者听到自动化测试,可能会觉得成本太高。游戏确实很难把所有玩法自动测完,但烟测目标不同:它只检查构建是否能启动,主菜单是否可操作,新游戏是否进入场景,存档是否能写入,关键流程是否没有崩溃。它不替代人工试玩,却能挡住很多低级问题。
Steam 发布前,最怕的是上传一个根本打不开、菜单按钮失效、读档崩溃、配置缺文件的包。自动化烟测可以在每次候选构建后跑一遍,给发布多一层底线。
先定义烟测范围
烟测范围要小而稳定:
| 测试 | 目标 |
|---|---|
| 启动 | 游戏进程启动并显示主菜单 |
| 主菜单 | 开始游戏、设置、退出按钮可用 |
| 新游戏 | 能进入第一关 |
| 存档 | 写入和读取成功 |
| 关键场景 | 加载代表性关卡 |
| 日志 | 没有 Fatal 或关键 Error |
| 截图 | 主菜单和第一关不是黑屏 |
不要把复杂战斗和随机流程放进基础烟测。烟测越稳定,越容易长期执行。
启动检查
启动测试可以做几件事:
- 从构建目录或 Steam 安装目录启动。
- 等待主窗口出现。
- 等待主菜单文本或按钮出现。
- 检查进程没有退出。
- 读取日志确认启动阶段完成。
如果游戏有 Steam API 依赖,最好在 Steam 客户端环境下也跑一次。直接运行可执行文件和从 Steam 启动不是同一条路径。
菜单导航
菜单烟测不需要识别复杂 UI,可以用固定输入:按确认进入新游戏,按返回回主菜单,打开设置修改音量再取消。重点是确认输入系统、UI 焦点和状态切换没有断。
菜单测试常能发现:
- 默认焦点丢失。
- 设置页打不开。
- 弹窗阻塞。
- 手柄确认和键盘确认行为不同。
- 返回主菜单后按钮不可用。
这些问题人工也能发现,但自动化能每次构建都检查。
存档烟测
存档烟测很有价值。流程可以是:
- 删除测试存档目录。
- 启动游戏并新开一局。
- 到达第一个检查点。
- 退出到主菜单。
- 继续游戏。
- 检查玩家回到正确场景。
如果做不到自动走到检查点,可以在内部构建提供测试入口,但要确保发行候选也能用正常路径验证。存档 bug 很容易阻断玩家流程,值得放入烟测。
日志断言
自动化测试不一定要理解游戏全部状态,但可以检查日志。比如烟测结束后搜索:
FatalUnhandledsave_failedasset_missingsteam_init_failedquest_invalid_state
不是所有 Error 都一定阻断,但关键错误要让烟测失败。日志断言能发现肉眼没看到的问题,比如某个图标缺失但游戏用默认图标继续运行。
截图检查
截图检查可以防止黑屏、UI 丢失和场景未加载。简单做法是截主菜单和第一关,检查图片不是纯黑、不是纯白、尺寸正确。更进一步可以和基准图比较,但个人项目先做非空检查就很有用。
每次大改 UI 或光照后,更新基准截图。不要让截图对比变成频繁误报,否则你会很快不再相信它。
处理随机性
烟测要减少随机性。可以固定随机种子,使用固定测试存档,关闭动态每日内容。随机流程适合人工测试或专门模拟,不适合基础烟测。基础烟测的价值在于稳定地告诉你“这包有没有明显坏掉”。
在构建流程中的位置
烟测应该在构建后、上传 Steam 前跑一次;上传到 internal 分支后,从 Steam 客户端安装再跑一次。前者验证包本身,后者验证 Steam 分发路径。
流程:
- 导出构建。
- 跑本地烟测。
- 上传 internal。
- 从 Steam 安装。
- 跑 Steam 安装版烟测。
- 人工做关键试玩。
- 决定是否切候选分支。
失败后的处理
烟测失败要能快速定位。输出内容包括:失败步骤、截图、日志路径、构建编号。不要只显示“测试失败”。自动化工具本身也要保持简单,失败信息越直接越好。
如果烟测偶发失败,要先判断是测试不稳定还是游戏不稳定。偶发失败也可能是真问题,比如加载时序、焦点抢占、异步资源未准备。
最终检查清单
- 烟测范围小,覆盖启动、菜单、存档和关键场景。
- 从普通构建和 Steam 安装路径都验证。
- 菜单测试覆盖确认、返回和设置。
- 存档测试覆盖写入和继续游戏。
- 日志断言检查关键错误。
- 截图检查避免黑屏和未加载。
- 测试流程减少随机性。
- 失败输出包含截图、日志和构建编号。
自动化烟测不是为了替代人,而是让个人开发者在反复打包和上传时不靠记忆。它能挡住低级事故,把人工精力留给真正需要体验判断的部分。
烟测脚本要和构建编号绑定
每次烟测输出都要写入构建编号、平台、运行时间和结果。不要只保留一串截图。一个简单的结果文件可以包含:构建号、Git 提交、测试开始时间、通过步骤、失败步骤、日志路径、截图目录。
这样当候选包很多时,你能知道 rc4 是否真的跑过 Steam 安装版烟测,而不是凭印象判断。
测试账号和测试数据
烟测建议使用独立测试存档和测试配置。不要用开发者日常存档,因为里面可能已经解锁所有内容,掩盖新玩家路径问题。测试前清理配置,或复制一份标准配置,尽量让每次从相近环境开始。
如果需要 Steam 功能,使用测试账号或明确的测试分支。测试账号的云存档也要定期清理,否则旧数据会影响结果。
可以先从半自动开始
如果没有时间写完整自动化,也可以先做半自动清单:一键启动游戏、打开日志目录、生成测试存档、截图主菜单。半自动比完全靠记忆强。等流程稳定后,再逐步加入输入模拟和日志断言。
自动化测试的价值在于重复执行,不在于一开始多高级。个人项目最需要的是每次构建都有同一套最低检查。
维护烟测
游戏改 UI、改菜单、改流程后,烟测也要更新。否则测试会因为找不到旧按钮而失败。把烟测脚本当成项目的一部分维护,不要让它变成一次性工具。每次烟测误报,都要判断是脚本过时还是游戏行为真的变了。
适合自动化的断言
游戏烟测不一定能判断“好不好玩”,但可以判断很多明确条件:
| 断言 | 意义 |
|---|---|
| 主菜单在 20 秒内出现 | 启动没有卡死 |
| 点击开始后进入第一关 | 菜单和加载路径可用 |
| 日志没有关键错误 | 基础系统未报错 |
| 存档文件生成 | 写入权限正常 |
| 截图不是黑屏 | 渲染路径可用 |
| 退出后进程关闭 | 没有挂死 |
这些断言朴素,但非常适合每个候选包重复跑。烟测不需要理解 Boss 是否平衡,它只需要确认构建没有基础性损坏。
烟测和人工测试分工
烟测通过后,人工测试仍然要做。人工测试负责体验判断:教学是否清楚,战斗是否公平,关卡是否无聊,商店页承诺是否兑现。烟测负责重复性底线:启动、菜单、存档、日志、关键场景。
把分工写清楚,可以避免两种误区:一是因为有烟测就不试玩;二是因为人工玩过就不跑烟测。两者解决的问题不同。
构建失败时不要继续上传
如果本地烟测失败,就不要上传 Steam internal 分支继续试。先修本地构建,除非问题只可能发生在 Steam 环境。否则你会在 Steam 后台留下多个坏构建,增加混乱。候选阶段要让每个上传包都有基本可信度。
烟测通过标准要固定
烟测结果需要明确通过标准。比如主菜单 20 秒内出现、第一关 40 秒内加载、日志没有关键错误、存档文件存在、退出进程在 5 秒内结束。没有标准时,测试者会凭感觉判断,通过结果不稳定。
标准可以随项目成熟调整,但每次调整要记录原因。候选阶段不要临时放宽标准,除非你清楚知道失败来自测试脚本,而不是游戏本身。
保存历史结果
保留最近几次烟测结果很有用。某个构建突然启动变慢、日志错误变多、截图异常,就能和上一个构建对比。历史结果不需要长期保存全部,只要保留候选阶段的记录即可。
如果烟测结果开始频繁波动,要优先排查加载时序、异步资源和测试环境,而不是简单反复重跑。
稳定的烟测比覆盖更多但经常误报的烟测更适合候选阶段。
如果后续要扩展,可以先增加第二个代表关卡和一个旧存档读取场景。扩展顺序应从高风险路径开始,而不是追求测试数量。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。