测试规划 Skill 1. 目标 识别测试项(ITEM)和测试点(POINT),生成结构化测试规划。 2. 输入输出 - 输入: 目录(主要读取 ) - 输出: 3. 核心原则 1. 场景优先:基于场景法识别测试点,而非等价类 2. 独立性:每个 POINT 是独立的操作路径 3. 完整性:覆盖所有业务模块和关键场景 4. 风险导向:评估风险等级,指导用例生成 4. 执行流程 4.1 层级定义 三层结构: ITEM(测试项) : - 业务模块或需求章节 - 示例:登录功能、订单管理、用户设置 POINT(测试点) : - 独立的操作路径(场景) - 示例:用户名密码登录、手机验证码登录、第三方登录 备注 : - 风险等级:Critical / High / Medium / Low - 测试关注点:边界值、异常情况、业务规则等 4.2 ITEM 识别 按以下方式划分: 方式1:按需求章节 - 需求文档有明确章节结构时使用 - 示例:第3章"用户管理" → ITEM "用户管理" 方式2:按业务实体 - 需求文档无明确章节时使用 - 示例:涉及订单的所有功能 → ITEM "订单管理" 方式3:按功能模块 - 跨章节的功能集合 - 示例:所有登录相关功能 → ITEM "登录功能" 4.3 POINT 识别 基于场景法识别独立操作路径: 判断标准 : - 是否是独立的用户操作流程?…

) # 一级标题\n ITEM_PATTERN = re.compile(r'^##\\s+(.+)

测试规划 Skill 1. 目标 识别测试项(ITEM)和测试点(POINT),生成结构化测试规划。 2. 输入输出 - 输入: 目录(主要读取 ) - 输出: 3. 核心原则 1. 场景优先:基于场景法识别测试点,而非等价类 2. 独立性:每个 POINT 是独立的操作路径 3. 完整性:覆盖所有业务模块和关键场景 4. 风险导向:评估风险等级,指导用例生成 4. 执行流程 4.1 层级定义 三层结构: ITEM(测试项) : - 业务模块或需求章节 - 示例:登录功能、订单管理、用户设置 POINT(测试点) : - 独立的操作路径(场景) - 示例:用户名密码登录、手机验证码登录、第三方登录 备注 : - 风险等级:Critical / High / Medium / Low - 测试关注点:边界值、异常情况、业务规则等 4.2 ITEM 识别 按以下方式划分: 方式1:按需求章节 - 需求文档有明确章节结构时使用 - 示例:第3章"用户管理" → ITEM "用户管理" 方式2:按业务实体 - 需求文档无明确章节时使用 - 示例:涉及订单的所有功能 → ITEM "订单管理" 方式3:按功能模块 - 跨章节的功能集合 - 示例:所有登录相关功能 → ITEM "登录功能" 4.3 POINT 识别 基于场景法识别独立操作路径: 判断标准 : - 是否是独立的用户操作流程?…

) # 二级标题 (ITEM)\n POINT_PATTERN = re.compile(r'^###\\s+(.+)

测试规划 Skill 1. 目标 识别测试项(ITEM)和测试点(POINT),生成结构化测试规划。 2. 输入输出 - 输入: 目录(主要读取 ) - 输出: 3. 核心原则 1. 场景优先:基于场景法识别测试点,而非等价类 2. 独立性:每个 POINT 是独立的操作路径 3. 完整性:覆盖所有业务模块和关键场景 4. 风险导向:评估风险等级,指导用例生成 4. 执行流程 4.1 层级定义 三层结构: ITEM(测试项) : - 业务模块或需求章节 - 示例:登录功能、订单管理、用户设置 POINT(测试点) : - 独立的操作路径(场景) - 示例:用户名密码登录、手机验证码登录、第三方登录 备注 : - 风险等级:Critical / High / Medium / Low - 测试关注点:边界值、异常情况、业务规则等 4.2 ITEM 识别 按以下方式划分: 方式1:按需求章节 - 需求文档有明确章节结构时使用 - 示例:第3章"用户管理" → ITEM "用户管理" 方式2:按业务实体 - 需求文档无明确章节时使用 - 示例:涉及订单的所有功能 → ITEM "订单管理" 方式3:按功能模块 - 跨章节的功能集合 - 示例:所有登录相关功能 → ITEM "登录功能" 4.3 POINT 识别 基于场景法识别独立操作路径: 判断标准 : - 是否是独立的用户操作流程?…

) # 三级标题 (POINT)\n RISK_LEVEL_PATTERN = re.compile(r'^>\\s*风险等级[::]\\s*(.+)

