$npx -y skills add kweaver-ai/kweaver-dip --skill bkn-test生成测试集与验证用例。三种模式:schema_review / rules_verification / qa_verify。
| 1 | # 测试与验证 |
| 2 | |
| 3 | 公约:`../../_shared/contract.md` |
| 4 | |
| 5 | ## 做什么 |
| 6 | |
| 7 | 根据 BKN 草案和业务规则生成可复用的测试集,或对已推送网络做 Q&A 验证。 |
| 8 | |
| 9 | ## 三种模式 |
| 10 | |
| 11 | ### 1. `schema_review`(推送前,静态检查,默认) |
| 12 | |
| 13 | 输入:对象/关系/动作草案 + 业务规则 + 绑定结果 |
| 14 | 输出:四类测试用例 + 覆盖率矩阵 |
| 15 | |
| 16 | **注意**:此为静态检查,不依赖真实数据。只验证 `.bkn` 文件的结构完整性、业务规则存在性、绑定关系完整性。 |
| 17 | |
| 18 | ## 对象过滤规则 |
| 19 | |
| 20 | **`存储位置: local` 对象不参与 binding 测试**,local 对象没有数据视图绑定,binding 测试只统计 `platform` 对象。 |
| 21 | |
| 22 | | 测试类别 | local 对象处理 | |
| 23 | |---------|--------------| |
| 24 | | smoke | ✓ 参与(验证 schema 结构) | |
| 25 | | rules | ✓ 参与(规则可能引用 local 对象) | |
| 26 | | binding | ✗ 排除(local 对象无视图绑定) | |
| 27 | | risk | ✓ 参与(验证高风险动作定义) | |
| 28 | |
| 29 | **binding 测试的最小数量**: |
| 30 | - binding_min = max(已绑定 platform 对象数, 3) |
| 31 | - 若 platform 对象数为 0 → binding 测试跳过,不计入 BLOCKED |
| 32 | |
| 33 | ## rules 插件不可用时的处理 |
| 34 | |
| 35 | **当 `plugin_availability.rules == unavailable` 时(阶段五跳过)**: |
| 36 | |
| 37 | | 测试类别 | 处理方式 | |
| 38 | |---------|---------| |
| 39 | | smoke | 正常生成 | |
| 40 | | rules | 跳过(无业务规则 Skill 文件,无法生成规则类测试) | |
| 41 | | binding | 正常生成 | |
| 42 | | risk | 正常生成 | |
| 43 | |
| 44 | 此时: |
| 45 | - rules_min = 0(不计入 BLOCKED) |
| 46 | - bkn-review 评分中"规则覆盖率"维度降级(Skill 文件质量子项权重降为 0,剩余权重等比放大) |
| 47 | - 输出中标注:`rules: skipped(no_skill_file)` |
| 48 | |
| 49 | ## 数量硬约束(BLOCKED 机制) |
| 50 | |
| 51 | **本节约束适用于 `schema_review` 模式**。`rules_verification` 模式有独立的数量约束(见 mode 2 说明)。 |
| 52 | |
| 53 | **生成测试集后必须自检数量,不达标则 BLOCKED**: |
| 54 | |
| 55 | ``` |
| 56 | 最小用例数计算: |
| 57 | - smoke_min = 对象数 + 关系数 |
| 58 | - rules_min = max(规则数 × 2, 10) # 每条规则至少1正例,关键规则额外1反例,总数不低于10 |
| 59 | - binding_min = 3 |
| 60 | - risk_min = 高风险动作数 × 2 |
| 61 | |
| 62 | 总最小用例数 = smoke_min + rules_min + binding_min + risk_min |
| 63 | ``` |
| 64 | |
| 65 | **执行逻辑**: |
| 66 | 1. 统计生成的各类用例数量 |
| 67 | 2. 与最小规范对比 |
| 68 | 3. 任一类别不达标 → **BLOCKED**,输出: |
| 69 | ``` |
| 70 | 测试集数量不达标,BLOCKED: |
| 71 | - smoke: 需至少 {smoke_min} 条,实际 {actual} 条 |
| 72 | - rules: 需至少 {rules_min} 条,实际 {actual} 条 |
| 73 | - binding: 需至少 {binding_min} 条,实际 {actual} 条 |
| 74 | - risk: 需至少 {risk_min} 条,实际 {actual} 条 |
| 75 | |
| 76 | 必须补充至达标后方可继续。 |
| 77 | ``` |
| 78 | 4. 用户确认补充后,重新生成缺失类别用例 |
| 79 | 5. 全部达标 → 输出完成回执 |
| 80 | |
| 81 | ## 复杂度约束 |
| 82 | |
| 83 | ### smoke 测试必须包含(每条) |
| 84 | |
| 85 | | 检查项 | 说明 | 必须验证 | |
| 86 | |--------|------|---------| |
| 87 | | 对象存在性 | 对象类型在 schema 中存在 | ✓ | |
| 88 | | 属性完整性 | 至少验证 3 个核心属性非空 | ✓ | |
| 89 | | 主键有效性 | primary_key 字段存在且非空 | ✓ | |
| 90 | | 关系连通性 | 关系的 source/target 对象均存在 | ✓ | |
| 91 | |
| 92 | **smoke 用例模板**: |
| 93 | |
| 94 | ```yaml |
| 95 | case_id: smoke_obj_{object_id}_001 |
| 96 | title: 验证 {object_name} 对象结构完整 |
| 97 | level: smoke |
| 98 | target: {object_id} |
| 99 | steps: |
| 100 | - step: 查询 {object_id} 对象 schema |
| 101 | action: kweaver bkn object-type get {object_id} |
| 102 | - step: 检查属性列表包含核心属性 |
| 103 | check: properties contains [{核心属性1}, {核心属性2}, {核心属性3}] |
| 104 | - step: 检查 primary_key 非空 |
| 105 | check: primary_key != null && primary_key != "" |
| 106 | - step: 检查 display_key 非空 |
| 107 | check: display_key != null && display_key != "" |
| 108 | expected_result: |
| 109 | - 对象存在 |
| 110 | - 属性数量 >= {最小属性数} |
| 111 | - 核心属性: {列出3个核心属性} 均存在 |
| 112 | - primary_key: {主键字段名} |
| 113 | - display_key: {显示字段名} |
| 114 | ``` |
| 115 | |
| 116 | ```yaml |
| 117 | case_id: smoke_rel_{relation_id}_001 |
| 118 | title: 验证 {relation_name} 关系连通性 |
| 119 | level: smoke |
| 120 | target: {relation_id} |
| 121 | steps: |
| 122 | - step: 查询 {relation_id} 关系 schema |
| 123 | action: kweaver bkn relation-type get {relation_id} |
| 124 | - step: 检查 source 对象存在 |
| 125 | check: source_object_id in {所有对象ID列表} |
| 126 | - step: 检查 target 对象存在 |
| 127 | check: target_object_id in {所有对象ID列表} |
| 128 | - step: 检查 mapping 非空 |
| 129 | check: mapping_rules != null |
| 130 | expected_result: |
| 131 | - 关系存在 |
| 132 | - source: {source_object_id} 存在 |
| 133 | - target: {target_object_id} 存在 |
| 134 | - mapping: 有映射规则 |
| 135 | ``` |
| 136 | |
| 137 | ### rules 测试必须包含(每条) |
| 138 | |
| 139 | | 检查项 | 说明 | 必须验证 | |
| 140 | |--------|------|---------| |
| 141 | | 触发条件 | 规则的触发条件明确 | ✓ | |
| 142 | | 预期行为 | 满足条件时的预期结果 | ✓ | |
| 143 | | 正例验证 | 满足条件的场景验证 | ✓ | |
| 144 | | 反例验证(关键规则) | 违反条件的拒绝验证 | 仅高/关键规则 | |
| 145 | |
| 146 | **rules 用例模板(正例)**: |
| 147 | |
| 148 | ```yaml |
| 149 | case_id: rules_{rule_id}_positive_001 |
| 150 | title: 验证规则 {rule_name} 正例触发 |
| 151 | level: rules |
| 152 | target: {rule_id} |
| 153 | rule_type: {低|中|高/关键} |
| 154 | steps: |
| 155 | - step: 识别规则触发条件 |
| 156 | action: 解析规则 {rule_id} 的触发条件 |
| 157 | - step: 构造满足条件的测试输入 |
| 158 | input: {具体输入数据或场景描述} |
| 159 | - step: 触发规则执行 |
| 160 | action: {执行方式} |
| 161 | - step: 验证预期行为 |
| 162 | check: actual_result matches expected_behavior |
| 163 | expected_result: |
| 164 | - 触发条件: {列出具体条件} |
| 165 | - 预期行为: {列出预期结果} |
| 166 | - 关键词: [{expected_keyword_1}, {expected_keyword_2}] |
| 167 | - 规则来源: {rule_source_location} |
| 168 | ``` |
| 169 | |
| 170 | **rules 用例模板(反例 - 仅高/关键规则)**: |
| 171 | |
| 172 | ```yaml |
| 173 | case_id: rules_{rule_id}_negative_001 |
| 174 | title: 验证规则 {rule_name} 反例拒绝 |
| 175 | level: rules |
| 176 | target: {rule_id} |
| 177 | rule_type: 高/关键 |
| 178 | is_counterexample: true |
| 179 | steps: |
| 180 | - step: 构造违反条件的测试输入 |
| 181 | input: {违反条件的具体输入} |
| 182 | - step: 尝试触发规则 |
| 183 | action: {执行方式} |
| 184 | - step: 验证拒绝或报错 |
| 185 | check: result is rejection or error |
| 186 | expected_result: |
| 187 | - 违反条件: {列出违反的具体条件} |
| 188 | - 预期拒绝: 系统应拒绝或报错 |
| 189 | - 不应出现: [{expected_absent_keyword_1}, {expected_absent_keyword_2}] |
| 190 | - 反例类型: {边界越界|条件缺失|逻辑冲突} |
| 191 | ``` |
| 192 | |
| 193 | ### binding 测试必须包含(每条) |
| 194 | |
| 195 | | 检查项 | 说明 | 必须验证 | |
| 196 | |--------|------|---------| |
| 197 | | 绑定率 | platform 对象绑定 view 的比例 | ✓ | |
| 198 | | 映射覆盖率 | 属性映射完成的比例 | ✓ | |
| 199 | | blocked 项 | 绑定失败的项及原因 | ✓ | |
| 200 | |
| 201 | **binding 用例模板**: |
| 202 | |
| 203 | ```yaml |
| 204 | case_id: binding_rate_001 |
| 205 | title: 验证对象视图绑定率 |
| 206 | level: binding |
| 207 | target: all_platform_objects |
| 208 | steps: |
| 209 | - step: 统计 platform 对象总数 |
| 210 | action: count objects where 存储位置 == platform |
| 211 | - step: 统计已绑定对象数 |
| 212 | action: count objects where data_source.view_id != null |
| 213 | - step: 计算绑定率 |
| 214 | formula: bind_rate = bound_count / platform_count |
| 215 | expected_result: |
| 216 | - platform对象数: {N} |
| 217 | - 已绑定数: {M} |
| 218 | - 绑定率: {M/N}% |
| 219 | - 最低要求: >= 80%(若低于则需说明原因) |
| 220 | |
| 221 | --- |
| 222 | |
| 223 | case_id: binding_coverage_001 |
| 224 | title: 验证属性映射覆盖率 |
| 225 | level: binding |
| 226 | target: all_bound_objects |
| 227 | steps: |
| 228 | - step: 统计所有绑定对象的属性总数 |
| 229 | action: sum properties |