name: bddc description: 行为驱动开发编译器 (BDDC)。使用此技能通过 DSL 管理 BDD 测试,该 DSL 可编译为 ExUnit 测试。包括从 .dsl 文件生成测试、验证指令集以及通过 lint 确保测试质量。
BDDC 技能 (行为驱动开发编译器)
此技能支持“提案者-执行者 (Proposer-Executor)”工作流,用于高质量的行为驱动测试。它使用自定义 DSL 描述业务场景,并将其编译为标准的 ExUnit 集成测试。
核心方法论:DSL + BDDC
- DSL (领域特定语言):编写在
.dsl文件中的人类可读场景。 - 指令规范 (Instruction Spec):一个正式契约(JSON/Elixir map),定义了可用的
Given、When和Then步骤,包括它们的参数和类型。 - 编译器 (bddc):根据规范验证 DSL 文件并生成 ExUnit 测试代码的工具。
- 运行时 (Runtime):项目特定的调度器,负责执行每个指令的实际逻辑。
工具执行策略 (Tool Execution Strategy)
为了保证跨环境兼容性,项目在 .github/tools/ 存放了预编译的二进制文件。Agent 应遵循以下逻辑:
- 优先使用本地二进制路径:在 Linux 环境下,直接使用
.github/tools/bddc-linux-x86_64和.github/tools/taskctl-linux-x86_64。 - 路径规约与配置:
- DSL 存放:默认存放于
test/bdd/dsl/(避免放在docs/下被编译器错误扫描)。 - 指令定义:存放于
priv/bdd/instructions_v1.exs。 - 路径修改:通过根目录的
.bddc.toml进行配置。[global] in = "test/bdd/dsl" # DSL 输入目录 out = "test/bdd_generated" # 测试代码输出目录 docs_root = "test/bdd" # 文档根目录(影响模块命名) instructions = "priv/bdd/instructions_v1.exs"
- DSL 存放:默认存放于
- 环境预检与依赖注入:
- 运行
bddc compile前,必须确保项目已成功编译(mix compile)。 - 显式指定指令文件:
bddc compile --instructions priv/bdd/instructions_v1.exs。
- 运行
核心规约 (Core Conventions)
1. DSL 参数与变量规约 (重要)
- 变量定义:使用
LET var_name = 'value'。注意var_name不要带 $ 前缀(编译器在定义时会自动处理,带 $ 会导致引用失败)。 - 变量引用:在指令中使用
$var_name。 - 字符串引号:推荐使用单引号包裹 JSON 或复杂字符串,避免嵌套双引号引发的解析错误。
- 禁止拼接:DSL 不支持
'a' + 'b'这种字符串拼接,必须在LET中定义完整字符串。
正确示例:
LET args = '{"path":"file.txt","content":"hello"}'
WHEN execute_tool tool_name="write_file" args=$args
2. 自动化门禁 (Gate)
在完成任务前,必须运行以下脚本确保质量:
./scripts/bdd_gate.sh:专门针对 BDD 的编译与测试。./scripts/pre_deploy_check.sh:全量检查(编译、Credo、BDD)。
标准迭代工作流 (Standard Iteration Workflow)
在进行功能新增、Bug 修复或重构任务时,必须遵循以下步骤:
- 任务规划:使用
taskctl生成 DAG 图,明确执行路径。 - 定义行为:在
test/bdd/dsl/编写 DSL 场景,确保测试先行。 - 实现与验证:按照规范修改代码,并运行
./scripts/bdd_gate.sh进行闭环验证。 - 自检交付:运行
./scripts/pre_deploy_check.sh,确保无编译警告且静态分析通过。
常用 BDDC 命令
bddc compile- 将.dsl文件转换为test/bdd_generated/*_test.exs。bddc check- 全量验证(注意:在本项目中可能产生误报,优先使用compile)。bddc lint- 检查测试异味(弱断言、固定休眠等)。
与 Gemini CLI 集成
当被要求“添加 BDD 测试”或“验证行为 X”时:
- 搜索
test/bdd/dsl/以获取相关 DSL。 - 搜索
priv/bdd/instructions_v1.exs以获取可用指令。 - 提出
.dsl修改建议。 - 执行
./scripts/bdd_gate.sh。