测试规划 Skill 1. 目标 识别测试项(ITEM)和测试点(POINT),生成结构化测试规划。 2. 输入输出 - 输入: 目录(主要读取 ) - 输出: 3. 核心原则 1. 场景优先:基于场景法识别测试点,而非等价类 2. 独立性:每个 POINT 是独立的操作路径 3. 完整性:覆盖所有业务模块和关键场景 4. 风险导向:评估风险等级,指导用例生成 4. 执行流程 4.1 层级定义 三层结构: ITEM(测试项) : - 业务模块或需求章节 - 示例:登录功能、订单管理、用户设置 POINT(测试点) : - 独立的操作路径(场景) - 示例:用户名密码登录、手机验证码登录、第三方登录 备注 : - 风险等级:Critical / High / Medium / Low - 测试关注点:边界值、异常情况、业务规则等 4.2 ITEM 识别 按以下方式划分: 方式1:按需求章节 - 需求文档有明确章节结构时使用 - 示例:第3章"用户管理" → ITEM "用户管理" 方式2:按业务实体 - 需求文档无明确章节时使用 - 示例:涉及订单的所有功能 → ITEM "订单管理" 方式3:按功能模块 - 跨章节的功能集合 - 示例:所有登录相关功能 → ITEM "登录功能" 4.3 POINT 识别 基于场景法识别独立操作路径: 判断标准 : - 是否是独立的用户操作流程?…

) # 风险等级\n TEST_FOCUS_PATTERN = re.compile(r'^>\\s*测试关注点[::]\\s*(.+)

