跳到正文

Skills

chimera-test-the-wiring-not-the-class

在测试里手工组装出来的类,只能证明这个类能用,证明不了有任何东西能走到它——要覆盖生产环境真正走的那条路径。

模式来源: clean状态: activev0.1.0 · Apache-2.0

由读过该卡片的评审者赋予,而不是文件自我声明的。智能体在处理不可信内容的运行中提炼出的卡片,生来即被标记为受污染,在被检索之前会一直等待评审。

何时会想到它

  • 测试里能跑,应用里不行
  • 把组件加在工厂或注册表后面
  • 开关默认是关的
  • 测试全绿,功能是坏的

价值通常在「避免」和「检查」里。「该做」是人人都会写的那一节。

上面的卡片正文是译文。英文原文才是 CLI 导入的内容、智能体运行时读取的内容,也是下方哈希所证明的内容。

触发

你做了一个生产环境间接到达的组件:通过工厂、注册表、插件加载器、配置开关、路由器、CLI 入口,或者一个依赖注入容器。而你的测试是直接构造它、直接调用它的方法。

这些测试每一个都可能通过,同时这个组件在运行中的系统里根本无法到达——因为它们当中没有任何一个演练过注册动作、开关的默认值,或者组装器里那个决定要不要把它包含进来的分支。

对于调用方直接 import 并调用的纯函数,这条适用。在那里,import 就是接线,一个单元测试就覆盖了它。当你是刻意在隔离环境中测试一个算法时,这条也不适用——那些测试是正确的,应该保留;这张卡片说的是它们单靠自己不够。

该做

  1. 点名一个用户真正会碰到的入口:那个 CLI 子命令、那条 HTTP 路由、agent 的运行循环、那个定时任务。在写测试之前先把它写下来。

  2. 至少写一个从那里出发、并且不为你的组件传入任何构造参数的测试。如果测试必须点名你的类才能让这个功能发生,那它测的就不是接线。

  3. 按生产环境构建对象的方式去构建它——调用真正的工厂或配置加载器:

    # 错——证明的是这个类,不是接线:组件是被交给被测对象的,
    # 所以不管生产环境里有没有任何东西真的把它交出去,测试都会通过。
    assert "reminder" in render(feature=Feature(text="reminder"))
    
    # 对——按入口构建它的方式去构建,然后去找同一个可观察的东西
    assert "reminder" in build_the_real_way(config).render()
    

    Chimera 自己的例子值得点名,因为那个类从来就没坏过。skill card 有一个能用的检索器、一个能用的存储和一个能用的注入器——而 chimera/config.py:244 写的是 skill_cards: bool = Field(default=False, ...),所以在一个原样部署的环境里,从来没有任何东西被注入过。每一个单元测试都通过。最终抓到它的那次测量,数了铸出的 skill 数和注入的 skill 数,得到的是 39 比零。

  4. 断言一个只有在组件确实被到达时才可能出现的可观察物:渲染出的提示词里的文字、写下的一行记录、一条日志、一个退出码。

  5. 断言默认值。如果这个功能是藏在一个开关后面发布的,就再加一个测试,在没有任何覆盖的情况下读取那个默认值,并断言它是什么。一套永远只在开关被强制打开的情况下运行的测试,没法告诉你用户拿到的是什么。

避免

手工组装那些生产环境会自动接起来的协作对象。失败的形状是:一个有完整单元覆盖、路由器却从来没注册过的处理器类,或者一个配置键默认关闭的能力——类是对的,测试是对的,而这个功能在产品里什么都不做。没有任何东西是红的,所以没有任何东西被调查,这个缺口一直活到有个人手工试了一下这个功能为止。

也要避免把你想覆盖的那道接缝伪造掉。给工厂打补丁,或者把配置加载器桩化成返回一个包含你的组件的对象,删掉的恰恰是这个测试当初存在要去演练的那段代码:


monkeypatch.setattr(mod, "load_plugins", lambda: [MyPlugin()])

改成在最外层边界上伪造——网络客户端、时钟、LLM 调用——让入口和你的组件之间的一切都是真的。

检查

删掉接线,跑一遍测试套件。把那行注册代码注释掉:@register 装饰器、分发字典里的那个条目、include_router(...) 调用、配置 schema 里的那个默认值。

然后是二元问题:有测试变红了吗,而且那是一个从来没有点名你的类的测试吗?

如果套件依然是绿的,那你的覆盖只到类这一层,接线是没被测过的。如果唯一变红的测试就是那个直接构造这个类的测试,答案一样。之后把那一行恢复回来,确认变绿——并且在提交前跑 git diff,别让被删掉的注册代码发出去。

风险

入口测试更慢、更难调试,定位也更差:一个失败时你知道这个功能坏了,但不知道是十个组件里的哪一个把它弄坏的。这是真实的代价,而对这张卡片的错误反应,是删掉单元测试改用端到端测试。两个都留着——接线测试告诉你它坏了,单元测试告诉你坏的是什么

走真正的入口,也可能碰到你不想在 CI 里碰的东西:一个要付费的 API、一个线上数据库、沙箱之外的文件系统。如果到达入口的唯一办法是花钱或者改动生产环境,那就别硬来;改成直接覆盖那个组装函数,并接受你离真实路径还差一步。

还有,这张卡片抓的是可达性,不是正确性。一个功能可以完美地接到入口上,却依然给出错误的答案,所以一个绿色的接线测试,并不是跳过断言输出内容的许可证。

如何使用

卡片就是数据。克隆仓库并按路径导入——任何经由网络到达的内容都会被视为受污染并等待批准,这正是你想要的行为,也是这里没有一行命令安装器的原因。

git clone https://github.com/brcampidelli/chimera-agent.git
chimera skills-import chimera-agent/skills/chimera-test-the-wiring-not-the-class/SKILL.md

完整性

文件发布版本的 SHA-256。导入方可以据此核对收到的内容与本页展示的一致。

564f2b0aaff3bbb51ca9bfa013d89e3d47d92166f498803c688c3b859b378475

在仓库中阅读该卡片