news 2026/9/18 18:15:29

agent-plugins示例目录教程:valid/invalid测试夹具实战演练

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
agent-plugins示例目录教程:valid/invalid测试夹具实战演练

agent-plugins示例目录教程:valid/invalid测试夹具实战演练

【免费下载链接】agent-plugins项目地址: https://gitcode.com/GitHub_Trending/skills16/agent-plugins

agent-plugins是官方维护的 Flutter/Dart 智能体技能插件集合,其配套的 Skills CLI 工具位于 tool/generator/,用于从文档自动生成SKILL.md。本教程带你走进它的测试目录,实战演练valid/invalid 测试夹具——看看官方如何在测试中构造"合法配置"与"非法配置"两种场景,用测试夹具精准验证技能校验器的每一条规则,是学习 Dart 测试设计模式的绝佳范例。

一、先搞清楚:测试夹具是什么?

🔍 测试夹具(Test Fixture)就是测试用的"样例数据"。写校验类代码时,最稳妥的办法是准备两套数据:

夹具类型作用期望结果
valid(合法)完全符合规则的配置校验通过,不报错
invalid(非法)违反某一规则的故意错误配置校验失败,且报出对应错误

💡冷知识:打开本项目你会发现,它并没有单独的fixtures/validfixtures/invalid静态目录,而是把夹具直接写在测试代码里、运行到临时目录中。这种方式零文件污染、隔离性更好,非常值得借鉴。

二、认识主角:技能校验命令

被测试的"目标"是validate-skill命令,源码在 validate_skill_command.dart。它会检查 YAML 配置文件是否满足这些规则:

  1. 根节点必须是 YAML 列表,且列表非空
  2. 每一项必须是 Map,且包含namedescriptionresources三个必填字段
  3. 技能名必须是 kabob-case(如abc-def
  4. flutter_skills.yaml中的技能名必须以flutter-开头
  5. resources列表不能为空,且 URL 必须使用 HTTPS
  6. 各字段类型必须正确(namedescription必须是字符串)

配套的真实配置文件 resources/flutter_skills.yaml 本身就是一个最大的 valid 夹具——它必须通过全部校验,否则工具链就跑不起来。

三、valid 夹具实战:一条"完美配置"的诞生

打开 validate_skills_input_test.dart,第一个用例就是"合法场景":

'name': 'flutter-test-skill' // kabob-case ✔ 前缀 ✔ 'description': 'A Flutter test skill' // 非空字符串 ✔ 'resources': ['https://example.com/doc'] // 非空列表、HTTPS ✔

测试断言非常"反向思维":它不检查"输出成功",而是断言日志中不包含Configuration validation failed.。这正是 valid 夹具的精髓——用"无错误"来证明"全合法"。

对比手法在 validate_skills_test.dart 里更完整:测试先搭好临时目录(tempDir+skills/+validation/),写入一份合法配置和一份SKILL.md,再运行命令,断言日志出现Validating skill: test-skill...

⚙️关键技巧:MockClient。测试用MockClient替代真实 HTTP 客户端,让https://example.com等假地址可以"有内容返回",从而完全离线复现网络抓取流程。

四、invalid 夹具实战:八种"故意写错"的配置

validate_skills_input_test.dart 是本次演练的核心,它像清单一样逐条构造非法夹具:

#invalid 夹具构造触发的错误信息
1根节点写成 Map 而非列表Root must be a YAML list.
2列表为空[]Configuration list must not be empty.
3列表项是普通字符串Item 0 is not a Map.
4缺少descriptionresourcesis missing required field ...
5技能名用下划线(flutter_skill_invalidmust be kabob-case (e.g. abc-def).
6dart-前缀写进flutter_skills.yamlmust start with "flutter-".
7resources为空列表field "resources" must not be empty.
8URL 使用http://must use secure HTTPS.

每个用例都遵循同一个节奏,改一个字段 → 断言一条错误,让"一条规则 = 一个测试"的映射关系一目了然。

再往前看,validate_skill_command.dart 的"配置文件不存在"分支,则由 validate_skills_test.dart 中传一个不存在的NON_EXISTENT.yaml路径来覆盖——invalid 夹具不只有"内容错",还有"文件缺失"这一类。

五、进阶演练:用 MockClient 制造"运行时异常"夹具

内容合法不代表流程顺利。validate_skills_test.dart 展示了更高级的夹具设计:用 MockClient 抛异常来模拟网络故障

  • 模拟抓取失败:throw Exception('Network Error'),断言日志出现Error validating ...
  • 模拟评分接口崩溃:抓取地址正常返回,但 Gemini 接口抛错,断言出现Failed to generate validation report
  • 模拟"干跑"模式:--dry-run时断言不调用Gemini、不写验证报告文件

🧩 这类夹具的通用套路:happy path 用"返回正常数据"的 Mock,异常路径用"抛错"的 Mock。两者合起来,测试才算覆盖了完整的运行时行为。

六、动手跑起来:验证你的理解

在仓库根目录安装依赖后,进入工具目录即可运行全部测试:

cd tool/generator dart test

如果你希望亲手加一条 invalid 用例,只需照抄现有模板:在setUp的临时目录里写入新的错误配置,调用runValidation,再用expect(logs, contains('...'))断言目标错误信息即可——这正是"夹具驱动开发"的魅力:规则、数据、断言三位一体。

📌 延伸阅读:

  • 校验规则实现:validate_skill_command.dart
  • 输入校验测试:validate_skills_input_test.dart
  • 端到端验证测试:validate_skills_test.dart
  • 真实合法配置夹具:flutter_skills.yaml
  • 技能 lint 规则:skills_lint.yaml

七、小结:从 agent-plugins 学到的 3 个夹具设计要点

  1. valid 夹具断言"无错":合法场景靠"不包含失败信息"来证明,避免假阳性
  2. invalid 夹具一错一测:每种违规独立成用例,错误信息与规则一一对应
  3. Mock 即夹具MockClient让网络边界可离线、可异常化,覆盖真实运行时才会暴露的分支

掌握这套 valid/invalid 演练思路后,无论写配置解析器还是 AI 工作流工具,你都能快速搭起高覆盖率的测试骨架。

【免费下载链接】agent-plugins项目地址: https://gitcode.com/GitHub_Trending/skills16/agent-plugins

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 18:14:49

VMware共享文件夹三步闭环:Tools驱动+UNC映射+服务验证

简介:本资源是一份面向VMware初学者与虚拟化实践者的实操指南,聚焦解决Windows主机与虚拟机间文件共享这一高频痛点问题。内容以图文结合方式,系统讲解共享文件夹配置全流程:从虚拟机设置中添加主机目录、载入windows.iso安装VMwa…

作者头像 李华
网站建设 2026/9/18 18:12:50

JMeter JSON提取器实战:单值、全值与多参数提取避坑指南

Jmeter 的 JSON 提取器(JSON Extractor)这个后置处理器,我在几乎每一个需要接口串联的压测脚本和自动化校验脚本里都会用它。它的活儿说穿了很朴素:从上一次请求返回的 JSON 报文里,把某个字段抠出来,存成 …

作者头像 李华
网站建设 2026/9/18 18:11:00

OpenOcta 同时挂 MCP 和 Agent Skills,模型调用走 TaoToken 统一接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 18:10:27

离散信号描述与典型序列:δ(n)、u(n)与周期判定

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 18:10:20

基于STM32的图书馆环境监测系统:硬件、代码与Proteus仿真

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 18:09:13

MacOS 装 SAP 的 JAR 报 JAVA 错?让 OpenClaw 借 TaoToken 排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华