改完引擎或关卡,有人只丢一张通关截图过来。我要的是可执行的红绿:规则单测有没有跑,shipped 的 levels.cj 是否还等于生成器吐出的那份。

约定写在纸上不够。它得变成 test_rules.py 里可执行的断言,以及 build_levels.py 发现偷懒时直接打回。

这篇只谈回归工程我怎么卡住——规格、同步、打回句。规则层三条约定的定义不在这里重复。

回归管线服务的仍是这款纯仓颉手机游戏;早前迁移线上「仓颉 + ArkTS」的混编边界,不在这篇展开。

这是驿路回归这一段我正在用的卡法,不是所有仓颉仓的测试宪法。第一次先把「只交截图」挡掉,换成要红绿日志;已经有自己 executable spec 的,欢迎拿断言切法和我对一对。

我把回归入口写进日常命令:改引擎先跑规则单测;改关先改 JSON 再 emit,再跑「shipped == generated」;通关类测试用求解器路径喂 try_step,避免「有解但步进拒绝」漏网。Agent 若只交截图,我会要红绿日志。

第一次先做的,是改引擎跑 test_rules、改关先改 JSON 再 emit,并盯「shipped == generated」;Agent 只交通关截图时,要红绿日志,不收图。

test_rules.py:可执行规格,不是说明文档

文件头写得很硬:这是 executable spec;Cangjie 实现若与这些行为 disagreement,默认 Cangjie 错,除非先改 spec。镜像的是引擎与 Zip 巡逻层:格子边界、正交邻居(曼哈顿距离为 1)、墙阻挡、can_enter / try_step(含拖回即 undo)。

断言实际压什么(比复述约定定义有用):

  • 触点映射:中心格映射;越界拒绝(test_rejects_outside)。

  • 巡逻规则:必须从 1 起;拒对角;拒墙;拖回 undo;按钮 undo/clear;拒重访;拒跳号。

  • 出货关通关:求解器路径逐步 try_step 为真并最终胜利(教程长安尺寸有 timeout 例外要记账)。

  • 目录同步:levels.cj 文本必须等于从 levels.json emit 的结果——断言句就是 levels.cj must be emitted from levels.json。

  • 另有 UI 文案 / theme token:回归不止规则一层。

优点:规则对象与 UI 脱钩后,CI/本机都能红绿;Agent 改引擎,我这边要求先过这张网。缺点:spec 与实现双写时,人要守「先改谁」;只跑求解器不跑 try_step 通关,会漏「路径存在但步进拒绝」。

build_levels.py:同步规则我先卡在「不通过就停」上

脚本职责极窄:从 resources/rawfile/levels.json 生成 entry/src/main/cangjie/levels.cj。不发明关;教程长安 6×8 置顶;emit 头注释写明 Generated from JSON、勿手改发明。

load_verified 的「不通过就停」比口号管用:

  • 教程 waypoints 被改 → 不让 emit

  • 站名表与预期不一致 → 不让 emit

  • 错字站名(如「汽梁」)→ 不让 emit,要求正确站名

同步规则我这边先卡住:改关先改 JSON,再跑脚本;脚本绿不等于 HAP 绿——这两层验收分开记账。求解侧另有「source of truth for ship-or-reject」心智:能不能出货,先看验证表与 emit,不看「我手写了一份很像的字面量」。

优点:坏坐标、坏墙、错站名在生成期炸。缺点:多一步同步;Agent 最爱跳过脚本直接改 .cj——正是下面打回句要挡的。

偷懒形态 → 打回句

不讲约定条文,只讲看见什么、回什么:

  • 规则塞进 onTouch / 引擎 import Canvas → 「GridMap import 含 UI → 打回」

  • 「先让手指能动」双写规则 → 「步进是否仍唯一入口」

  • 手写「看起来像」的 levels.cj → 禁令 1

  • 跳过求解器直接改字面量 → 禁令 2

  • 「JSON 里有文件」偷换成「应用已加载」 → 禁令 3

  • 按 ArkTS(鸿蒙默认应用语言)文档填 Canvas 方法名 → 「脚手架熟 ≠ 验收约定熟」

  • 「棋盘很漂亮、编号走不通」 → 「规则又溜回触摸回调」

优点:打回句短,适合写进 session goal / memories。缺点:人要真用这些句子打断;只会赞「画出来了」,回归网等于没挂。把打回句与 test_rules 失败信息并排看更有效——测试红了补实现;测试绿但约定被偷懒,用打回句补人审。

和驿路篇的关系(只回指概念,不加系列链接)

概念见驿路篇三条约定标题即可。这篇落地的是:unittest 压 GridMap/canEnter 行为、emit 字节级同步、assertEqual(shipped, generated) 一类可跑断言。CJMP(跨平台框架)本案例未用——一句边界,不做框架安利。

收束

目前我这样做:test_rules.py 当 executable spec;build_levels.py 验证失败就停 emit;偷懒形态对着打回句;通关类用求解器路径喂 try_step;脚本绿与 HAP 绿分账。目前我认:规则约定要变成红绿,才算进工程。

仍待验证:spec 与 Cangjie 实现双写时「先改谁」的纪律能不能自动化;教程长安 timeout 例外要不要单独记账字段;UI 文案 / theme token 回归是否该拆成第二张网。

抛出问题:executable spec 默认「实现错、除非先改 spec」,在多 Agent 仓库里会不会反而鼓励改 spec 逃课?只收红绿、不收截图,观感类验收(章皮 / 半身)你放在哪一层,才不会和规则网搅糊?

Logo

一站式 AI 云服务平台

更多推荐