测试规划 Skill 1. 目标 识别测试项(ITEM)和测试点(POINT),生成结构化测试规划。 2. 输入输出 - 输入: 目录(主要读取 ) - 输出: 3. 核心原则 1. 场景优先:基于场景法识别测试点,而非等价类 2. 独立性:每个 POINT 是独立的操作路径 3. 完整性:覆盖所有业务模块和关键场景 4. 风险导向:评估风险等级,指导用例生成 4. 执行流程 4.1 层级定义 三层结构: ITEM(测试项) : - 业务模块或需求章节 - 示例:登录功能、订单管理、用户设置 POINT(测试点) : - 独立的操作路径(场景) - 示例:用户名密码登录、手机验证码登录、第三方登录 备注 : - 风险等级:Critical / High / Medium / Low - 测试关注点:边界值、异常情况、业务规则等 4.2 ITEM 识别 按以下方式划分: 方式1:按需求章节 - 需求文档有明确章节结构时使用 - 示例:第3章"用户管理" → ITEM "用户管理" 方式2:按业务实体 - 需求文档无明确章节时使用 - 示例:涉及订单的所有功能 → ITEM "订单管理" 方式3:按功能模块 - 跨章节的功能集合 - 示例:所有登录相关功能 → ITEM "登录功能" 4.3 POINT 识别 基于场景法识别独立操作路径: 判断标准 : - 是否是独立的用户操作流程?…

) # 测试关注点\n\n def __init__(self, strict: bool = True):\n \"\"\"\n 初始化解析器\n\n Args:\n strict: 是否严格模式\n \"\"\"\n self.strict = strict\n self.errors: List[ParseError] = []\n\n def parse_file(self, file_path: Path) -> TestPlan:\n \"\"\"\n 解析测试规划文件\n\n Args:\n file_path: plan.md 文件路径\n\n Returns:\n TestPlan 对象\n \"\"\"\n if not file_path.exists():\n raise FileNotFoundError(f\"File not found: {file_path}\")\n\n with open(file_path, 'r', encoding='utf-8') as f:\n lines = f.readlines()\n\n return self._parse_lines(lines)\n\n def _parse_lines(self, lines: List[str]) -> TestPlan:\n \"\"\"\n 解析文件行\n\n Args:\n lines: 文件行列表\n\n Returns:\n TestPlan 对象\n \"\"\"\n plan = TestPlan()\n current_item: Optional[TestItem] = None\n current_point: Optional[TestPoint] = None\n has_title = False\n\n for line_num, line in enumerate(lines, start=1):\n line = line.rstrip()\n\n # 跳过空行\n if not line.strip():\n continue\n\n # 一级标题\n title_match = self.TITLE_PATTERN.match(line)\n if title_match and not line.startswith('##'):\n title = title_match.group(1).strip()\n if title == \"测试规划\":\n has_title = True\n continue\n\n # 二级标题 (ITEM)\n item_match = self.ITEM_PATTERN.match(line)\n if item_match and not line.startswith('###'):\n item_name = item_match.group(1).strip()\n\n # 保存上一个 ITEM\n if current_item:\n if current_point:\n current_item.points.append(current_point)\n current_point = None\n plan.items.append(current_item)\n\n # 创建新 ITEM\n current_item = TestItem(name=item_name, line_number=line_num)\n continue\n\n # 三级标题 (POINT)\n point_match = self.POINT_PATTERN.match(line)\n if point_match:\n point_name = point_match.group(1).strip()\n\n # 保存上一个 POINT\n if current_point and current_item:\n current_item.points.append(current_point)\n\n # 创建新 POINT\n current_point = TestPoint(name=point_name, line_number=line_num)\n continue\n\n # 风险等级\n risk_match = self.RISK_LEVEL_PATTERN.match(line)\n if risk_match and current_point:\n current_point.risk_level = risk_match.group(1).strip()\n continue\n\n # 测试关注点\n focus_match = self.TEST_FOCUS_PATTERN.match(line)\n if focus_match and current_point:\n current_point.test_focus = focus_match.group(1).strip()\n continue\n\n # 保存最后一个 ITEM 和 POINT\n if current_point and current_item:\n current_item.points.append(current_point)\n if current_item:\n plan.items.append(current_item)\n\n # 计算统计\n plan.total_items = len(plan.items)\n plan.total_points = sum(len(item.points) for item in plan.items)\n\n # 验证\n if not has_title:\n self._add_error(\"缺少一级标题 '# 测试规划'\", 1)\n\n if plan.total_items == 0:\n self._add_error(\"未找到任何测试项 (ITEM)\", 0)\n\n if plan.total_points == 0:\n self._add_error(\"未找到任何测试点 (POINT)\", 0)\n\n return plan\n\n def validate(self, plan: TestPlan) -> Tuple[bool, List[str]]:\n \"\"\"\n 验证测试规划\n\n Args:\n plan: TestPlan 对象\n\n Returns:\n (is_valid, error_messages)\n \"\"\"\n errors = []\n\n # 检查 ITEM 数量\n if plan.total_items == 0:\n errors.append(\"❌ 未找到任何测试项 (ITEM)\")\n\n # 检查 POINT 数量\n if plan.total_points == 0:\n errors.append(\"❌ 未找到任何测试点 (POINT)\")\n\n # 检查每个 ITEM\n for item in plan.items:\n # ITEM 名称长度\n if len(item.name) \u003c 2:\n errors.append(f\"❌ ITEM '{item.name}' 名称过短 (Line {item.line_number})\")\n elif len(item.name) > 20:\n errors.append(f\"⚠️ ITEM '{item.name}' 名称过长 (Line {item.line_number})\")\n\n # POINT 数量\n if len(item.points) == 0:\n errors.append(f\"❌ ITEM '{item.name}' 没有测试点 (Line {item.line_number})\")\n\n # 检查每个 POINT\n for point in item.points:\n # POINT 名称长度\n if len(point.name) \u003c 4:\n errors.append(f\"❌ POINT '{point.name}' 名称过短 (Line {point.line_number})\")\n elif len(point.name) > 30:\n errors.append(f\"⚠️ POINT '{point.name}' 名称过长 (Line {point.line_number})\")\n\n # 如果有严重错误(❌),返回 False\n is_valid = not any(err.startswith(\"❌\") for err in errors)\n\n return is_valid, errors\n\n def generate_directory_structure(self, plan: TestPlan) -> Dict[str, List[str]]:\n \"\"\"\n 生成目录结构映射\n\n Args:\n plan: TestPlan 对象\n\n Returns:\n {item_name: [point_name1, point_name2, ...]}\n \"\"\"\n structure = {}\n for item in plan.items:\n structure[item.name] = [point.name for point in item.points]\n return structure\n\n def print_summary(self, plan: TestPlan):\n \"\"\"打印测试规划摘要\"\"\"\n print(\"\\n\" + \"=\"*60)\n print(\"测试规划摘要\")\n print(\"=\"*60)\n print(f\"\\n📊 统计:\")\n print(f\" - 测试项 (ITEM): {plan.total_items} 个\")\n print(f\" - 测试点 (POINT): {plan.total_points} 个\")\n\n print(f\"\\n📋 测试项列表:\")\n for i, item in enumerate(plan.items, 1):\n print(f\"\\n {i}. {item.name} ({len(item.points)} 个测试点)\")\n for j, point in enumerate(item.points, 1):\n risk = f\" [{point.risk_level}]\" if point.risk_level else \"\"\n focus = f\"\\n → {point.test_focus}\" if point.test_focus else \"\"\n print(f\" {j}. {point.name}{risk}{focus}\")\n\n def _add_error(self, message: str, line_number: int):\n \"\"\"添加错误\"\"\"\n error = ParseError(message, line_number)\n self.errors.append(error)\n if self.strict:\n raise error\n\n\ndef main():\n \"\"\"命令行入口\"\"\"\n import argparse\n\n parser = argparse.ArgumentParser(\n description=\"解析和验证测试规划文件 (plan.md)\",\n formatter_class=argparse.RawDescriptionHelpFormatter,\n epilog=\"\"\"\n示例:\n # 解析并验证\n python parse_plan.py test-case/plan.md\n\n # 显示详细摘要\n python parse_plan.py test-case/plan.md --verbose\n\n # 生成目录结构 JSON\n python parse_plan.py test-case/plan.md --json\n \"\"\"\n )\n\n parser.add_argument(\"file\", type=Path, help=\"plan.md 文件路径\")\n parser.add_argument(\"-v\", \"--verbose\", action=\"store_true\", help=\"显示详细信息\")\n parser.add_argument(\"--json\", action=\"store_true\", help=\"输出 JSON 格式\")\n parser.add_argument(\"--no-strict\", action=\"store_true\", help=\"非严格模式\")\n\n args = parser.parse_args()\n\n # 解析\n parser_obj = PlanParser(strict=not args.no_strict)\n\n try:\n plan = parser_obj.parse_file(args.file)\n except ParseError as e:\n print(f\"❌ 解析失败: {e}\", file=sys.stderr)\n sys.exit(1)\n except FileNotFoundError as e:\n print(f\"❌ 文件不存在: {e}\", file=sys.stderr)\n sys.exit(1)\n\n # 验证\n is_valid, errors = parser_obj.validate(plan)\n\n if args.json:\n # JSON 输出\n import json\n structure = parser_obj.generate_directory_structure(plan)\n output = {\n \"total_items\": plan.total_items,\n \"total_points\": plan.total_points,\n \"structure\": structure,\n \"is_valid\": is_valid,\n \"errors\": errors\n }\n print(json.dumps(output, ensure_ascii=False, indent=2))\n else:\n # 文本输出\n if args.verbose:\n parser_obj.print_summary(plan)\n\n # 验证结果\n if errors:\n print(\"\\n\" + \"=\"*60)\n print(\"验证结果\")\n print(\"=\"*60)\n for error in errors:\n print(f\" {error}\")\n\n # 最终状态\n print(\"\\n\" + \"=\"*60)\n if is_valid:\n print(\"✅ 测试规划格式正确\")\n else:\n print(\"❌ 测试规划存在严重错误\")\n print(\"=\"*60 + \"\\n\")\n\n sys.exit(0 if is_valid else 1)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":11105,"content_sha256":"d4dc227816327ae25aa26780d92179d24436beaf9298f57470a7201afe66a0c0"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"测试规划 Skill","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"1. 目标","type":"text"}]},{"type":"paragraph","content":[{"text":"识别测试项(ITEM)和测试点(POINT),生成结构化测试规划。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"2. 输入输出","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"输入:","type":"text"},{"text":"clarified-requirements/","type":"text","marks":[{"type":"code_inline"}]},{"text":" 目录(主要读取 ","type":"text"},{"text":"index.md","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"输出:","type":"text"},{"text":"test-case/plan.md","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"3. 核心原则","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"场景优先:基于场景法识别测试点,而非等价类","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"独立性:每个 POINT 是独立的操作路径","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"完整性:覆盖所有业务模块和关键场景","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"风险导向:评估风险等级,指导用例生成","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"4. 执行流程","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4.1 层级定义","type":"text"}]},{"type":"paragraph","content":[{"text":"三层结构:","type":"text"}]},{"type":"paragraph","content":[{"text":"ITEM(测试项)","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"业务模块或需求章节","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"示例:登录功能、订单管理、用户设置","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"POINT(测试点)","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"独立的操作路径(场景)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"示例:用户名密码登录、手机验证码登录、第三方登录","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"备注","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"风险等级:Critical / High / Medium / Low","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"测试关注点:边界值、异常情况、业务规则等","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4.2 ITEM 识别","type":"text"}]},{"type":"paragraph","content":[{"text":"按以下方式划分:","type":"text"}]},{"type":"paragraph","content":[{"text":"方式1:按需求章节","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"需求文档有明确章节结构时使用","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"示例:第3章\"用户管理\" → ITEM \"用户管理\"","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"方式2:按业务实体","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"需求文档无明确章节时使用","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"示例:涉及订单的所有功能 → ITEM \"订单管理\"","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"方式3:按功能模块","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"跨章节的功能集合","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"示例:所有登录相关功能 → ITEM \"登录功能\"","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4.3 POINT 识别","type":"text"}]},{"type":"paragraph","content":[{"text":"基于场景法识别独立操作路径:","type":"text"}]},{"type":"paragraph","content":[{"text":"判断标准","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"是否是独立的用户操作流程?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"是否有不同的前置条件或触发条件?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"是否有不同的业务规则?","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"正确示例","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"用户名密码登录\"、\"手机验证码登录\"、\"第三方登录\" → 3 个 POINT(不同操作路径)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"错误示例","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"密码长度 \u003c8\"、\"密码长度 8-20\"、\"密码长度 >20\" → 不是 3 个 POINT(同一场景的不同数据)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"正确做法:合并为 1 个 POINT \"用户名密码登录\",在用例生成时覆盖密码长度的等价类","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4.4 风险等级评估","type":"text"}]},{"type":"paragraph","content":[{"text":"4 个等级:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Critical","type":"text","marks":[{"type":"strong"}]},{"text":":核心业务流程,影响系统可用性","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"High","type":"text","marks":[{"type":"strong"}]},{"text":":重要功能,影响用户体验","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Medium","type":"text","marks":[{"type":"strong"}]},{"text":":辅助功能,影响局部功能","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Low","type":"text","marks":[{"type":"strong"}]},{"text":":边缘功能,影响较小","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4.5 测试关注点提炼","type":"text"}]},{"type":"paragraph","content":[{"text":"从以下维度提炼:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"边界值:长度、数量、时间等限制","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"异常情况:失败、超时、冲突等","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"业务规则:权限、状态、约束等","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"数据约束:格式、范围、依赖等","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4.6 输出格式","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"# 测试规划\n\n## ITEM 名称\n\n### POINT 名称\n> 风险等级: Critical/High/Medium/Low\n> 测试关注点: 具体关注点1、具体关注点2\n\n### POINT 名称\n> 风险等级: Critical/High/Medium/Low\n> 测试关注点: 具体关注点1、具体关注点2","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"5. 示例","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"示例1:正确的 ITEM/POINT 划分","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"# 测试规划\n\n## 登录功能\n\n### 用户名密码登录\n> 风险等级: Critical\n> 测试关注点: 密码错误次数限制(5次)、账户锁定(30分钟)、密码长度边界(8-20位)\n\n### 手机验证码登录\n> 风险等级: High\n> 测试关注点: 验证码过期(60s)、错误次数限制(5次)、手机号格式验证\n\n### 第三方登录(微信/支付宝)\n> 风险等级: Medium\n> 测试关注点: 授权失败处理、token过期处理、首次登录绑定流程","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"示例2:错误的 POINT 划分","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"## 登录功能\n\n### 密码长度小于8位\n> 风险等级: High\n> 测试关注点: 提示\"密码长度不足\"\n\n### 密码长度8-20位\n> 风险等级: High\n> 测试关注点: 登录成功\n\n### 密码长度大于20位\n> 风险等级: High\n> 测试关注点: 提示\"密码长度超限\"","type":"text"}]},{"type":"paragraph","content":[{"text":"为什么错误","type":"text","marks":[{"type":"strong"}]},{"text":":这3个不是独立场景,而是同一场景(用户名密码登录)的不同数据。应该合并为1个 POINT \"用户名密码登录\",在用例生成时覆盖密码长度的等价类。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"6. 检查清单","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"所有业务模块都已识别为 ITEM","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"所有独立操作路径都已识别为 POINT","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"没有将等价类误识别为 POINT","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"每个 POINT 都有风险等级","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"每个 POINT 都有测试关注点","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"风险等级评估合理","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"测试关注点具体明确(有数值、有条件)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"格式符合规范(## ITEM、### POINT、> 备注)","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"testcase-planner","author":"@skillopedia","source":{"stars":10,"repo_name":"twu","origin_url":"https://github.com/chyax98/twu/blob/HEAD/.claude/skills/testcase-planner/SKILL.md","repo_owner":"chyax98","body_sha256":"b6b3b11776a4eccc0137dff8278b15277146e67f819ebf3a96116538b8f3fbb1","cluster_key":"28b9a77f6c0a2f8366aff06e168e87bdfce4c44a852d2485e961af08d7e813a3","clean_bundle":{"format":"clean-skill-bundle-v1","source":"chyax98/twu/.claude/skills/testcase-planner/SKILL.md","attachments":[{"id":"41683047-7b5b-576a-8ccd-046195c33ee3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/41683047-7b5b-576a-8ccd-046195c33ee3/attachment.py","path":"scripts/parse_plan.py","size":11105,"sha256":"d4dc227816327ae25aa26780d92179d24436beaf9298f57470a7201afe66a0c0","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"1150b407ebdac40f5a5f8c8fff0fae5f49dfc2081bd35d209ddeb42aa576d894","attachment_count":1,"text_attachments":1,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":".claude/skills/testcase-planner/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"testing-qa","category_label":"Testing"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"testing-qa","import_tag":"clean-skills-v1","description":"测试规划器 - 基于软件测试理论(场景法、等价类划分、边界值分析)将完备需求拆解为结构化的测试规划,输出测试项(ITEM)和测试点(POINT)。当用户执行 /testcase-plan 命令或需要生成测试规划时使用。","allowed-tools":"Read, Write, Bash"}},"renderedAt":1782986766926}

