项目过了几千个 Lua 文件,纯靠人眼 review 必然失控:未使用变量、全局污染、空函数、循环里悄悄改循环变量……这些低级但高发的问题,静态检查工具一次全扫出来。工具链的价值不在于"代码写得更漂亮",而在于把review 精力留给真正的业务逻辑。
luacheck 是 Lua 生态最常用的静态检查器,检查的是"结构性问题"而非功能:未定义全局(手滑没写 local 的第一现场)、未使用变量与参数、遮蔽上层变量、空代码块、行宽等。它有官方的告警编号体系,团队可以按需开关:
luacheck src/ --globals release_print SL lib996 --no-max-line-length
luacheck src/ --std luajit --codes
--globals 用于登记引擎注入的全局(SL、lib996 这类),否则满屏误报没人会坚持用。真正落地时配一个 .luacheckrc 配置文件进版本库,全员同一套标准;再接进构建流水线,检查不过就不出包——规范只有自动执行才叫规范,靠自觉的规范活不过三个月。
busted 是 Lua 的行为驱动测试框架,语法接近自然语言:
describe("爆率计算", function()
it("千分比概率应落在 0-1000", function()
local r = calcDropRate( { base = 500 } )
assert.is_true(r >= 0 and r <= 1000)
end)
it("幸运值满值必出", function()
assert.equals(1000, calcDropRate( { base = 500, lucky = 500 } ))
end)
end)
不必追求全覆盖,只测"值得测的":爆率与数值公式、存档合并、协议解析、热更状态迁移——这些出一次事故就很疼的纯逻辑函数,是单测性价比最高的地方。写测试还会倒逼函数设计变纯(输入决定输出、不偷偷改全局),而纯函数恰恰是最容易热更和测试的。
最小可用流水线三步:提交前本地跑 luacheck;构建机自动跑 busted 全量用例;任一步失败即中止出包。有条件再加一步:用测试跑出来的覆盖率报告约束核心模块不低于目标行数。半天就能搭完,之后每次热更、每次改爆率,都有一层机器兜底——这比事后在群里问"谁动了这个文件"有效得多。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
release_print(msg)
打印消息到控制台,断言失败与用例名输出到控制台,开发期足够用
logact(play, logAct, loginfo, nParam1, nParam2, nParam3, nParam4, nParam5)
自定义日志,把用例结果写入日志通道,便于与构建记录对应
printusetime(play, on, off)
打印脚本总耗时(微秒),给关键用例加耗时基线,性能回退能被测试拦住
require(path)
加载文件,测试用例与业务模块走同一套加载机制,避免环境差异
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 战士的烈火剑法一击熄火后要等八秒冷却,连招断档感强烈。疾风烈火斩在烈火剑法命中后给一次连击窗口:三秒内再…
实战应用:用在哪里 阵营对抗打到中期容易疲软:打赢没有额外好处,输掉也没有代价。阵营声望体系给阵营战装上荣誉刻度:个人与阵营…
实战应用:用在哪里 拿下沙巴克之后呢?城主除了名字挂在城墙上,对城市毫无影响。城主施政玩法让占领变成治理:城主每周获得市政令…
实战应用:用在哪里 主线路光缆被挖断的深夜,全服掉线 20 分钟,玩家以为游戏倒闭。备用线路方案给接入层配第二条出口:主线路…
实战应用:用在哪里 行会官员由帮主任命的老模式弊端明显:任人唯亲、能上不能下。行会选举接口把官员换届做成投票制:每两个月一次…
实战应用:用在哪里 烈火剑法的伤害加成、冷却时间、下一级提升,全靠玩家记忆或去官网查。技能说明悬浮卡片在鼠标悬停技能图标零点…