测试规划 Skill 1. 目标 识别测试项(ITEM)和测试点(POINT),生成结构化测试规划。 2. 输入输出 - 输入: 目录(主要读取 ) - 输出: 3. 核心原则 1. 场景优先:基于场景法识别测试点,而非等价类 2. 独立性:每个 POINT 是独立的操作路径 3. 完整性:覆盖所有业务模块和关键场景 4. 风险导向:评估风险等级,指导用例生成 4. 执行流程 4.1 层级定义 三层结构: ITEM(测试项) : - 业务模块或需求章节 - 示例:登录功能、订单管理、用户设置 POINT(测试点) : - 独立的操作路径(场景) - 示例:用户名密码登录、手机验证码登录、第三方登录 备注 : - 风险等级:Critical / High / Medium / Low - 测试关注点:边界值、异常情况、业务规则等 4.2 ITEM 识别 按以下方式划分: 方式1:按需求章节 - 需求文档有明确章节结构时使用 - 示例:第3章"用户管理" → ITEM "用户管理" 方式2:按业务实体 - 需求文档无明确章节时使用 - 示例:涉及订单的所有功能 → ITEM "订单管理" 方式3:按功能模块 - 跨章节的功能集合 - 示例:所有登录相关功能 → ITEM "登录功能" 4.3 POINT 识别 基于场景法识别独立操作路径: 判断标准 : - 是否是独立的用户操作流程?…