From b72406df99b30fd423bf88a352a58f95cbe6b351 Mon Sep 17 00:00:00 2001 From: gongwenxin Date: Thu, 5 Jun 2025 18:29:04 +0800 Subject: [PATCH] fix:stage_group --- .../keyword_driven_crud_stage.cpython-312.pyc | Bin 20745 -> 30011 bytes custom_stages/keyword_driven_crud_stage.py | 649 ++- .../scenario_framework.cpython-312.pyc | Bin 16595 -> 16595 bytes .../scenario_registry.cpython-312.pyc | Bin 7387 -> 7387 bytes .../stage_framework.cpython-312.pyc | Bin 30767 -> 44570 bytes .../stage_registry.cpython-312.pyc | Bin 10272 -> 7676 bytes .../test_orchestrator.cpython-312.pyc | Bin 155877 -> 156676 bytes ddms_compliance_suite/scenario_framework.py | 228 - ddms_compliance_suite/scenario_registry.py | 90 - ddms_compliance_suite/stage_framework.py | 445 +- ddms_compliance_suite/stage_registry.py | 145 +- ddms_compliance_suite/test_orchestrator.py | 1027 ++-- log_stage.txt | 5175 +++++++++-------- test_reports/api_call_details.md | 2122 +++---- test_reports/summary.json | 657 +-- 15 files changed, 5303 insertions(+), 5235 deletions(-) delete mode 100644 ddms_compliance_suite/scenario_framework.py delete mode 100644 ddms_compliance_suite/scenario_registry.py diff --git a/custom_stages/__pycache__/keyword_driven_crud_stage.cpython-312.pyc b/custom_stages/__pycache__/keyword_driven_crud_stage.cpython-312.pyc index 22631093ba472629eb84c216e7bdfb94118016ae..5a97ff610f613aed4e9805a64eb6b18db0ce7ed4 100644 GIT binary patch literal 30011 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 ValidationResult: - """ - (通用版) 在列表响应中通过唯一名称查找新创建的资源, - 验证其存在,并将其唯一标识符(例如 'id', 'dsid', 'uuid')提取到阶段上下文中。 +# --- Helper to navigate JSON path --- +def _get_value_by_path(data: Optional[Dict[str, Any]], path_str: Optional[str]): + if data is None or path_str is None or not path_str: + return data - 需要用户在 'outputs_to_context' 中配置如何从响应中提取这个 'id'。 - 此函数主要用于验证是否能找到特定名称的条目。 - 实际的ID提取最好通过 StageStepDefinition 的 'outputs_to_context' 来完成,因为它更灵活。 - - 此函数假设: - 1. 'unique_resource_name' 在 stage_ctx 中。 - 2. 响应体中有一个列表,其路径是 'data.list' (这可能需要修改!)。 - 3. 列表中的每个条目是一个字典,并且包含一个 'name_field_in_list' 指定的字段用于匹配名称 (需要用户配置或硬编码修改)。 - 4. 找到的条目包含一个 'id_field_in_list' 指定的字段作为其唯一ID (需要用户配置或硬编码修改)。 - """ - logger = logging.getLogger(__name__) - unique_name_to_find = stage_ctx.get("unique_resource_name") - if not unique_name_to_find: - return ValidationResult(passed=False, message="上下文中未找到 'unique_resource_name'。无法查找已创建的资源。") - - # 【【【请用户根据实际API修改下面的JSON路径和字段名】】】 - LIST_PATH_IN_RESPONSE = "data.list" # 例如: "items", "data", "result.records" - NAME_FIELD_IN_LIST_ITEM = "wellCommonName" # 例如: "name", "title", "username" - ID_FIELD_IN_LIST_ITEM = "dsid" # 例如: "id", "uuid", "_id" - # 【【【修改结束】】】 - - response_data = response_ctx.json_content - - # Helper to navigate path - def _get_value_by_path(data, path_str): - current = data + current = data + try: for part in path_str.split('.'): - if isinstance(current, dict) and part in current: + match_list_index = re.fullmatch(r"([a-zA-Z_][a-zA-Z0-9_]*)\[(\d+)\]", part) + if match_list_index: + list_name, index_str = match_list_index.groups() + index = int(index_str) + if isinstance(current, dict) and list_name in current and isinstance(current[list_name], list) and 0 <= index < len(current[list_name]): + current = current[list_name][index] + else: return None + elif isinstance(current, list) and part.isdigit(): + idx = int(part) + if 0 <= idx < len(current): + current = current[idx] + else: + return None + elif isinstance(current, dict) and part in current: current = current[part] - elif isinstance(current, list) and part.isdigit() and 0 <= int(part) < len(current): - current = current[int(part)] else: return None - return current + except (TypeError, ValueError, IndexError, KeyError) as e: + logging.getLogger(__name__).debug(f"Error navigating path '{path_str}': {e}") + return None + return current - resource_list = _get_value_by_path(response_data, LIST_PATH_IN_RESPONSE) +# --- Custom Assertion Helper Functions & Context Manipulators --- +# These functions now read field names and paths from stage_ctx, +# which should be populated by the Stage based on its configuration. + +def find_resource_in_list_and_extract_id(response_ctx: APIResponseContext, stage_ctx: dict) -> ValidationResult: + logger = logging.getLogger(__name__) + unique_name_to_find = stage_ctx.get("unique_resource_name") + + list_path = stage_ctx.get("cfg_list_path_in_listresponse", "data.list") + name_field = stage_ctx.get("cfg_name_field_in_listitem", "name") + id_field = stage_ctx.get("cfg_id_field_in_listitem", "id") + + if not unique_name_to_find: + return ValidationResult(passed=False, message="Context error: 'unique_resource_name' not found in stage_context.") + + response_data = response_ctx.json_content + resource_list = _get_value_by_path(response_data, list_path) if not isinstance(resource_list, list): - return ValidationResult(passed=False, message=f"响应格式错误:期望路径 '{LIST_PATH_IN_RESPONSE}' 返回一个列表,实际得到 {type(resource_list)}。") + return ValidationResult(passed=False, message=f"Response format error: Expected path '{list_path}' to be a list, got {type(resource_list)}.") found_item = None for item in resource_list: - if isinstance(item, dict) and item.get(NAME_FIELD_IN_LIST_ITEM) == unique_name_to_find: + if isinstance(item, dict) and item.get(name_field) == unique_name_to_find: found_item = item break if not found_item: - return ValidationResult(passed=False, message=f"在列表响应中未找到名称为 '{unique_name_to_find}' (字段: {NAME_FIELD_IN_LIST_ITEM}) 的资源。") + return ValidationResult(passed=False, message=f"Resource not found: Name '{unique_name_to_find}' (field: {name_field}) not found in list at path '{list_path}'.") - resource_id = found_item.get(ID_FIELD_IN_LIST_ITEM) - if not resource_id: - return ValidationResult(passed=False, message=f"找到名称为 '{unique_name_to_find}' 的资源,但它缺少ID字段 '{ID_FIELD_IN_LIST_ITEM}'。") + resource_id = found_item.get(id_field) + if resource_id is None: + return ValidationResult(passed=False, message=f"Resource found by name, but it lacks the ID field '{id_field}'.") - # 将找到的ID存入上下文,变量名可由outputs_to_context覆盖 stage_ctx["created_resource_id"] = resource_id - logger.info(f"成功在列表中找到资源 '{unique_name_to_find}' 并提取其ID ({ID_FIELD_IN_LIST_ITEM}): {resource_id}。") - return ValidationResult(passed=True, message=f"找到资源 '{unique_name_to_find}' 并提取ID: {resource_id}。建议使用 outputs_to_context 获取ID。") + logger.info(f"Successfully found resource '{unique_name_to_find}' in list and extracted its ID ({id_field}): {resource_id}.") + return ValidationResult(passed=True, message=f"Found resource '{unique_name_to_find}' by name (field '{name_field}'). ID ('{id_field}': {resource_id}) available in context. Prefer 'outputs_to_context' for extraction.") def check_resource_details(response_ctx: APIResponseContext, stage_ctx: dict) -> ValidationResult: - """ - (通用版) 验证获取到的资源详情。 - 假设 'created_resource_id' 和 'unique_resource_name' 在 stage_ctx 中。 - 假设响应直接就是资源对象,或者在 'data.list[0]' 或 'data' 中 (需要用户调整)。 - """ - # 【【【请用户根据实际API修改下面的JSON路径和字段名】】】 - # 响应中资源对象的位置。留空表示响应体本身就是资源对象。 - # 例如:"data.list[0]" (如果详情接口返回带列表的结构), "data" (如果返回带data包装的结构) - RESOURCE_OBJECT_PATH_IN_RESPONSE = "data.list[0]" - NAME_FIELD_IN_DETAIL = "wellCommonName" - ID_FIELD_IN_DETAIL = "dsid" - # 【【【修改结束】】】 + resource_object_path = stage_ctx.get("cfg_resource_object_path_in_detailresponse", "") + name_field = stage_ctx.get("cfg_name_field_in_detailresponse", "name") + id_field = stage_ctx.get("cfg_id_field_in_detailresponse", "id") + feature_field_name = stage_ctx.get("cfg_feature_field_name_for_validation") + expected_feature_value = stage_ctx.get("unique_feature_value") created_id = stage_ctx.get("created_resource_id") initial_name = stage_ctx.get("unique_resource_name") - response_data = response_ctx.json_content - - def _get_value_by_path(data, path_str): # Duplicated helper for clarity, could be refactored - if not path_str: return data # No path, return whole data - current = data - for part in path_str.split('.'): - # Basic list index handling like "list[0]" - match_list_index = re.fullmatch(r"([a-zA-Z_][a-zA-Z0-9_]*)\[(\d+)\]", part) - if match_list_index: - list_name, index_str = match_list_index.groups() - index = int(index_str) - if isinstance(current, dict) and list_name in current and isinstance(current[list_name], list) and 0 <= index < len(current[list_name]): - current = current[list_name][index] - else: return None - elif isinstance(current, dict) and part in current: - current = current[part] - else: return None - return current - - resource_data = _get_value_by_path(response_data, RESOURCE_OBJECT_PATH_IN_RESPONSE) + resource_data = _get_value_by_path(response_ctx.json_content, resource_object_path) if not isinstance(resource_data, dict): - return ValidationResult(passed=False, message=f"响应格式错误:期望路径 '{RESOURCE_OBJECT_PATH_IN_RESPONSE}' 返回一个对象,实际得到 {type(resource_data)}。") + return ValidationResult(passed=False, message=f"Response format error: Expected path '{resource_object_path}' to be an object, got {type(resource_data)}.") - if resource_data.get(ID_FIELD_IN_DETAIL) != created_id: - return ValidationResult(passed=False, message=f"ID不匹配。期望 {created_id}, 得到 {resource_data.get(ID_FIELD_IN_DETAIL)} (字段: {ID_FIELD_IN_DETAIL})。") - if NAME_FIELD_IN_DETAIL and resource_data.get(NAME_FIELD_IN_DETAIL) != initial_name: # Name check is optional - return ValidationResult(passed=False, message=f"名称不匹配。期望 '{initial_name}', 得到 '{resource_data.get(NAME_FIELD_IN_DETAIL)}' (字段: {NAME_FIELD_IN_DETAIL})。") + validation_results = [] + if resource_data.get(id_field) != created_id: + validation_results.append(ValidationResult(passed=False, message=f"ID mismatch. Expected '{created_id}', got '{resource_data.get(id_field)}' (field: {id_field}).")) + else: + validation_results.append(ValidationResult(passed=True, message=f"ID match: '{created_id}' (field: {id_field}).")) + + if name_field and resource_data.get(name_field) != initial_name: + validation_results.append(ValidationResult(passed=False, message=f"Name mismatch. Expected '{initial_name}', got '{resource_data.get(name_field)}' (field: {name_field}).")) + elif name_field: + validation_results.append(ValidationResult(passed=True, message=f"Name match: '{initial_name}' (field: {name_field}).")) + + if feature_field_name and expected_feature_value is not None: + actual_feature_value = resource_data.get(feature_field_name) + if actual_feature_value != expected_feature_value: + validation_results.append(ValidationResult(passed=False, message=f"Feature field '{feature_field_name}' mismatch. Expected '{expected_feature_value}', got '{actual_feature_value}'.")) + else: + validation_results.append(ValidationResult(passed=True, message=f"Feature field '{feature_field_name}' match: '{expected_feature_value}'.")) - return ValidationResult(passed=True, message=f"资源详情 (ID: {created_id}) 校验成功。") + overall_passed = all(vr.passed for vr in validation_results) + combined_message = "Resource details check: " + "; ".join([vr.message for vr in validation_results]) + return ValidationResult(passed=overall_passed, message=combined_message, details=[vr.to_dict() for vr in validation_results]) def check_resource_updated_details(response_ctx: APIResponseContext, stage_ctx: dict) -> ValidationResult: - """ - (通用版) 验证更新后的资源详情。 - 假设 'created_resource_id' 和 'updated_resource_name' 在 stage_ctx 中。 - """ - # 【【【请用户根据实际API修改下面的JSON路径和字段名】】】 - RESOURCE_OBJECT_PATH_IN_RESPONSE = "data.list[0]" - NAME_FIELD_IN_DETAIL = "wellCommonName" - ID_FIELD_IN_DETAIL = "dsid" - # 【【【修改结束】】】 + resource_object_path = stage_ctx.get("cfg_resource_object_path_in_updateresponse", stage_ctx.get("cfg_resource_object_path_in_detailresponse", "")) + name_field = stage_ctx.get("cfg_name_field_in_detailresponse", "name") + id_field = stage_ctx.get("cfg_id_field_in_detailresponse", "id") + feature_field_name = stage_ctx.get("cfg_feature_field_name_for_validation") + expected_updated_feature_value = stage_ctx.get("updated_feature_value") created_id = stage_ctx.get("created_resource_id") updated_name = stage_ctx.get("updated_resource_name") - # (Code is very similar to check_resource_details, could be refactored if desired) - response_data = response_ctx.json_content - def _get_value_by_path(data, path_str): - if not path_str: return data - current = data - for part in path_str.split('.'): - match_list_index = re.fullmatch(r"([a-zA-Z_][a-zA-Z0-9_]*)\[(\d+)\]", part) - if match_list_index: - list_name, index_str = match_list_index.groups() - index = int(index_str) - if isinstance(current, dict) and list_name in current and isinstance(current[list_name], list) and 0 <= index < len(current[list_name]): - current = current[list_name][index] - else: return None - elif isinstance(current, dict) and part in current: - current = current[part] - else: return None - return current - resource_data = _get_value_by_path(response_data, RESOURCE_OBJECT_PATH_IN_RESPONSE) + resource_data = _get_value_by_path(response_ctx.json_content, resource_object_path) if not isinstance(resource_data, dict): - return ValidationResult(passed=False, message=f"更新后详情响应格式错误:期望路径 '{RESOURCE_OBJECT_PATH_IN_RESPONSE}' 返回一个对象,实际得到 {type(resource_data)}。") + return ValidationResult(passed=False, message=f"Updated detail response format error: Expected path '{resource_object_path}' to be an object, got {type(resource_data)}.") - if resource_data.get(ID_FIELD_IN_DETAIL) != created_id: - return ValidationResult(passed=False, message=f"更新后ID不匹配。期望 {created_id}, 得到 {resource_data.get(ID_FIELD_IN_DETAIL)}。") - if NAME_FIELD_IN_DETAIL and resource_data.get(NAME_FIELD_IN_DETAIL) != updated_name: - return ValidationResult(passed=False, message=f"更新后名称不匹配。期望 '{updated_name}', 得到 '{resource_data.get(NAME_FIELD_IN_DETAIL)}'。") - - return ValidationResult(passed=True, message=f"更新后资源详情 (ID: {created_id}) 校验成功,名称为 '{updated_name}'。") + validation_results = [] + if resource_data.get(id_field) != created_id: + validation_results.append(ValidationResult(passed=False, message=f"Updated ID mismatch. Expected '{created_id}', got '{resource_data.get(id_field)}'.")) + else: + validation_results.append(ValidationResult(passed=True, message=f"Updated ID match: '{created_id}'.")) + + if name_field and resource_data.get(name_field) != updated_name: + validation_results.append(ValidationResult(passed=False, message=f"Updated name mismatch. Expected '{updated_name}', got '{resource_data.get(name_field)}'.")) + elif name_field: + validation_results.append(ValidationResult(passed=True, message=f"Updated name match: '{updated_name}'.")) + + if feature_field_name and expected_updated_feature_value is not None: + actual_feature_value = resource_data.get(feature_field_name) + if actual_feature_value != expected_updated_feature_value: + validation_results.append(ValidationResult(passed=False, message=f"Updated feature field '{feature_field_name}' mismatch. Expected '{expected_updated_feature_value}', got '{actual_feature_value}'.")) + else: + validation_results.append(ValidationResult(passed=True, message=f"Updated feature field '{feature_field_name}' match: '{expected_updated_feature_value}'.")) + + overall_passed = all(vr.passed for vr in validation_results) + combined_message = "Updated resource details check: " + "; ".join([vr.message for vr in validation_results]) + return ValidationResult(passed=overall_passed, message=combined_message, details=[vr.to_dict() for vr in validation_results]) -class KeywordDrivenCRUDStage(BaseAPIStage): - id = "keyword_driven_crud_example" - name = "Keyword-Driven Generic CRUD Stage Example" +class GenericCRUDValidationStage(BaseAPIStage): + id = "generic_crud_validation_stage" + name = "Generic CRUD Validation Stage" description = ( - "Demonstrates a CRUD (Create, List, Read, Update, Delete) flow. " - "This stage dynamically finds API operations based on a configurable RESOURCE_KEYWORD " - "and predefined action keywords (e.g., '添加', '查询列表'). " - "IMPORTANT: User MUST configure RESOURCE_KEYWORD at the top of this file. " - "Request bodies, response paths in assertions, and 'outputs_to_context' " - "are EXAMPLES based on '井筒API示例_simple.json' and WILL LIKELY NEED MODIFICATION " - "to match your specific API's structure." + "Performs a generic CRUD (Create, List, Read, Update, Delete) flow. " + "It tries to dynamically discover API operations based on common keywords and HTTP methods. " + "Field names for IDs, names, features, and JSON paths for list/detail objects are configurable " + "via class attributes or can be set in `before_stage` based on `api_group_name`." ) - tags = ["crud", "keyword_driven", "example"] - continue_on_failure = False # Set to True if you want to attempt all steps even if one fails + tags = ["crud", "generic_validation"] + continue_on_failure = False + fail_if_not_applicable_to_any_group = False - # This will be populated by is_applicable_to_api_group - discovered_op_keys: dict = {} - # This will be populated in before_stage + # --- Configurable field names and JSON paths --- + cfg_id_field_in_create_response: str = "data.0.dsid" + cfg_name_field_in_create_payload: str = "wellCommonName" + cfg_feature_field_in_create_payload: str = "dataRegion" + + cfg_list_path_in_list_response: str = "data.list" + cfg_id_field_in_list_item: str = "dsid" + cfg_name_field_in_list_item: str = "wellCommonName" + cfg_feature_field_in_list_item: str = "dataRegion" + + cfg_resource_object_path_in_detail_response: str = "data.list.0" + cfg_id_field_in_detail_response: str = "dsid" + cfg_name_field_in_detail_response: str = "wellCommonName" + cfg_feature_field_in_detail_response: str = "dataRegion" + + cfg_resource_object_path_in_update_response: str = "data.list.0" + + cfg_path_param_name_for_id: str = "id" + + discovered_op_keys: Dict[str, Optional[str]] = {} steps: list = [] - def _find_operation_title_or_id(self, endpoints: list, resource_kw: str, action_kws: list, http_method: str | None = None) -> str | None: - """Tries to find an endpoint by matching keywords in its title and optionally method.""" - self.logger.debug(f"Searching for op with resource='{resource_kw}', actions='{action_kws}', method='{http_method}'") - for ep_obj in endpoints: # ep_obj is YAPIEndpoint or SwaggerEndpoint - # YAPI uses 'title', Swagger often uses 'summary' or 'operationId' - # We prioritize 'title' (from YAPI) then 'summary', then 'operationId' as lookup keys - title_to_check = getattr(ep_obj, 'title', None) - summary_to_check = getattr(ep_obj, 'summary', None) - op_id_to_check = getattr(ep_obj, 'operation_id', None) + def _determine_resource_config(self, api_group_name: Optional[str], global_api_spec: ParsedAPISpec): + self.logger.info(f"Using default field/path configurations for group '{api_group_name}'. Customize by overriding _determine_resource_config or cfg_* attributes.") + pass + + + def _find_operation_best_match(self, endpoints: List[Union[YAPIEndpoint, SwaggerEndpoint]], + action_kws: List[str], + target_method: Optional[str] = None, + path_must_contain_id: bool = False, + path_must_not_contain_id: bool = False) -> Optional[str]: + self.logger.debug(f"Attempting to find operation: target_actions='{action_kws}', target_method='{target_method}', path_id_required={path_must_contain_id}, path_id_forbidden={path_must_not_contain_id}") + + best_candidate_key: Optional[str] = None + + for ep_obj in endpoints: + ep_title = getattr(ep_obj, 'title', 'N/A') + ep_method_actual = getattr(ep_obj, 'method', 'N/A').upper() + ep_path = getattr(ep_obj, 'path', 'N/A') + self.logger.debug(f" Checking endpoint: Title='{ep_title}', Method='{ep_method_actual}', Path='{ep_path}', Type='{type(ep_obj).__name__}'") + # Log all attributes of the endpoint object to see what the parser provided + if isinstance(ep_obj, YAPIEndpoint): + self.logger.debug(f" Raw YAPIEndpoint object attributes for '{ep_title}': {vars(ep_obj)}") + + text_to_match = getattr(ep_obj, 'title', None) or \ + getattr(ep_obj, 'summary', None) or \ + getattr(ep_obj, 'operation_id', None) - # Determine primary text for keyword matching - text_for_matching = title_to_check or summary_to_check or op_id_to_check - if not text_for_matching: + if not text_to_match: + self.logger.debug(f" Skipping endpoint Title='{ep_title}', Path='{ep_path}': No text_to_match (title/summary/opId).") continue - # The key we will use to lookup the endpoint later in the orchestrator - # The orchestrator uses 'title' for YAPI and 'operationId' or (method+path) for Swagger - # For simplicity in this dynamic stage, we will try to return YAPI's 'title' if available and it matches, - # otherwise 'operationId' if available and it matches. - # If using Swagger and 'operationId' is preferred, adjust logic or ensure operationIds are descriptive. - - lookup_key_to_return = title_to_check # Default to title (YAPI primary) + lookup_key = getattr(ep_obj, 'title', None) or \ + getattr(ep_obj, 'operation_id', None) or \ + f"{ep_method_actual} {ep_path}" - text_lower = text_for_matching.lower() - resource_kw_lower = resource_kw.lower() + text_lower = text_to_match.lower() - if resource_kw_lower in text_lower: - if any(action_kw.lower() in text_lower for action_kw in action_kws): - current_ep_method = getattr(ep_obj, 'method', '').upper() - if http_method and current_ep_method == http_method.upper(): - self.logger.info(f"Discovered endpoint: Key='{lookup_key_to_return or op_id_to_check}', MatchedText='{text_for_matching}' (for resource='{resource_kw}', action='{action_kws}', method='{http_method}')") - return lookup_key_to_return or op_id_to_check # Return title or operationId - elif not http_method: - self.logger.info(f"Discovered endpoint: Key='{lookup_key_to_return or op_id_to_check}', MatchedText='{text_for_matching}' (for resource='{resource_kw}', action='{action_kws}', any method)") - return lookup_key_to_return or op_id_to_check - self.logger.warning(f"No operation found for resource='{resource_kw}', actions='{action_kws}', method='{http_method}'") - return None + action_match = any(action_kw.lower() in text_lower for action_kw in action_kws) + self.logger.debug(f" For '{ep_title}': Action match with '{action_kws}'? {action_match}") - def is_applicable_to_api_group(self, api_group_name: str | None, global_api_spec: ParsedAPISpec) -> bool: - self.logger.info(f"Checking applicability of '{self.name}' (RESOURCE_KEYWORD: '{RESOURCE_KEYWORD}') for API group '{api_group_name}'.") + method_match = (not target_method) or (ep_method_actual == target_method.upper()) + self.logger.debug(f" For '{ep_title}': Method match with '{target_method}'? {method_match} (Endpoint method: {ep_method_actual})") + + path_contains_id_param = False + if isinstance(ep_obj, YAPIEndpoint): + self.logger.debug(f" For YAPI Endpoint '{ep_title}': Checking req_params for path ID: {ep_obj.req_params}") + for param in ep_obj.req_params: # YAPI req_params are path parameters + if isinstance(param, dict): + param_name = param.get('name', 'UnnamedParam') + if param_name == self.cfg_path_param_name_for_id or 'id' in param_name.lower(): + path_contains_id_param = True + self.logger.debug(f" Found ID path parameter in YAPI req_params: '{param_name}'") + break + elif isinstance(ep_obj, SwaggerEndpoint): + swagger_params = getattr(ep_obj, 'parameters', None) + self.logger.debug(f" For Swagger Endpoint '{ep_title}': Checking swagger_params for path ID: {swagger_params}") + if isinstance(swagger_params, list): + for param in swagger_params: + if isinstance(param, dict): + param_name = param.get('name', 'UnnamedParam') + param_in = param.get('in', 'N/A') + if param_in == 'path' and \ + (param_name == self.cfg_path_param_name_for_id or 'id' in param_name.lower()): + path_contains_id_param = True + self.logger.debug(f" Found ID path parameter in Swagger parameters: '{param_name}'") + break + else: + self.logger.warning(f" For '{ep_title}': Endpoint is of unknown type {type(ep_obj).__name__} for parameter extraction. Assuming no path ID param.") + + self.logger.debug(f" For '{ep_title}': Calculated path_contains_id_param={path_contains_id_param} (cfg_path_param_name_for_id='{self.cfg_path_param_name_for_id}')") + + path_condition_met = True + if path_must_contain_id and not path_contains_id_param: + path_condition_met = False + if path_must_not_contain_id and path_contains_id_param: + path_condition_met = False + self.logger.debug(f" For '{ep_title}': Calculated path_condition_met={path_condition_met} (required={path_must_contain_id}, forbidden={path_must_not_contain_id})") + + if action_match and method_match and path_condition_met: + self.logger.info(f" SUCCESS: Op match for actions '{action_kws}': Key='{lookup_key}', MatchedText='{text_to_match}', Method='{ep_method_actual}', Path='{ep_path}'") + best_candidate_key = lookup_key + break + else: + self.logger.debug(f" Criteria NOT met for '{ep_title}' (Action: {action_match}, Method: {method_match}, PathCond: {path_condition_met}). Continuing search.") + + if not best_candidate_key: + self.logger.warning(f" FAILURE: No operation found after checking all endpoints for: actions='{action_kws}', method='{target_method}', path_id_required={path_must_contain_id}, path_id_forbidden={path_must_not_contain_id}") + return best_candidate_key + + + def is_applicable_to_api_group(self, api_group_name: Optional[str], global_api_spec: ParsedAPISpec) -> bool: + self.logger.info(f"Checking applicability of '{self.name}' for API group '{api_group_name}'.") if not global_api_spec or not global_api_spec.endpoints: self.logger.warning(f"'{self.name}' cannot determine applicability: global_api_spec or its endpoints are missing.") return False - # Reset for this applicability check + self._determine_resource_config(api_group_name, global_api_spec) + self.discovered_op_keys = {} - all_endpoints = global_api_spec.endpoints + endpoints_in_group = self.apis_in_group - self.discovered_op_keys["create"] = self._find_operation_title_or_id(all_endpoints, RESOURCE_KEYWORD, CREATE_ACTION_KEYWORDS, "POST") - self.discovered_op_keys["list"] = self._find_operation_title_or_id(all_endpoints, RESOURCE_KEYWORD, LIST_ACTION_KEYWORDS, "POST") # Assuming list is POST for this example - self.discovered_op_keys["detail"] = self._find_operation_title_or_id(all_endpoints, RESOURCE_KEYWORD, DETAIL_ACTION_KEYWORDS, "GET") - self.discovered_op_keys["update"] = self._find_operation_title_or_id(all_endpoints, RESOURCE_KEYWORD, UPDATE_ACTION_KEYWORDS, "PUT") - self.discovered_op_keys["delete"] = self._find_operation_title_or_id(all_endpoints, RESOURCE_KEYWORD, DELETE_ACTION_KEYWORDS, "DELETE") + self.discovered_op_keys["create"] = self._find_operation_best_match(endpoints_in_group, CREATE_ACTION_KEYWORDS, "POST", path_must_not_contain_id=True) + self.discovered_op_keys["list"] = self._find_operation_best_match(endpoints_in_group, LIST_ACTION_KEYWORDS, None, path_must_not_contain_id=True) + self.discovered_op_keys["detail"] = self._find_operation_best_match(endpoints_in_group, DETAIL_ACTION_KEYWORDS, "GET", path_must_contain_id=True) + self.discovered_op_keys["update"] = self._find_operation_best_match(endpoints_in_group, UPDATE_ACTION_KEYWORDS, "PUT", path_must_contain_id=True) + self.discovered_op_keys["delete"] = self._find_operation_best_match(endpoints_in_group, DELETE_ACTION_KEYWORDS, "DELETE", path_must_contain_id=False) - missing_ops = [op_type for op_type, key_val in self.discovered_op_keys.items() if not key_val] + required_ops = ["create", "detail", "delete"] + missing_required_ops = [op for op in required_ops if not self.discovered_op_keys.get(op)] - if not missing_ops: - self.logger.info(f"'{self.name}' is APPLICABLE for group '{api_group_name}'. All CRUD operations found for '{RESOURCE_KEYWORD}'. Discovered keys: {self.discovered_op_keys}") + if not missing_required_ops: + self.logger.info(f"'{self.name}' is APPLICABLE for group '{api_group_name}'. Required CRUD operations found. Discovered keys: {self.discovered_op_keys}") return True else: - self.logger.warning(f"'{self.name}' is NOT APPLICABLE for group '{api_group_name}'. Missing operations for '{RESOURCE_KEYWORD}': {missing_ops}. Discovered keys: {self.discovered_op_keys}") + self.logger.warning(f"'{self.name}' is NOT APPLICABLE for group '{api_group_name}'. Missing required operations: {missing_required_ops}. Discovered keys: {self.discovered_op_keys}") return False def before_stage(self, stage_context: dict, global_api_spec: ParsedAPISpec, api_group_name: str | None): + self._determine_resource_config(api_group_name, global_api_spec) + self.logger.info(f"Starting stage '{self.name}' for API group '{api_group_name}'. Discovered op keys: {self.discovered_op_keys}") run_timestamp = int(time.time()) run_uuid_short = uuid.uuid4().hex[:6] - # Generate unique names for this run, using the configured RESOURCE_KEYWORD - # Ensure RESOURCE_KEYWORD is simple enough for this concatenation. - safe_resource_keyword_part = re.sub(r'\W+', '', RESOURCE_KEYWORD) # Remove non-alphanumeric for safety - - unique_name_for_run = f"Test_{safe_resource_keyword_part}_{run_timestamp}_{run_uuid_short}" + unique_name_for_run = f"TestResource_{run_timestamp}_{run_uuid_short}" updated_name_for_run = f"{unique_name_for_run}_UPDATED" + unique_feature_val = f"Feature_{run_timestamp}" + updated_feature_val = f"{unique_feature_val}_UPDATED" stage_context["unique_resource_name"] = unique_name_for_run stage_context["updated_resource_name"] = updated_name_for_run + stage_context["unique_feature_value"] = unique_feature_val + stage_context["updated_feature_value"] = updated_feature_val - # These are placeholders and likely need to be adapted or fetched from config/context + stage_context["cfg_list_path_in_listresponse"] = self.cfg_list_path_in_list_response + stage_context["cfg_name_field_in_listitem"] = self.cfg_name_field_in_list_item + stage_context["cfg_id_field_in_listitem"] = self.cfg_id_field_in_list_item + stage_context["cfg_resource_object_path_in_detailresponse"] = self.cfg_resource_object_path_in_detail_response + stage_context["cfg_name_field_in_detailresponse"] = self.cfg_name_field_in_detail_response + stage_context["cfg_id_field_in_detailresponse"] = self.cfg_id_field_in_detail_response + stage_context["cfg_resource_object_path_in_updateresponse"] = self.cfg_resource_object_path_in_update_response + stage_context["cfg_feature_field_name_for_validation"] = self.cfg_feature_field_in_create_payload + stage_context["dms_instance_code"] = DEFAULT_DMS_INSTANCE_CODE_PLACEHOLDER stage_context["api_version"] = DEFAULT_API_VERSION_PLACEHOLDER - self.logger.info(f"Initial stage context: {stage_context}") + self.logger.info(f"Initial stage context (with cfg): {stage_context}") - if not all(self.discovered_op_keys.values()): - self.logger.error("Cannot build steps as not all operation keys were discovered. This should have been caught by is_applicable. Stage will have no steps.") + if not self.discovered_op_keys.get("create") or \ + not self.discovered_op_keys.get("detail") or \ + not self.discovered_op_keys.get("delete"): + self.logger.error("Cannot build steps as not all essential operation keys (create, detail, delete) were discovered. Stage will have no steps.") self.steps = [] return + + create_body_data = { + self.cfg_name_field_in_create_payload: "{{stage_context.unique_resource_name}}", + } + if self.cfg_feature_field_in_create_payload: + create_body_data[self.cfg_feature_field_in_create_payload] = "{{stage_context.unique_feature_value}}" - # --- Dynamically build steps using discovered keys --- - # 【【【重要提示】】】: 下面的 request_overrides (尤其是 'body') 和 'outputs_to_context' - # 是基于 '井筒API示例_simple.json' (当RESOURCE_KEYWORD="地质单元"时)的结构。 - # 当您修改 RESOURCE_KEYWORD 并用于您自己的API时, - # 您【必须】相应地修改这些 'body' 结构和 'outputs_to_context' 中的JSON路径。 - self.steps = [ - StageStepDefinition( - name=f"Add New {RESOURCE_KEYWORD}", + final_create_body = { + "version": "{{stage_context.api_version}}", + "data": [create_body_data] + } + + self.steps = [] + + if self.discovered_op_keys["create"]: + self.steps.append(StageStepDefinition( + name="Create New Resource", endpoint_spec_lookup_key=self.discovered_op_keys["create"], request_overrides={ - "path_params": {"dms_instance_code": "{{stage_context.dms_instance_code}}"}, # Example path param + "path_params": {"dms_instance_code": "{{stage_context.dms_instance_code}}"}, "headers": {"tenant-id": DEFAULT_TENANT_ID_PLACEHOLDER, "Authorization": DEFAULT_AUTHORIZATION_PLACEHOLDER}, - "body": { # EXAMPLE BODY - MODIFY FOR YOUR API - "version": "{{stage_context.api_version}}", - "data": [{ - "bsflag": 0, # Field specific to GeoUnit example - "wellCommonName": "{{stage_context.unique_resource_name}}", # Field specific to GeoUnit example - "wellId": f"ExampleWellID_{run_timestamp}", # Field specific to GeoUnit example - "dataRegion": "TEST_REGION" # Field specific to GeoUnit example - }] - } + "body": final_create_body }, - expected_status_codes=[200], # Modify as per your API - # outputs_to_context: {"created_resource_id": "body.data[0].dsid"} # MODIFY FOR YOUR API - ), - StageStepDefinition( - name=f"List and Find Created {RESOURCE_KEYWORD}", + expected_status_codes=[200, 201], + outputs_to_context={"created_resource_id": self.cfg_id_field_in_create_response} + )) + + if self.discovered_op_keys["list"] and self.discovered_op_keys["create"]: + list_query_filter = { + "key": self.cfg_name_field_in_list_item, + "symbol": "=", + "realValue": ["{{stage_context.unique_resource_name}}"] + } + self.steps.append(StageStepDefinition( + name="List and Find Created Resource", endpoint_spec_lookup_key=self.discovered_op_keys["list"], request_overrides={ - "path_params": { # Example path params + "path_params": { "dms_instance_code": "{{stage_context.dms_instance_code}}", "version": "{{stage_context.api_version}}" }, "headers": {"tenant-id": DEFAULT_TENANT_ID_PLACEHOLDER, "Authorization": DEFAULT_AUTHORIZATION_PLACEHOLDER}, - "query_params": {"pageNo": 1, "pageSize": 10}, # Example query params - "body": { # EXAMPLE BODY for a POST list query - MODIFY FOR YOUR API + "query_params": {"pageNo": 1, "pageSize": 10}, + "body": { "isSearchCount": True, "query": { - "fields": ["dsid", "wellCommonName"], # Example fields - MODIFY - "filter": { # Example filter - MODIFY - "key": "wellCommonName", - "symbol": "=", - "realValue": ["{{stage_context.unique_resource_name}}"] - } + "fields": [self.cfg_id_field_in_list_item, self.cfg_name_field_in_list_item, self.cfg_feature_field_in_list_item], + "filter": list_query_filter } } }, expected_status_codes=[200], - response_assertions=[find_and_extract_id_by_name], # Uses generic helper, ensure its internal paths are also updated! - outputs_to_context={"created_resource_id": "body.data.list[0].dsid"} # EXAMPLE output - MODIFY - ), - StageStepDefinition( - name=f"Get Created {RESOURCE_KEYWORD} Details", + response_assertions=[find_resource_in_list_and_extract_id], + outputs_to_context={"found_id_from_list": f"{self.cfg_list_path_in_list_response}.0.{self.cfg_id_field_in_list_item}"} + )) + + if self.discovered_op_keys["detail"] and self.discovered_op_keys["create"]: + self.steps.append(StageStepDefinition( + name="Get Created Resource Details", endpoint_spec_lookup_key=self.discovered_op_keys["detail"], request_overrides={ - "path_params": { # Example path params - MODIFY + "path_params": { "dms_instance_code": "{{stage_context.dms_instance_code}}", "version": "{{stage_context.api_version}}", - "id": "{{stage_context.created_resource_id}}" # Assumes 'id' is the path param name + self.cfg_path_param_name_for_id: "{{stage_context.created_resource_id}}" }, "headers": {"tenant-id": DEFAULT_TENANT_ID_PLACEHOLDER, "Authorization": DEFAULT_AUTHORIZATION_PLACEHOLDER} }, expected_status_codes=[200], - response_assertions=[check_resource_details] # Uses generic helper, ensure its internal paths are also updated! - ), - StageStepDefinition( - name=f"Update Created {RESOURCE_KEYWORD}", + response_assertions=[check_resource_details] + )) + + if self.discovered_op_keys["update"] and self.discovered_op_keys["create"]: + update_body_data = { + self.cfg_id_field_in_detail_response: "{{stage_context.created_resource_id}}", + self.cfg_name_field_in_detail_response: "{{stage_context.updated_resource_name}}", + } + if self.cfg_feature_field_in_create_payload: + update_body_data[self.cfg_feature_field_in_create_payload] = "{{stage_context.updated_feature_value}}" + + final_update_body = { + "id": "{{stage_context.created_resource_id}}", + "version": "{{stage_context.api_version}}", + **update_body_data + } + self.steps.append(StageStepDefinition( + name="Update Created Resource", endpoint_spec_lookup_key=self.discovered_op_keys["update"], request_overrides={ - "path_params": {"dms_instance_code": "{{stage_context.dms_instance_code}}"}, # Example - "query_params": {"id": "{{stage_context.created_resource_id}}"}, # Example if ID is in query for PUT + "path_params": { + "dms_instance_code": "{{stage_context.dms_instance_code}}", + self.cfg_path_param_name_for_id: "{{stage_context.created_resource_id}}" + }, "headers": {"tenant-id": DEFAULT_TENANT_ID_PLACEHOLDER, "Authorization": DEFAULT_AUTHORIZATION_PLACEHOLDER}, - "body": { # EXAMPLE BODY - MODIFY FOR YOUR API - "id": "{{stage_context.created_resource_id}}", - "version": "{{stage_context.api_version}}", - "wellCommonName": "{{stage_context.updated_resource_name}}", # Example field - "dataRegion": "TEST_REGION_UPDATED" # Example field - # Add other required fields for your API's update operation - } + "body": final_update_body }, expected_status_codes=[200], - ), - StageStepDefinition( - name=f"Get Updated {RESOURCE_KEYWORD} Details", + )) + + if self.discovered_op_keys["detail"] and self.discovered_op_keys["update"] and self.discovered_op_keys["create"]: + self.steps.append(StageStepDefinition( + name="Get Updated Resource Details", endpoint_spec_lookup_key=self.discovered_op_keys["detail"], request_overrides={ "path_params": { "dms_instance_code": "{{stage_context.dms_instance_code}}", "version": "{{stage_context.api_version}}", - "id": "{{stage_context.created_resource_id}}" + self.cfg_path_param_name_for_id: "{{stage_context.created_resource_id}}" }, "headers": {"tenant-id": DEFAULT_TENANT_ID_PLACEHOLDER, "Authorization": DEFAULT_AUTHORIZATION_PLACEHOLDER} }, expected_status_codes=[200], - response_assertions=[check_resource_updated_details] # Uses generic helper, check paths! - ), - StageStepDefinition( - name=f"Delete Created {RESOURCE_KEYWORD}", + response_assertions=[check_resource_updated_details] + )) + + if self.discovered_op_keys["delete"] and self.discovered_op_keys["create"]: + self.steps.append(StageStepDefinition( + name="Delete Created Resource", endpoint_spec_lookup_key=self.discovered_op_keys["delete"], request_overrides={ - "path_params": {"dms_instance_code": "{{stage_context.dms_instance_code}}"}, # Example - "query_params": {"id": "{{stage_context.created_resource_id}}"}, # Example if ID is in query for DELETE + "path_params": { + "dms_instance_code": "{{stage_context.dms_instance_code}}", + self.cfg_path_param_name_for_id: "{{stage_context.created_resource_id}}" + }, "headers": {"tenant-id": DEFAULT_TENANT_ID_PLACEHOLDER, "Authorization": DEFAULT_AUTHORIZATION_PLACEHOLDER}, - "body": { # EXAMPLE BODY for delete (if it takes a body) - MODIFY FOR YOUR API - "version": "{{stage_context.api_version}}", - "data": ["{{stage_context.created_resource_id}}"] - } }, - expected_status_codes=[204], # Or 204 No Content, etc. - ), - StageStepDefinition( - name=f"Verify {RESOURCE_KEYWORD} Deletion", - endpoint_spec_lookup_key=self.discovered_op_keys["detail"], # Try to get it again + expected_status_codes=[200, 204], + )) + + if self.discovered_op_keys["detail"] and self.discovered_op_keys["delete"] and self.discovered_op_keys["create"]: + self.steps.append(StageStepDefinition( + name="Verify Resource Deletion", + endpoint_spec_lookup_key=self.discovered_op_keys["detail"], request_overrides={ "path_params": { "dms_instance_code": "{{stage_context.dms_instance_code}}", "version": "{{stage_context.api_version}}", - "id": "{{stage_context.created_resource_id}}" + self.cfg_path_param_name_for_id: "{{stage_context.created_resource_id}}" }, "headers": {"tenant-id": DEFAULT_TENANT_ID_PLACEHOLDER, "Authorization": DEFAULT_AUTHORIZATION_PLACEHOLDER} }, - expected_status_codes=[404], # Expect Not Found - ), - ] + expected_status_codes=[404], + )) - def after_stage(self, stage_result: 'ExecutedStageResult', stage_context: dict, global_api_spec: ParsedAPISpec, api_group_name: str | None): - self.logger.info(f"结束阶段 '{self.name}' (资源关键字: '{RESOURCE_KEYWORD}'). API分组: '{api_group_name}'. 最终状态: {stage_result.overall_status}. 最终上下文: {stage_context}") \ No newline at end of file + def after_stage(self, stage_result: ExecutedStageResult, stage_context: dict, global_api_spec: ParsedAPISpec, api_group_name: str | None): + self.logger.info(f"Finished stage '{self.name}'. API Group: '{api_group_name}'. Final Status: {stage_result.overall_status}. Final Context Keys: {list(stage_context.keys())}") \ No newline at end of file diff --git a/ddms_compliance_suite/__pycache__/scenario_framework.cpython-312.pyc b/ddms_compliance_suite/__pycache__/scenario_framework.cpython-312.pyc index a1cb2809e3d96c82ec744921c1905bec04decc32..ede2554a84193fd88bbfdb1556e2607d07417b4d 100644 GIT binary patch delta 22 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 CgCr3E delta 10361 zcma(%3v^S*vG-p6Wy_W=`7hhDg|LN<37_yWV1C94A()RH0>;4z-)kd~C9}GQ80?5r zAhab7bejh90YVdE4k0nmuPOPw)M?Vw^rf$nh*PV#yuP#r@@pIM$xD;h)4rL#mTYKf zd%?4_v%9mizuB2tJ$6BOAO1cFwHqFjIeYuS}xG?lC*J*mJhUoB+boe4xkm*B#Gm@1s5mfkK@RA z7`M=r_s>VRc{b&XY6-0X zh$1M2zfdiJy&S!!n`a)t1!ZtwhyY?c0 z(Xoqslg0!aEAdZE6>%=Ku=-j_4}V&922?2OB!i?y5k);=g6q-U&xZt_Ye%X!(X2;5hKfAc*JDtrjDtQ&H9|{VKK98O^i+D$N;xx0uqUuK zA+i5MDRNGND)NaPy_@gmJVO1By$!OrU22e}&RVI>7x3Y}siq73d0}TqS4ehll$>5? zNG85OyR$r)*jY}wyHj!oiL*nJHwDE>onCp92lHO1=xddoJImC9vTA49nzBk~8CJl| z+Ol3xDwzfHkZJ@42xcR|EllPjs6j9<3{WxqLcTyq_6AxdQj7#GvRBNjz5Xs~F(EUuRSpDP$jUwk3c5$CufNw~&wwl)E93qTELt>f9r z^yusHBd94o>BIpE!Bb3%04Ro*7BSe`(!wT>7?FN8@WkSWAhfpY8J)?ZoW_}#OBw=ii)pf*mP|| zEGIv%LFE04+xl(&;<>4VnsYPH1|pMdqZNzeIxLFox#F_pp(7n}1Irq@uzO-(W526E z)L(vTeRSNMxQP{*InU&Ndw=WMylDCCcnYJXa%GeHkR!8n_iZr)G?rn*# z+7OxRjkLB$Hr*d>?T*atj!xSVowPGLz9(*B4b!;sRefUr)N`8tnWq9#_uP0oqg%N= zhvhmGULE{Q`U_hgpG)_YZmCsOndlPDQW~hJ^bysSBBhMYGwqTJYL01K(E?Zoqoo0s zMwh#C!s(!OGXDiGR>{_;7c=%~o9trd9D^DCR=8ctojI>GqAVEIV&4;=LqT^qvZxjom zegV`kk}S8Xf7j>$+Kgf`G;oYGaEc|jYBZ*eSuBM%g`m322DZ9q^0~8M@QSKd6fJ1B zkfIBLZVS=DEIZYd-7EZ+r_E(wOBXeW1LUUVX++&z4W2Z(411!&)u)-FP%fZXEk^o2mBwX~C9S0`Bk z?8r(4)9JMdm9)9BxR~4pdBw2ZO9IGC9|{s#63H^4di120{>hq~y$UiRoFr9SGI7ab z>aWPxufd|L^gzYT+3qQ*!%CC-ueb{Hj`v-+pLaD3&1z89-Q0PqrZc7v8z)4K6NZeH zaXtNOMMv#*J(uk`Tzl-UBX>nB=MH7n?AJbIW~WZk6G`qOfmYN}V?WGaLp}B=*Ufu` zu6O8fYwI&FojLfy*;g(-{KCaop84p(hc4|qLc8nA^dIed<-^ww(c3qa(O*n8hv8oG zieA}U?S#wy(*AuPyt3zm$M#&>`}NC@^k07Hd1v{>*S>Y>qI`QW8fTdtgTrQa2uoBhI4_z-jqjq{}-(Kh! zI{D!A3m@!$NwqgF?SJ&cr~2q)-YTh)bV*JS`EkbnxV*{YRX2UVlg$D?lSt-yRLAg}Ea22$ll~;rxMY#6{QLd1vNU zB%w(Gw^}Y|wUg3;ol9yAnlJe>`r3-A{49EP#WovSi%Lq;09Yb|=@?qM#+nWE9mYy0 zUhvgUk~8q@m4px9hqZO0w6Uw5?KH9;2^!e3ipDPmNDE|1D*`Wq1qc=bfHMn*g?iP) z!G&2R8<4E?$x;WLWq)wHL=>$r&=w?>tUerykjKnMsMutm?3Y@$Nc49NPJS)bG~Q!! zK`pWo0NvSGDTKL!Q;qLxoM_W3W`8iarK=O_cPnYIQ0j4M!L_El);Rf%15d44!JEc& zT(3?v_3G(wnzO03>1P`Lz;=2zJ)8C~&!XS1%{Qd=@Q;JbgXLO4tn{{~Jo?@`M@~k< z1|#D~ZLl64JzHp}8}=FXB%?>SnQ55JUSr^QGFn6I>(R*$y1IE1^)9o~UF!;pGg%il z8Smqf8VO4ddbHE?&9f%sP)EwZ%+@FTF?lRKYb>3vU!N_=F4}mXD=+D55z7q?a_GVP z3d(Ym1G%v@ca&X#7xnb$eR;02-R1eXgct$d$BFq*n0k$}o2IRwv3zVj%P5~4dLJV$ zC}#^O=drDB7$h6aa|QId^=s1|Y_Em_OIvNE zmSEP8U_SsQg-Bbwq>#KYD0Y)?0tIyKXtP|bhkYenvw31OAEfidO8S;q6t*iSDIj(R z!Bz_q^?-ru4-)l&ZO3-VOVM?8!VzMUD27emkXM$;=r|N(tJm-MZuCp!L2Qyddg^fu zAqNATQ`U<4g`Gh1m`D~=B45Kc>@L}j*w<-~w2XJr&KY;=&jKNIhVpH%^ONWsZQ+4$ zwf`q?SjkT^WnK|!v+o#RI`9|Y(;B8S)QQ@MJbbjj<5LOEYL8J>2dI%$i}l-x;aJH- z2=LM(ivZvqh4`Zgz79aK-~kSS!^_rYbXIS;z-UTvz3?|~U`tTL^QH9T>SB6!Ya6}P zxon0HnAD%rsGZ@ES!W)t+Rx)iNDe!sg)Asg)S%<%RPqkmxwWE<>6BD(R@$W&B89sA zvSM3&ztq|V7b|lsRxu)ddh6xMtT*x`u<_{B9*$uTH+6#sI(CEoEUlTqJE5Pvq8aD3 zKQg>z=?Se39Qt}%4h_n~bDlvq>Zncvnphvkz3(f!7;9G0hZmL$<=96q zJ<(MX#(q2+aB9FmZS?SsrvyNYZgOo%9dczG0`D$$yEqYJLqttV?naJXmLvco zp86D4>pP8W1rKk6NaB$znb7$&76Wrv<>Q^jiXjojU z=<60Nxf@d5;#I4buTl&ROP8!z0eQoU#r3sI>hHK|ITSq{J-I7H`hou>p8m1NWoGid z0{MFCOD%L{Z1ehkU=o7))}m@x#VB^E5i~lr*KJ~Z2^AkblEQYmBX!gj%9(t3BuI#jXXl=&7%@Yej|oFkm--oN`>h>T@rqvgw2Ws#8w_a;=@}E zPtY|*N1xwa%{N@x|Vzs5| zN3ZY$0WDp5R}TG~1MC_dwG z7^!ez9t=j)YwR_ESktjO{cgTp>*JCFS;E^mu33P|G4vXH3}Y5^jClV_CzW1?GZbl+L+URLdH zaPRo&Eok|rrmCvyBisw1Hkih^Nv$N6l44Ehx0a9u>P!p~WWaQlYDl4t*aFc6zp9IV z%yYE&o5kT$Rh=>W3@1+Y*-VY#v$0^TqW6OB84z#oz8LE=wS+P#I?%XXk~&iDW-w@( zf+Ro1G9!3>ZK|g92SE%(Rq0;mV6~N0lnUmhqr(gRFipu+XcuF=v0IixgkX25Kgk`8 z+U5^>WpV}y=rj^Ea@qX?W-Xitu*5-*<#(wv^j+qBd zvBGi3)*V^bm)F1W-NG3M&F@#u7`!X$S{|`Fe`|9;Hz9KS9Y41ZO{k9x#;kV!{etpH zWlgl8CLDuU>B{xdnwE&8vhTjAV|F}^%Ww=^OQY7(h->P5)@kuF=s#Y?$>54+oJcjz1z?pD{&8(%!roEh-K$L zy5-Q8;q0<#c3CW^;L)B#Jy$s{ca_k1Tz?u$HUWtkMAgdX1z3{+Ixhdd(IMbmM~r%9d#e zmSF;{muX}qR&*h)PO}6n)@km*ep8o>kYrrIg=jHW^)TLVC z&64b;j?6b_+5!HwaDlM2#PKuDg4s*Uir&^{EX~usoy!A+Pz)-w`VRoGkG)QS{hl#m z&`kjVn&7Z6LQlegK*7bE&0f)WJGT5%zEDgh?qiOL@M z<-rgJ{8f0?oGZvidZE`rKXGK+ z#=b;CHT>vpg;~^jw=oO>^2F3~BEEN~s1?9-;31cq%wZYYsO)1eqiKm8YnPtLu?I_X z39=q5`3Ms7F#;4&74Aalmd&nSGMX3mEc3%rDS@s?qhe!@i`?UIF3vEL9HWX!NmM8}`ZDY5Lsowx}~AfjrfZ|4+c zU8r6*T-_M0ZXB*|j#f8gEWF?Xbv}~oJYb29p8&6asWCM~UJ#oxd%yNQW4^jw`{;s4 z*0@&#FR%~blyl@g6~}vv^Z^J709c4%Fn5;jFm_GcHVOIwJ_{bVv6>G0my%Kg_ z*d*Z|IVC7U)otYaH!uo4z6@SGUVr@BEgG`D1{!;`Z@|f)IT|@OUpUFraZgqWUvRYX z$^Kg~VEgn|3{LS>KFSz8ee{c|OmyANqQ8h8{sS%xK>p0*mv7NMYkiCEQ_sK*lK(^g zFa+{cOZbn7e~REw02GTHlwofq45vXX0KLnptMdoMjw4`G%tT~cOydo7vqP$AU`Mhu z3oFW25nCr$5pX4oZ9m@*2{$h7Dwt+?9GCShPx}id4Lo{cFV6zlM1smUcx!l6PzHI09tY3pWHvP~x2K6oe<1026eJxF2$NbyD?m_}9zB_3k`srQ z{^?{6bD2H`W{aM+L8uRWlQ4KbcINqLdw9|GL}~+gK|Fdw+U=ajTu*)hLXmd>?9ijJ zSnb@AR_R;{q5DaTf?WX_9u8(o!_!7~BVbb;MGV)2txQ-w z#`YVJF`QrE&DKRJP*1d~+!7vqs0*w}((TDr7Z6QIH6F@trC(!~AXtb1Z^BW_@kYtQ zBMN9M)?xDf60t!9Ovo5wY!9)Z06WNdnT@CxC1ccl91)KE9-CZ5zz*k4iUu3+C`g1C z>2Hc``WJDJh&1EW1$zC|PI|C7EBuq{oVuJ`@*Hwm4dCy7AaLtTSc`42Qx+XlZ&@%b zI0EbX)fe$`EJe_Zf>1!#;*SHWuM0X|@j=@`@j3@c+|DiF7xS^IDOXJCx;e3eqPPaq z_Y0kI9i$NSy7@`ofMnyy&jYSuqxd+w=yZ8S-i=p0WL2GsGI+|=p)~;xjs-n*dRB_D zvs?5AWM3;up?^4?7sgA6{op~#z~C|ZJQAr=6M{!cvH1d>T{77FBm^aDqJ|7Jux%#R z$@2RZ%ZfirakfYZV)or7Y>_gojn;8FVQ{EkVF8Y!_hgXxtGLyZllONr%aX|6J%Zjt)KNq@O=mm3CdP=f@xHzRp2% zHJi$3CeE;D@oivDBmDd}uZC~ouW&5+{7wTXd-D|z;pZEKRghfe5dJy7GKK#9%-jrv Te&H1E$5YA|6>8pa@BsfGRb4d` diff --git a/ddms_compliance_suite/__pycache__/stage_registry.cpython-312.pyc b/ddms_compliance_suite/__pycache__/stage_registry.cpython-312.pyc index 567959094a59332207372cceb663fcc1d5c142ef..266d6cdba5064b39fd2d51fcbde8dac187b2ec5f 100644 GIT binary patch literal 7676 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 literal 10272 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�DMK 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 diff --git a/ddms_compliance_suite/scenario_framework.py b/ddms_compliance_suite/scenario_framework.py deleted file mode 100644 index 97a2c3e..0000000 --- a/ddms_compliance_suite/scenario_framework.py +++ /dev/null @@ -1,228 +0,0 @@ -from typing import List, Dict, Any, Optional, Callable, Union -import datetime -import logging -from enum import Enum - -from .test_framework_core import ValidationResult, APIRequestContext, APIResponseContext -from .api_caller.caller import APICallDetail # 需要APICallDetail来记录每个步骤的调用 - -class ScenarioStepDefinition: - """定义API场景中的一个单独步骤。""" - def __init__(self, - name: str, - endpoint_spec_lookup_key: str, # 用于从全局API规范中查找端点定义的键 - request_overrides: Optional[Dict[str, Any]] = None, - expected_status_codes: Optional[List[int]] = None, - response_assertions: Optional[List[Callable[[APIResponseContext, Dict[str, Any]], List[ValidationResult]]]] = None, - outputs_to_context: Optional[Dict[str, str]] = None): - """ - Args: - name: 步骤的可读名称。 - endpoint_spec_lookup_key: 用于查找端点定义的键 (例如 "METHOD /path" 或 YAPI的_id)。 - request_overrides: 覆盖默认请求参数的字典。值可以是占位符,如 "{{scenario_context.user_id}}"。 - 支持的键有: "path_params", "query_params", "headers", "body"。 - expected_status_codes: 预期的HTTP响应状态码列表。如果为None,则不进行特定状态码检查(除非由response_assertions处理)。 - response_assertions: 自定义断言函数列表。每个函数接收 APIResponseContext 和 scenario_context,返回 ValidationResult 列表。 - outputs_to_context: 从响应中提取数据到场景上下文的字典。 - 键是存储到场景上下文中的变量名,值是提取路径 (例如 "response.body.data.id")。 - """ - self.name = name - self.endpoint_spec_lookup_key = endpoint_spec_lookup_key - self.request_overrides = request_overrides if request_overrides is not None else {} - self.expected_status_codes = expected_status_codes if expected_status_codes is not None else [] - self.response_assertions = response_assertions if response_assertions is not None else [] - self.outputs_to_context = outputs_to_context if outputs_to_context is not None else {} - self.logger = logging.getLogger(f"scenario.step.{name}") - -class BaseAPIScenario: - """ - API场景测试用例的基类。 - 用户应继承此类来创建具体的测试场景。 - """ - # --- 元数据 (由子类定义) --- - id: str = "base_api_scenario" - name: str = "基础API场景" - description: str = "这是一个基础API场景,应由具体场景继承。" - tags: List[str] = [] - steps: List[ScenarioStepDefinition] = [] # 子类需要填充此列表 - - def __init__(self, - global_api_spec: Dict[str, Any], # 完整的API规范字典 (YAPI/Swagger解析后的原始字典) - parsed_api_endpoints: List[Dict[str, Any]], # 解析后的端点列表,用于通过 lookup_key 查找 - llm_service: Optional[Any] = None): - """ - 初始化API场景。 - Args: - global_api_spec: 完整的API规范字典。 - parsed_api_endpoints: 从YAPI/Swagger解析出来的端点对象列表(通常是YAPIEndpoint或SwaggerEndpoint的to_dict()结果)。 - 这些对象应包含用于匹配 `endpoint_spec_lookup_key` 的字段。 - llm_service: APITestOrchestrator 传入的 LLMService 实例 (可选)。 - """ - self.global_api_spec = global_api_spec - self.parsed_api_endpoints = parsed_api_endpoints # 用于快速查找 - self.llm_service = llm_service - self.logger = logging.getLogger(f"scenario.{self.id}") - self.logger.info(f"API场景 '{self.id}' ({self.name}) 已初始化。") - - def _get_endpoint_spec_from_global(self, lookup_key: str) -> Optional[Dict[str, Any]]: - """ - 根据提供的 lookup_key 从 self.parsed_api_endpoints 中查找并返回端点定义。 - 查找逻辑可能需要根据 lookup_key 的格式 (例如, YAPI _id, METHOD /path) 进行调整。 - 简单实现:假设 lookup_key 是 METHOD /path 或 title。 - """ - self.logger.debug(f"尝试为场景步骤查找端点: '{lookup_key}'") - for endpoint_data in self.parsed_api_endpoints: - # 尝试匹配 "METHOD /path" 格式 (常见于SwaggerEndpoint) - method_path_key = f"{str(endpoint_data.get('method', '')).upper()} {endpoint_data.get('path', '')}" - if lookup_key == method_path_key: - self.logger.debug(f"通过 'METHOD /path' ('{method_path_key}') 找到端点。") - return endpoint_data - - # 尝试匹配 title (常见于YAPIEndpoint) - if lookup_key == endpoint_data.get('title'): - self.logger.debug(f"通过 'title' ('{endpoint_data.get('title')}') 找到端点。") - return endpoint_data - - # 尝试匹配 YAPI 的 _id (如果可用) - if str(lookup_key) == str(endpoint_data.get('_id')): # 转换为字符串以确保比较 - self.logger.debug(f"通过 YAPI '_id' ('{endpoint_data.get('_id')}') 找到端点。") - return endpoint_data - - # 尝试匹配 Swagger/OpenAPI 的 operationId - if lookup_key == endpoint_data.get('operationId'): - self.logger.debug(f"通过 'operationId' ('{endpoint_data.get('operationId')}') 找到端点。") - return endpoint_data - - - self.logger.warning(f"未能在 parsed_api_endpoints 中找到 lookup_key 为 '{lookup_key}' 的端点。") - return None - - def before_scenario(self, scenario_context: Dict[str, Any]): - """在场景所有步骤执行前调用 (可选,供子类覆盖)""" - self.logger.debug(f"Hook: before_scenario for '{self.id}'") - pass - - def after_scenario(self, scenario_context: Dict[str, Any], scenario_result: 'ExecutedScenarioResult'): - """在场景所有步骤执行后调用 (可选,供子类覆盖)""" - self.logger.debug(f"Hook: after_scenario for '{self.id}'") - pass - - def before_step(self, step_definition: ScenarioStepDefinition, scenario_context: Dict[str, Any]): - """在每个步骤执行前调用 (可选,供子类覆盖)""" - self.logger.debug(f"Hook: before_step '{step_definition.name}' for '{self.id}'") - pass - - def after_step(self, step_definition: ScenarioStepDefinition, step_result: 'ExecutedScenarioStepResult', scenario_context: Dict[str, Any]): - """在每个步骤执行后调用 (可选,供子类覆盖)""" - self.logger.debug(f"Hook: after_step '{step_definition.name}' for '{self.id}'") - pass - - -class ExecutedScenarioStepResult: - """存储单个API场景步骤执行后的结果。""" - class Status(str, Enum): - PASSED = "通过" - FAILED = "失败" - ERROR = "执行错误" - SKIPPED = "跳过" - - def __init__(self, - step_name: str, - status: Status, - message: str = "", - validation_points: Optional[List[ValidationResult]] = None, - duration: float = 0.0, - api_call_detail: Optional[APICallDetail] = None, - extracted_outputs: Optional[Dict[str, Any]] = None): - self.step_name = step_name - self.status = status - self.message = message - self.validation_points = validation_points if validation_points is not None else [] - self.duration = duration - self.api_call_detail = api_call_detail # 存储此步骤的API调用详情 - self.extracted_outputs = extracted_outputs if extracted_outputs is not None else {} # 从此步骤提取并存入上下文的值 - self.timestamp = datetime.datetime.now() - - def to_dict(self) -> Dict[str, Any]: - return { - "step_name": self.step_name, - "status": self.status.value, - "message": self.message, - "duration_seconds": self.duration, - "timestamp": self.timestamp.isoformat(), - "validation_points": [vp.to_dict() if hasattr(vp, 'to_dict') else {"passed": vp.passed, "message": vp.message, "details": vp.details} for vp in self.validation_points], - "api_call_detail": self.api_call_detail.to_dict() if self.api_call_detail and hasattr(self.api_call_detail, 'to_dict') else None, - "extracted_outputs": self.extracted_outputs - } - -class ExecutedScenarioResult: - """存储整个API场景执行后的结果。""" - class Status(str, Enum): - PASSED = "通过" # 所有步骤都通过 - FAILED = "失败" # 任何一个步骤失败或出错 - SKIPPED = "跳过" # 整个场景被跳过 - - def __init__(self, - scenario_id: str, - scenario_name: str, - overall_status: Status = Status.SKIPPED, - message: str = ""): - self.scenario_id = scenario_id - self.scenario_name = scenario_name - self.overall_status = overall_status - self.message = message - self.executed_steps: List[ExecutedScenarioStepResult] = [] - self.scenario_context_final_state: Dict[str, Any] = {} - self.start_time = datetime.datetime.now() - self.end_time: Optional[datetime.datetime] = None - - def add_step_result(self, result: ExecutedScenarioStepResult): - self.executed_steps.append(result) - - def finalize_scenario_result(self, final_context: Dict[str, Any]): - self.end_time = datetime.datetime.now() - self.scenario_context_final_state = final_context - - if not self.executed_steps and self.overall_status == ExecutedScenarioResult.Status.SKIPPED: - pass # 保持 SKIPPED - elif any(step.status == ExecutedScenarioStepResult.Status.ERROR for step in self.executed_steps): - self.overall_status = ExecutedScenarioResult.Status.FAILED - if not self.message: self.message = "场景中至少一个步骤执行出错。" - elif any(step.status == ExecutedScenarioStepResult.Status.FAILED for step in self.executed_steps): - self.overall_status = ExecutedScenarioResult.Status.FAILED - if not self.message: self.message = "场景中至少一个步骤失败。" - elif all(step.status == ExecutedScenarioStepResult.Status.SKIPPED for step in self.executed_steps) and self.executed_steps: - self.overall_status = ExecutedScenarioResult.Status.SKIPPED # 如果所有步骤都跳过了 - if not self.message: self.message = "场景中的所有步骤都被跳过。" - elif not self.executed_steps: # 没有步骤执行,也不是初始的SKIPPED - self.overall_status = ExecutedScenarioResult.Status.FAILED # 或 ERROR - if not self.message: self.message = "场景中没有步骤被执行。" - else: # 所有步骤都通过 - self.overall_status = ExecutedScenarioResult.Status.PASSED - if not self.message: self.message = "场景所有步骤成功通过。" - - - @property - def duration(self) -> float: - if self.start_time and self.end_time: - return (self.end_time - self.start_time).total_seconds() - return 0.0 - - def to_dict(self) -> Dict[str, Any]: - return { - "scenario_id": self.scenario_id, - "scenario_name": self.scenario_name, - "overall_status": self.overall_status.value, - "message": self.message, - "duration_seconds": f"{self.duration:.2f}", - "start_time": self.start_time.isoformat(), - "end_time": self.end_time.isoformat() if self.end_time else None, - "executed_steps": [step.to_dict() for step in self.executed_steps], - "scenario_context_final_state": self.scenario_context_final_state # 可能包含敏感信息,按需处理 - } - - def to_json(self, pretty=True) -> str: - import json # 局部导入 - indent = 2 if pretty else None - # 对于 scenario_context_final_state,可能需要自定义序列化器来处理复杂对象 - return json.dumps(self.to_dict(), indent=indent, ensure_ascii=False, default=str) \ No newline at end of file diff --git a/ddms_compliance_suite/scenario_registry.py b/ddms_compliance_suite/scenario_registry.py deleted file mode 100644 index cb5c0b3..0000000 --- a/ddms_compliance_suite/scenario_registry.py +++ /dev/null @@ -1,90 +0,0 @@ -import os -import importlib.util -import inspect -import logging -from typing import List, Type, Dict, Optional - -from .scenario_framework import BaseAPIScenario # 从新的场景框架模块导入 - -class ScenarioRegistry: - """ - 负责发现、加载和管理所有自定义的 BaseAPIScenario 类。 - """ - def __init__(self, scenarios_dir: Optional[str] = None): - """ - 初始化 ScenarioRegistry。 - Args: - scenarios_dir: 存放自定义API场景 (.py 文件) 的目录路径。如果为None,则不进行发现。 - """ - self.scenarios_dir = scenarios_dir - self.logger = logging.getLogger(__name__) - self._registry: Dict[str, Type[BaseAPIScenario]] = {} - self._scenario_classes: List[Type[BaseAPIScenario]] = [] - if self.scenarios_dir: - self.discover_scenarios() - else: - self.logger.info("ScenarioRegistry 初始化时未提供 scenarios_dir,跳过场景发现。") - - def discover_scenarios(self): - """ - 扫描指定目录及其所有子目录,动态导入模块,并注册所有继承自 BaseAPIScenario 的类。 - """ - if not self.scenarios_dir or not os.path.isdir(self.scenarios_dir): - self.logger.warning(f"API场景目录不存在或不是一个目录: {self.scenarios_dir}") - return - - self.logger.info(f"开始从目录 '{self.scenarios_dir}' 及其子目录发现API场景...") - found_count = 0 - for root_dir, _, files in os.walk(self.scenarios_dir): - for filename in files: - if filename.endswith(".py") and not filename.startswith("__"): - module_name = filename[:-3] - file_path = os.path.join(root_dir, filename) - try: - spec = importlib.util.spec_from_file_location(module_name, file_path) - if spec and spec.loader: - module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) - self.logger.debug(f"成功导入API场景模块: {module_name} 从 {file_path}") - - for name, obj in inspect.getmembers(module): - if inspect.isclass(obj) and issubclass(obj, BaseAPIScenario) and obj is not BaseAPIScenario: - if not hasattr(obj, 'id') or not obj.id: - self.logger.error(f"API场景类 '{obj.__name__}' 在文件 '{file_path}' 中缺少有效的 'id' 属性,已跳过注册。") - continue - - if obj.id in self._registry: - self.logger.warning(f"发现重复的API场景 ID: '{obj.id}' (来自类 '{obj.__name__}' in {file_path})。之前的定义将被覆盖。") - - self._registry[obj.id] = obj - # 更新 _scenario_classes 列表 - existing_class_indices = [i for i, sc_class in enumerate(self._scenario_classes) if sc_class.id == obj.id] - if existing_class_indices: - for index in sorted(existing_class_indices, reverse=True): - del self._scenario_classes[index] - - self._scenario_classes.append(obj) - found_count += 1 - self.logger.info(f"已注册API场景: '{obj.id}' ({getattr(obj, 'name', 'N/A')}) 来自类 '{obj.__name__}' (路径: {file_path})") - else: - self.logger.error(f"无法为文件 '{file_path}' 创建模块规范 (用于API场景)。") - except ImportError as e: - self.logger.error(f"导入API场景模块 '{module_name}' 从 '{file_path}' 失败: {e}", exc_info=True) - except AttributeError as e: - self.logger.error(f"在API场景模块 '{module_name}' ({file_path}) 中查找场景时出错: {e}", exc_info=True) - except Exception as e: - self.logger.error(f"处理API场景文件 '{file_path}' 时发生未知错误: {e}", exc_info=True) - - # 场景通常不需要像单个测试用例那样排序执行顺序,除非有特定需求 - # 如果需要,可以添加类似 execution_order 的属性并排序 - # self._scenario_classes.sort(key=lambda sc_class: (getattr(sc_class, 'execution_order', 100), sc_class.__name__)) - - self.logger.info(f"API场景发现完成。总共注册了 {len(self._registry)} 个独特的API场景 (基于ID)。发现并加载了 {len(self._scenario_classes)} 个API场景类。") - - def get_scenario_by_id(self, scenario_id: str) -> Optional[Type[BaseAPIScenario]]: - """根据ID获取已注册的API场景类。""" - return self._registry.get(scenario_id) - - def get_all_scenario_classes(self) -> List[Type[BaseAPIScenario]]: - """获取所有已注册的API场景类列表。""" - return list(self._scenario_classes) # 返回副本 \ No newline at end of file diff --git a/ddms_compliance_suite/stage_framework.py b/ddms_compliance_suite/stage_framework.py index 16325a1..fe4f54c 100644 --- a/ddms_compliance_suite/stage_framework.py +++ b/ddms_compliance_suite/stage_framework.py @@ -6,6 +6,7 @@ import time from typing import List, Dict, Any, Callable, Optional, Union from enum import Enum from datetime import datetime +from dataclasses import dataclass, field # Add Pydantic BaseModel for APIOperationSpec from pydantic import BaseModel @@ -25,14 +26,145 @@ except ImportError: logger = logging.getLogger(__name__) -# 定义 APIOperationSpec -class APIOperationSpec(BaseModel): +# Forward declaration for type hinting if ParsedAPISpec is used directly +ParsedAPISpec = "ParsedAPISpec" + +@dataclass +class APIOperationSpec: + """封装了从全局API规范中解析出来的特定API操作的详细信息""" method: str path: str - spec: Dict[str, Any] # 原始API端点定义字典 + spec: Dict[str, Any] # 该API操作的完整OpenAPI/Swagger规范字典部分 operation_id: Optional[str] = None summary: Optional[str] = None description: Optional[str] = None + tags: List[str] = field(default_factory=list) + + +@dataclass +class StageStepDefinition: + """定义测试阶段中的单个步骤""" + name: str + endpoint_spec_lookup_key: str # 用于在API规范中查找此步骤对应的端点 + request_overrides: Dict[str, Any] = field(default_factory=dict) + expected_status_codes: List[int] = field(default_factory=lambda: [200, 201]) + # Corrected type hint for response_assertions + response_assertions: List[Callable[[Any, Dict[str, Any]], ValidationResult]] = field(default_factory=list) # response_context, stage_context -> ValidationResult + outputs_to_context: Dict[str, str] = field(default_factory=dict) # 从响应提取到阶段上下文的映射 + description: Optional[str] = None + order: int = 0 # ADDED order attribute + + +class ExecutedStageStepResult: + """存储单个测试阶段步骤的执行结果""" + class Status(str, Enum): + PENDING = "待定" + PASSED = "通过" + FAILED = "失败" + ERROR = "执行错误" + SKIPPED = "跳过" + + def __init__(self, + step_name: str, + status: Status = Status.PENDING, + message: str = "", + lookup_key: Optional[str] = None, + resolved_endpoint: Optional[str] = None, + request_details: Optional[Dict[str, Any]] = None, + api_call_details: Optional[Dict[str, Any]] = None, # 存储 APICallDetail.to_dict() 的结果 + validation_points: Optional[List[Dict[str, Any]]] = None, # 存储 ValidationResult.to_dict() 的结果列表 + duration_seconds: float = 0.0, + context_after_step: Optional[Dict[str, Any]] = None, + description: Optional[str] = None): + self.step_name = step_name + self.description = description + self.status = status + self.message = message + self.lookup_key = lookup_key + self.resolved_endpoint = resolved_endpoint + self.request_details = request_details if request_details is not None else {} + self.api_call_details = api_call_details if api_call_details is not None else {} + self.validation_points = validation_points if validation_points is not None else [] + self.duration_seconds = duration_seconds + self.context_after_step = context_after_step if context_after_step is not None else {} + self.timestamp: datetime = datetime.now() + + def to_dict(self) -> Dict[str, Any]: + return { + "step_name": self.step_name, + "description": self.description, + "status": self.status.value, + "message": self.message, + "lookup_key": self.lookup_key, + "resolved_endpoint": self.resolved_endpoint, + "duration_seconds": f"{self.duration_seconds:.4f}", + "timestamp": self.timestamp.isoformat(), + "request_details": self.request_details, + "api_call_details": self.api_call_details, + "validation_points": self.validation_points, + "context_snapshot_after_step": self.context_after_step # 可以选择是否完整记录上下文 + } + + +class ExecutedStageResult: + """存储整个测试阶段的执行结果""" + class Status(str, Enum): + PENDING = "待定" + PASSED = "通过" + FAILED = "失败" + ERROR = "执行错误" + SKIPPED = "跳过" + + def __init__(self, + stage_id: str, + stage_name: str, + description: Optional[str] = None, + api_group_metadata: Optional[Dict[str, Any]] = None, # 存储阶段应用到的API分组元数据 + tags: Optional[List[str]] = None, # <-- Added tags parameter + overall_status: Status = Status.PENDING, + message: str = ""): + self.stage_id = stage_id + self.stage_name = stage_name + self.description = description + self.api_group_metadata = api_group_metadata + self.tags = tags if tags is not None else [] # <-- Store tags + self.overall_status = overall_status + self.message = message + self.executed_steps: List[ExecutedStageStepResult] = [] + self.final_context_snapshot: Optional[Dict[str, Any]] = None + self.start_time: datetime = datetime.now() + self.end_time: Optional[datetime] = None + self.duration: float = 0.0 + + def add_step_result(self, step_result: ExecutedStageStepResult): + self.executed_steps.append(step_result) + + def finalize_stage_result(self, final_context: Optional[Dict[str, Any]] = None): # Renamed from finalize_result + self.end_time = datetime.now() + self.duration = (self.end_time - self.start_time).total_seconds() + self.final_context_snapshot = final_context if final_context is not None else {} + + # 确定最终状态的逻辑可以放在这里,或者由编排器在调用后设置 + if not self.executed_steps and self.overall_status == ExecutedStageResult.Status.PENDING: + self.overall_status = ExecutedStageResult.Status.SKIPPED # 如果没有步骤执行,且状态未被其他方式设置 + self.message = self.message or "阶段中没有步骤被执行或所有步骤被跳过。" + # 更复杂的最终状态判定可能需要编排器逻辑 + + def to_dict(self) -> Dict[str, Any]: + return { + "stage_id": self.stage_id, + "stage_name": self.stage_name, + "description": self.description, + "api_group_metadata": self.api_group_metadata, + "tags": self.tags, # <-- Added tags to output + "overall_status": self.overall_status.value, + "message": self.message, + "duration_seconds": f"{self.duration:.2f}", + "start_time": self.start_time.isoformat(), + "end_time": self.end_time.isoformat() if self.end_time else None, + "executed_steps": [step.to_dict() for step in self.executed_steps], + "final_context_snapshot": self.final_context_snapshot + } # 默认的操作类型关键字映射 # 键是标准化的操作类型,值是可能出现在API标题中的关键字列表 @@ -45,31 +177,6 @@ DEFAULT_OPERATION_KEYWORDS: Dict[str, List[str]] = { # 可以根据需要添加更多通用操作类型 } - -class StageStepDefinition: - """定义API测试阶段中的单个步骤。""" - def __init__(self, - name: str, - endpoint_spec_lookup_key: Union[str, Dict[str, str]], # 例如 "GET /pets/{petId}" 或 {"method": "GET", "path": "/pets/{petId}"} 或操作类型 "add" - description: Optional[str] = None, # <--- 添加 description 参数 - request_overrides: Optional[Dict[str, Any]] = None, - expected_status_codes: Optional[List[int]] = None, - response_assertions: Optional[List[Callable[[APIResponseContext, Dict[str, Any]], List[ValidationResult]]]] = None, - outputs_to_context: Optional[Dict[str, str]] = None, - order: int = 0): # 新增执行顺序 - self.name = name - self.endpoint_spec_lookup_key = endpoint_spec_lookup_key - self.description = description # <--- 设置 description 属性 - self.request_overrides = request_overrides or {} - self.expected_status_codes = expected_status_codes or [] - self.response_assertions = response_assertions or [] - self.outputs_to_context = outputs_to_context or {} - self.order = order - - if not isinstance(self.endpoint_spec_lookup_key, (str, dict)): - raise ValueError("StageStepDefinition: endpoint_spec_lookup_key must be a string (operation type or method/path) or a dict {'method': 'X', 'path': 'Y'}") - - class BaseAPIStage: """ API测试阶段的基类。 @@ -84,22 +191,33 @@ class BaseAPIStage: # 由子类定义,表示此Stage中的API调用步骤 steps: List[StageStepDefinition] = [] + # 新增: 控制当此阶段不适用于任何API分组时,是否标记为失败 + fail_if_not_applicable_to_any_group: bool = False + + # 新增: 控制当一个步骤失败/错误时,是否继续执行后续步骤 + continue_on_failure: bool = False def __init__(self, api_group_metadata: Dict[str, Any], - apis_in_group: List[Dict[str, Any]], # 当前分组内所有API的定义列表 (字典格式) + apis_in_group: List[Union[YAPIEndpoint, SwaggerEndpoint]], # MODIFIED TYPE HINT llm_service: Optional[LLMService] = None, global_api_spec: Optional[ParsedAPISpec] = None, # <--- 修改类型注解 operation_keywords: Optional[Dict[str, List[str]]] = None): self.logger = logging.getLogger(f"{__name__}.{self.__class__.__name__}") self.current_api_group_metadata = api_group_metadata - self.current_apis_in_group = apis_in_group # 这些应该是已经解析好的API定义字典 + self.api_group_metadata = api_group_metadata # Let's ensure this common name is also available. + self.apis_in_group = apis_in_group # CORRECTED attribute name + self.global_api_spec: ParsedAPISpec = global_api_spec self.llm_service = llm_service - self.global_api_spec = global_api_spec # 保留 Optional[ParsedAPISpec] - self._operation_keywords = operation_keywords or DEFAULT_OPERATION_KEYWORDS + self._operation_keywords = operation_keywords if operation_keywords is not None else {} # CORRECTED assignment self._matched_endpoints: Dict[str, Dict[str, Any]] = {} # 存储按操作类型匹配到的端点定义 - self._match_api_endpoints_in_group() # 初始化时自动匹配 + + # Calling _match_api_endpoints_in_group() here might be problematic if it relies on + # subclass-specific setup or if it's intended to be called by the subclass. + # For now, let's comment it out from the base __init__ to avoid potential errors + # until its role and safety here are confirmed. + # self._match_api_endpoints_in_group() # 确保子类定义了ID if not self.id: @@ -107,22 +225,127 @@ class BaseAPIStage: self.logger.warning(f"BaseAPIStage subclass '{self.__class__.__name__}' does not have an 'id' attribute defined. Defaulting to class name: '{self.id}'. It is recommended to set a unique id.") # 对步骤进行排序 - self.steps = sorted(self.steps, key=lambda s: s.order) + if self.steps: # Ensure steps exist before trying to sort + self.steps = sorted(self.steps, key=lambda s: s.order) + else: + self.steps = [] + def get_api_spec_for_operation(self, + lookup_key: str, + global_api_spec: ParsedAPISpec, # 确保类型正确 + api_group_name: Optional[str] = None + ) -> Optional[APIOperationSpec]: + """ + 根据查找键从提供的API规范中获取特定API操作的详细信息。 + 这个方法需要子类根据其查找逻辑来实现,或者提供一个通用的基于operationId或path+method的查找。 - def is_applicable_to_api_group(self, api_group_metadata: Dict[str, Any], apis_in_group: List[Dict[str, Any]]) -> bool: + Args: + lookup_key: 用于查找API操作的键 (例如 operationId, "METHOD /path", 或自定义键)。 + global_api_spec: 完整的已解析API规范对象。 + api_group_name: (可选) 当前API分组的名称,用于更精确的查找或作用域限定。 + + Returns: + APIOperationSpec 对象如果找到,否则 None。 + """ + self.logger.debug(f"Attempting to find API spec for lookup_key='{lookup_key}', api_group='{api_group_name}'") + + # 尝试基于 operationId 查找 (如果 lookup_key 看起来像 operationId) + # 简单的启发式:不包含空格和斜杠的键可能是 operationId + if ' ' not in lookup_key and '/' not in lookup_key: + for endpoint in global_api_spec.endpoints: + endpoint_dict = endpoint.to_dict() # 将YAPIEndpoint或SwaggerEndpoint转换为标准化字典 + op_id = endpoint_dict.get('operationId') + if op_id == lookup_key: + # 检查此端点是否属于当前API分组 (如果提供了api_group_name) + if api_group_name: + tags = endpoint_dict.get('tags', []) + if api_group_name not in tags: + self.logger.debug(f"Endpoint with operationId '{lookup_key}' found, but not in group '{api_group_name}'. Tags: {tags}") + continue # 不在当前组,继续查找 + + self.logger.info(f"Found API for operationId '{lookup_key}' (group: {api_group_name}). Path: {endpoint_dict.get('path')}") + return APIOperationSpec( + method=endpoint_dict.get('method','').upper(), + path=endpoint_dict.get('path',''), + spec=endpoint_dict, # 传递整个端点字典作为规范 + operation_id=op_id, + summary=endpoint_dict.get('summary'), + description=endpoint_dict.get('description'), + tags=endpoint_dict.get('tags', []) + ) + + # 尝试基于 "METHOD /path" 格式的 lookup_key 查找 + # (这是一个更通用的查找方式,但可能需要更仔细的路径匹配逻辑) + parts = lookup_key.split(' ', 1) + if len(parts) == 2: + method_to_find = parts[0].upper() + path_to_find = parts[1] + for endpoint in global_api_spec.endpoints: + endpoint_dict = endpoint.to_dict() + if endpoint_dict.get('method','').upper() == method_to_find and endpoint_dict.get('path','') == path_to_find: + if api_group_name: + tags = endpoint_dict.get('tags', []) + if api_group_name not in tags: + self.logger.debug(f"Endpoint '{lookup_key}' found, but not in group '{api_group_name}'. Tags: {tags}") + continue + self.logger.info(f"Found API for method/path '{lookup_key}' (group: {api_group_name}).") + return APIOperationSpec( + method=method_to_find, + path=path_to_find, + spec=endpoint_dict, + operation_id=endpoint_dict.get('operationId'), + summary=endpoint_dict.get('summary'), + description=endpoint_dict.get('description'), + tags=endpoint_dict.get('tags', []) + ) + + self.logger.warning(f"Could not find API operation spec for lookup_key: '{lookup_key}' (api_group: '{api_group_name}') using default search logic (operationId or METHOD /path). Consider overriding get_api_spec_for_operation in your Stage class for custom lookup logic.") + return None + + # --- 生命周期钩子 --- + def before_stage(self, stage_context: Dict[str, Any], global_api_spec: ParsedAPISpec, api_group_name: Optional[str]): + """在测试阶段所有步骤执行之前调用。""" + self.logger.debug(f"Executing before_stage for stage '{self.id}', group '{api_group_name}'. Initial context: {stage_context}") + pass + + def after_stage(self, stage_result: ExecutedStageResult, stage_context: Dict[str, Any], global_api_spec: ParsedAPISpec, api_group_name: Optional[str]): + """在测试阶段所有步骤执行完毕之后调用(无论成功、失败或错误)。""" + self.logger.debug(f"Executing after_stage for stage '{self.id}', group '{api_group_name}'. Result status: {stage_result.overall_status.value}. Final context: {stage_context}") + pass + + def before_step(self, step: StageStepDefinition, stage_context: Dict[str, Any], global_api_spec: ParsedAPISpec, api_group_name: Optional[str]): + """在每个测试步骤执行之前调用。""" + self.logger.debug(f"Executing before_step for stage '{self.id}', step '{step.name}', group '{api_group_name}'. Current context: {stage_context}") + pass + + def after_step(self, step: StageStepDefinition, step_result: ExecutedStageStepResult, stage_context: Dict[str, Any], global_api_spec: ParsedAPISpec, api_group_name: Optional[str]): + """在每个测试步骤执行之后调用(无论成功、失败或错误)。""" + self.logger.debug(f"Executing after_step for stage '{self.id}', step '{step.name}', group '{api_group_name}'. Step status: {step_result.status.value}. Context after step: {stage_context}") + pass + + def is_applicable_to_api_group(self, api_group_name: Optional[str], global_api_spec: ParsedAPISpec) -> bool: """ 判断此测试阶段是否适用于给定的API分组。 - 子类可以重写此方法以实现更复杂的适用性逻辑。 - - Args: - api_group_metadata: API分组的元数据 (例如 YAPI category name/id 或 Swagger tag name/description)。 - apis_in_group: 该分组内的API端点定义列表。 - - Returns: - True 如果此阶段适用于该API分组,否则 False。 + 默认情况下,如果阶段没有定义特定的适用性逻辑(例如,通过`tags`属性或覆盖此方法), + 它将适用于所有API分组(如果 `api_group_name` 是 `None`,表示全局应用)或者 + 适用于名称与阶段 `tags` 中任何一个匹配的API分组。 + 子类可以覆盖此方法以实现更复杂的适用性判断逻辑。 """ - return True # 默认应用于所有分组 + if not self.tags: # 如果阶段没有定义任何标签 + self.logger.debug(f"Stage '{self.id}' has no specific tags defined. Applying to group '{api_group_name}' by default (true if group is None, or if specific logic isn't overridden to be more restrictive).") + return True # 默认适用于所有分组或全局 + + if api_group_name is None: + # 如果阶段有标签,但当前评估的是全局应用场景 (api_group_name is None), + # 那么它通常不应该在全局应用,除非设计者明确希望如此。 + # 这里的行为可以调整:如果阶段有标签,它是否还应该应用于"全局"? + # 当前逻辑:如果阶段有标签,它只应用于匹配这些标签的分组。 + self.logger.debug(f"Stage '{self.id}' has tags {self.tags}, but is being checked against global scope (api_group_name is None). Defaulting to not applicable to global if tags are present.") + return False + + applicable = api_group_name in self.tags + self.logger.debug(f"Stage '{self.id}' (tags: {self.tags}) applicability to API group '{api_group_name}': {applicable}") + return applicable def _match_api_endpoints_in_group(self): """ @@ -212,6 +435,10 @@ class BaseAPIStage: if not match_found and hasattr(endpoint_obj, 'operation_id') and endpoint_obj.operation_id == lookup_key: match_found = True + # 4. Check by YAPI _id (convert to string for safe comparison) + if not match_found and hasattr(endpoint_obj, '_id') and endpoint_obj._id is not None and str(endpoint_obj._id) == str(lookup_key): + match_found = True + if match_found: self.logger.info(f"'{self.id}': 找到匹配操作 '{lookup_key}' -> Method: {endpoint_obj.method}, Path: {endpoint_obj.path}") @@ -305,7 +532,7 @@ class ExecutedStageStepResult: FAILED = "失败" ERROR = "执行错误" SKIPPED = "跳过" - PENDING = "处理中" # 新增:表示步骤正在等待或预处理 + PENDING = "处理中" def __init__(self, step_name: str, @@ -313,14 +540,14 @@ class ExecutedStageStepResult: message: str = "", validation_points: Optional[List[ValidationResult]] = None, duration: float = 0.0, - api_call_detail: Optional[APICallDetail] = None, # 记录此步骤的API调用详情 + api_call_detail: Optional[APICallDetail] = None, extracted_outputs: Optional[Dict[str, Any]] = None, - description: Optional[str] = None, # <--- 添加 description - lookup_key: Optional[Union[str, Dict[str, str]]] = None, # <--- 添加 lookup_key - resolved_endpoint: Optional[str] = None, # <--- 添加 resolved_endpoint - request_details: Optional[Dict[str, Any]] = None, # <--- 添加 request_details - context_after_step: Optional[Dict[str, Any]] = None # <--- 添加 context_after_step - ): + description: Optional[str] = None, + lookup_key: Optional[Union[str, Dict[str, str]]] = None, + resolved_endpoint: Optional[str] = None, + request_details: Optional[Dict[str, Any]] = None, + context_after_step: Optional[Dict[str, Any]] = None + ): self.step_name = step_name self.status = status self.message = message @@ -329,52 +556,77 @@ class ExecutedStageStepResult: self.timestamp = time.time() self.api_call_detail = api_call_detail self.extracted_outputs = extracted_outputs or {} - self.description = description # <--- 设置属性 - self.lookup_key = lookup_key # <--- 设置属性 - self.resolved_endpoint = resolved_endpoint # <--- 设置属性 - self.request_details = request_details # <--- 设置属性 - self.context_after_step = context_after_step # <--- 设置属性 + self.description = description + self.lookup_key = lookup_key + self.resolved_endpoint = resolved_endpoint + self.request_details = request_details + self.context_after_step = context_after_step + + def finalize_step_result(self): + """如果步骤的主消息为空,则根据验证点结果更新它。""" + if not self.message and hasattr(self, 'validation_points') and self.validation_points: + failed_vp_messages = [ + vp.message for vp in self.validation_points + if isinstance(vp, ValidationResult) and not vp.passed and vp.message + ] + if failed_vp_messages: + self.message = "; ".join(failed_vp_messages) def to_dict(self) -> Dict[str, Any]: - vps_details = [] - if self.validation_points: # self.validation_points is List[Dict[str, Any]] - for vp_dict in self.validation_points: # vp_dict is a Dict from ValidationResult.to_dict() - # Access dictionary keys instead of object attributes - vp_details_content = vp_dict.get('details') - vp_passed = vp_dict.get('passed', False) - vp_message = vp_dict.get('message', '') - - processed_detail = {"passed": vp_passed, "message": vp_message} - - if vp_details_content and isinstance(vp_details_content, dict): - try: - #只取部分关键信息或确保可序列化 - if "status_code" in vp_details_content: - processed_detail["status_code"] = vp_details_content["status_code"] - # 不直接序列化整个 response body 以免过大 - # You might want to add other relevant serializable fields from vp_details_content - except TypeError: - # Update message if details were not serializable, though this part might be less reachable now - processed_detail["message"] = f"{vp_message} (Details not fully serializable)" + vps_details_for_output = [] + if self.validation_points: # self.validation_points is List[ValidationResult] + for vp_obj in self.validation_points: # vp_obj is a ValidationResult object + if not isinstance(vp_obj, ValidationResult): # Defensive check + logger.warning(f"Step '{self.step_name}': Found non-ValidationResult item in validation_points: {type(vp_obj)}") + continue - vps_details.append(processed_detail) + processed_detail = {"passed": vp_obj.passed, "message": vp_obj.message} + details_content = getattr(vp_obj, 'details', None) + if details_content and isinstance(details_content, dict): + try: + # 只取部分关键信息或确保可序列化 + if "status_code" in details_content: + processed_detail["status_code_in_validation"] = details_content["status_code"] + # 可以添加其他从 details_content 中提取的可序列化字段 + except TypeError: + # 如果 details 无法完全序列化,更新消息 + processed_detail["message"] = f"{vp_obj.message} (Details not fully serializable)" + elif details_content: # 如果 details 不是字典但存在 + processed_detail["details_type"] = type(details_content).__name__ + + vps_details_for_output.append(processed_detail) + + # 如果 finalize_step_result 已经被调用,self.message 可能已经更新 + # 否则,这里的逻辑会再次尝试整合 (如果 self.message 仍然为空) + current_message = self.message + if not current_message and self.validation_points: + failed_vp_messages = [ + vp_obj.message for vp_obj in self.validation_points + if isinstance(vp_obj, ValidationResult) and not vp_obj.passed and vp_obj.message + ] + if failed_vp_messages: + current_message = "; ".join(failed_vp_messages) return { "step_name": self.step_name, - "description": self.description, # <--- 添加到输出 - "lookup_key": self.lookup_key if isinstance(self.lookup_key, str) else str(self.lookup_key), # <--- 添加到输出 (确保字符串化) - "resolved_endpoint": self.resolved_endpoint, # <--- 添加到输出 + "description": self.description, + "lookup_key": str(self.lookup_key) if self.lookup_key is not None else None, + "resolved_endpoint": self.resolved_endpoint, "status": self.status.value, - "message": self.message or "; ".join([vp_dict.get('message', '') for vp_dict in self.validation_points if not vp_dict.get('passed')]), + "message": current_message, # 使用当前或整合后的消息 "duration_seconds": f"{self.duration:.4f}", "timestamp": time.strftime('%Y-%m-%dT%H:%M:%S%z', time.localtime(self.timestamp)), - "validation_points": vps_details, - "api_call_curl": self.api_call_detail.curl_command if self.api_call_detail else None, - "request_details": self.request_details, # <--- 添加到输出 - "extracted_outputs": {k: str(v)[:200] + '...' if isinstance(v, (str, bytes)) and len(v) > 200 else v + "validation_points": vps_details_for_output, + "api_call_curl": getattr(getattr(self, 'api_call_detail', None), 'curl_command', 'N/A'), + "request_details": self.request_details, + "extracted_outputs": {k: str(v)[:200] + '...' if isinstance(v, (str, bytes)) and len(v) > 200 else v for k, v in self.extracted_outputs.items()}, - "context_after_step_summary": {k: str(v)[:50] + '...' if isinstance(v, str) and len(v) > 50 else (type(v).__name__ if not isinstance(v, (str, int, float, bool, list, dict)) else v) for k,v in (self.context_after_step or {}).items()} # <--- 添加到输出 (摘要) + "context_after_step_summary": { + k: str(v)[:50] + '...' if isinstance(v, str) and len(v) > 50 else ( + type(v).__name__ if not isinstance(v, (str, int, float, bool, list, dict, type(None))) else v + ) for k,v in (self.context_after_step or {}).items() + } } @@ -391,25 +643,29 @@ class ExecutedStageResult: stage_id: str, stage_name: str, api_group_metadata: Optional[Dict[str, Any]] = None, - description: Optional[str] = None): # <--- 添加 description 参数 + description: Optional[str] = None, # <--- 添加 description 参数 + tags: Optional[List[str]] = None, # <-- Added tags parameter + overall_status: Status = Status.PENDING, + message: str = ""): self.stage_id = stage_id self.stage_name = stage_name self.description = description self.api_group_metadata = api_group_metadata - self.overall_status: ExecutedStageResult.Status = ExecutedStageResult.Status.PENDING - self.start_time: datetime = datetime.now() - self.end_time: Optional[datetime] = None - self.duration: float = 0.0 - self.message: Optional[str] = None + self.tags = tags if tags is not None else [] # <-- Store tags + self.overall_status = overall_status + self.message = message self.executed_steps: List[ExecutedStageStepResult] = [] # 确保初始化为空列表 self.final_context: Optional[Dict[str, Any]] = None # executed_steps_count 应该是一个属性,或者在 to_dict 中计算 + self.start_time: datetime = datetime.now() # Corrected + self.end_time: Optional[datetime] = None # Corrected type hint + self.duration: float = 0.0 def add_step_result(self, step_result: ExecutedStageStepResult): self.executed_steps.append(step_result) def finalize_stage_result(self, final_context: Optional[Dict[str, Any]] = None): - self.end_time = datetime.now() + self.end_time = datetime.now() # Corrected self.duration = (self.end_time - self.start_time).total_seconds() self.final_context = final_context @@ -452,6 +708,7 @@ class ExecutedStageResult: "stage_name": self.stage_name, "description": self.description, # <--- 添加 description 到输出 "api_group_name": self.api_group_metadata.get("name", "N/A"), + "tags": self.tags, # <-- Added tags to output "overall_status": self.overall_status.value, "duration_seconds": f"{self.duration:.2f}", "start_time": self.start_time.strftime('%Y-%m-%dT%H:%M:%S%z'), diff --git a/ddms_compliance_suite/stage_registry.py b/ddms_compliance_suite/stage_registry.py index c3502b6..ef07aa2 100644 --- a/ddms_compliance_suite/stage_registry.py +++ b/ddms_compliance_suite/stage_registry.py @@ -6,6 +6,7 @@ import importlib.util import inspect import logging from typing import List, Type, Dict, Optional +from pathlib import Path from .stage_framework import BaseAPIStage # 导入新的 BaseAPIStage @@ -13,111 +14,105 @@ logger = logging.getLogger(__name__) class StageRegistry: """ - 负责发现、加载和管理 BaseAPIStage 子类。 + 负责发现、加载和管理所有API测试阶段 (stages)。 """ def __init__(self, stages_dir: Optional[str] = None): """ 初始化 StageRegistry。 Args: - stages_dir: 存放自定义 BaseAPIStage Python文件的目录路径。 - 如果为 None 或无效路径,则不会加载任何自定义阶段。 + stages_dir: 存放自定义 APIStage Python文件的目录路径。 + 如果为 None,则不会加载任何阶段。 """ - self.logger = logging.getLogger(__name__) - self.stages_dir = stages_dir + self.stages_dir: Optional[Path] = Path(stages_dir) if stages_dir else None self._stages: Dict[str, Type[BaseAPIStage]] = {} self._errors: List[str] = [] - if self.stages_dir and os.path.isdir(self.stages_dir): - self.logger.info(f"StageRegistry: 开始从目录 '{self.stages_dir}' 加载测试阶段...") - self._discover_and_load_stages() - if self._errors: - for error in self._errors: - self.logger.error(f"StageRegistry: 加载阶段时发生错误: {error}") - self.logger.info(f"StageRegistry: 加载完成。共加载 {len(self._stages)} 个测试阶段。") - elif stages_dir: # 如果提供了stages_dir但不是有效目录 - self.logger.warning(f"StageRegistry: 提供的阶段目录 '{stages_dir}' 无效或不存在。将不会加载任何自定义阶段。") - else: # 如果 stages_dir 未提供 - self.logger.info("StageRegistry: 未提供阶段目录,将不会加载任何自定义阶段。") + if self.stages_dir: + if not self.stages_dir.is_dir(): + logger.warning(f"指定的阶段目录不存在或不是一个目录: {self.stages_dir}") + # Optionally, you could raise an error here or handle it as no stages found. + # For now, it will just result in no stages being loaded. + self.stages_dir = None # Prevent further processing if dir is invalid + else: + self.discover_stages() + else: + logger.info("没有提供阶段目录,将不加载任何自定义测试阶段。") - def _discover_and_load_stages(self): - """发现并加载指定目录下的所有 BaseAPIStage 子类。""" - if not self.stages_dir or not os.path.isdir(self.stages_dir): - self.logger.warning(f"StageRegistry: 阶段目录 '{self.stages_dir}' 无效或不存在,无法发现阶段。") + def discover_stages(self): + """从指定的目录中发现并加载所有 BaseAPIStage 子类。""" + if not self.stages_dir or not self.stages_dir.is_dir(): + logger.debug("阶段目录未设置或无效,跳过阶段发现。") return - self.logger.info(f"StageRegistry: 开始从目录 '{self.stages_dir}' 及其子目录发现测试阶段...") - found_count = 0 - # 使用 os.walk 进行递归扫描 - for root_dir, _, files in os.walk(self.stages_dir): + self._stages = {} + self._errors = [] + logger.info(f"开始从目录发现测试阶段: {self.stages_dir}") + + for root, _, files in os.walk(self.stages_dir): for filename in files: - if filename.endswith(".py") and not filename.startswith("__"): - module_name = filename[:-3] - module_path = os.path.join(root_dir, filename) # 使用 root_dir + if filename.endswith('.py') and not filename.startswith('_'): + file_path = Path(root) / filename + module_name = f"ddms_compliance_suite.stages.{file_path.stem}" # 可以根据需要调整模块命名 try: - spec = importlib.util.spec_from_file_location(module_name, module_path) + spec = importlib.util.spec_from_file_location(module_name, file_path) if spec and spec.loader: module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) - self.logger.debug(f"StageRegistry: 成功导入模块: {module_name} 从 {module_path}") + logger.debug(f"成功加载模块: {module_name} 从 {file_path}") + for name, cls in inspect.getmembers(module, inspect.isclass): if issubclass(cls, BaseAPIStage) and cls is not BaseAPIStage: - if not hasattr(cls, 'id') or not cls.id: # 检查id属性是否存在且不为空 - stage_id = cls.__name__ - self.logger.warning(f"测试阶段类 '{cls.__name__}' (在模块 '{module_name}' 来自路径 '{module_path}') 未定义有效 'id' 属性,将使用类名 '{stage_id}' 作为其ID。建议为每个阶段设置唯一的 'id'。") - else: + if hasattr(cls, 'id') and cls.id: stage_id = cls.id - - if stage_id in self._stages: - self.logger.warning(f"重复的测试阶段ID '{stage_id}' (来自类 '{cls.__name__}' 在模块 '{module_name}' 来自路径 '{module_path}')。之前的定义将被覆盖。请确保阶段ID唯一。") - self._stages[stage_id] = cls - found_count +=1 - self.logger.info(f"StageRegistry: 已注册测试阶段: '{stage_id}' (类: {cls.__name__}) 从模块 '{module_name}' (路径: {module_path})") + if stage_id in self._stages: + warning_msg = f"发现重复的阶段ID '{stage_id}' 在 {file_path}。已加载的阶段来自 {self._stages[stage_id].__module__}。将被忽略。" + logger.warning(warning_msg) + self._errors.append(warning_msg) + else: + self._stages[stage_id] = cls + logger.info(f"成功注册测试阶段: {stage_id} (来自 {module_name}.{name})") + else: + warning_msg = f"在 {file_path} 中发现的类 {name} 继承自 BaseAPIStage 但缺少 'id' 属性或ID为空。将被忽略。" + logger.warning(warning_msg) + self._errors.append(warning_msg) else: - self._errors.append(f"无法为文件 '{module_path}' 创建模块规范。") - self.logger.error(f"StageRegistry: 无法为文件 '{module_path}' 创建模块规范。") + error_msg = f"无法为文件创建模块规范: {file_path}" + logger.error(error_msg) + self._errors.append(error_msg) + except ImportError as e: - error_msg = f"导入模块 '{module_name}' (从 '{module_path}') 失败: {e}" + error_msg = f"导入模块 {module_name} 从 {file_path} 失败: {e}" + logger.error(error_msg, exc_info=True) self._errors.append(error_msg) - self.logger.error(f"StageRegistry: {error_msg}", exc_info=True) except Exception as e: - error_msg = f"加载或检查模块 '{module_name}' (从 '{module_path}') 时发生未知错误: {e}" + error_msg = f"加载或检查文件 {file_path} 时发生未知错误: {e}" + logger.error(error_msg, exc_info=True) self._errors.append(error_msg) - self.logger.error(f"StageRegistry: {error_msg}", exc_info=True) - if found_count == 0 and not self._errors: - self.logger.info(f"StageRegistry: 在 '{self.stages_dir}' 及其子目录中未找到符合条件的测试阶段文件或类。") - elif self._errors: - self.logger.warning(f"StageRegistry: 测试阶段发现过程中遇到 {len(self._errors)} 个错误。请检查日志。") - - # 注意:StageRegistry 目前没有像 TestCaseRegistry 那样的排序逻辑, - # 如果需要按特定顺序执行 Stages (独立于 API group),未来可以添加。 + logger.info(f"测试阶段发现完成。共加载 {len(self._stages)} 个阶段。发现 {len(self._errors)} 个错误。") - def get_stage_class_by_id(self, stage_id: str) -> Optional[Type[BaseAPIStage]]: - """根据ID获取已注册的测试阶段类。""" - return self._stages.get(stage_id) - - def get_all_stage_classes(self) -> List[Type[BaseAPIStage]]: - """获取所有已注册的测试阶段类的列表。""" + def get_all_stages(self) -> List[Type[BaseAPIStage]]: + """返回所有已发现和加载的测试阶段类的列表。""" return list(self._stages.values()) - def get_load_errors(self) -> List[str]: - """获取加载过程中发生的错误信息列表。""" + def get_stage_by_id(self, stage_id: str) -> Optional[Type[BaseAPIStage]]: + """根据ID获取特定的测试阶段类。""" + return self._stages.get(stage_id) + + def get_discovery_errors(self) -> List[str]: + """返回在发现过程中遇到的任何错误信息。""" return self._errors + def clear_stages(self): + """清空所有已加载的阶段和错误信息。""" + self._stages = {} + self._errors = [] + logger.debug("StageRegistry 已清空。") + def reload_stages(self): - """ - 重新加载所有测试阶段。会清空当前已加载的阶段和错误记录。 - """ - self.logger.info(f"StageRegistry: 正在从目录 '{self.stages_dir}' 重新加载所有测试阶段...") - self._stages.clear() - self._errors.clear() - if self.stages_dir and os.path.isdir(self.stages_dir): - self._discover_and_load_stages() - if self._errors: - for error in self._errors: - self.logger.error(f"StageRegistry (重载时): 加载阶段时发生错误: {error}") - self.logger.info(f"StageRegistry: 重新加载完成。共加载 {len(self._stages)} 个测试阶段。") - elif self.stages_dir: - self.logger.warning(f"StageRegistry (重载时): 提供的阶段目录 '{self.stages_dir}' 无效或不存在。没有加载任何自定义阶段。") + """清空并重新从目录加载所有阶段。""" + self.clear_stages() + if self.stages_dir: + self.discover_stages() else: - self.logger.info("StageRegistry (重载时): 未配置阶段目录,没有加载任何自定义阶段。") \ No newline at end of file + logger.info("没有配置阶段目录,无法重新加载阶段。") \ No newline at end of file diff --git a/ddms_compliance_suite/test_orchestrator.py b/ddms_compliance_suite/test_orchestrator.py index 0a106b0..70a0770 100644 --- a/ddms_compliance_suite/test_orchestrator.py +++ b/ddms_compliance_suite/test_orchestrator.py @@ -16,6 +16,8 @@ import datetime as dt from uuid import UUID from dataclasses import asdict as dataclass_asdict, is_dataclass import copy +from collections import defaultdict +from pathlib import Path from pydantic import BaseModel, Field, create_model, HttpUrl # Added HttpUrl for Literal type hint if needed from pydantic.networks import EmailStr @@ -30,10 +32,8 @@ from .utils import schema_utils from .utils.common_utils import format_url_with_path_params # 新增导入 -from .stage_framework import BaseAPIStage, ExecutedStageResult, ExecutedStageStepResult, StageStepDefinition -from .stage_registry import StageRegistry -from .scenario_framework import BaseAPIScenario # ScenarioRegistry was incorrectly imported from here -from .scenario_registry import ScenarioRegistry # Corrected import for ScenarioRegistry +from .stage_framework import BaseAPIStage, ExecutedStageResult, ExecutedStageStepResult, StageStepDefinition, APIOperationSpec +from .stage_registry import StageRegistry # For managing stages try: from .llm_utils.llm_service import LLMService @@ -174,33 +174,39 @@ class TestSummary: """测试结果摘要 (已更新以适应新的结果结构)""" def __init__(self): - self.total_endpoints_defined: int = 0 # YAPI/Swagger中定义的端点总数 - self.total_endpoints_tested: int = 0 # 实际执行了测试的端点数量 (至少有一个测试用例被执行) + self.total_endpoints_defined: int = 0 + self.total_endpoints_tested: int = 0 self.endpoints_passed: int = 0 self.endpoints_failed: int = 0 self.endpoints_partial_success: int = 0 self.endpoints_error: int = 0 - self.endpoints_skipped: int = 0 # 由于配置或过滤器,整个端点被跳过测试 + self.endpoints_skipped: int = 0 - self.total_test_cases_applicable: int = 0 # 所有端点上适用测试用例的总和 - self.total_test_cases_executed: int = 0 # 所有端点上实际执行的测试用例总数 + self.total_test_cases_applicable: int = 0 + self.total_test_cases_executed: int = 0 self.test_cases_passed: int = 0 self.test_cases_failed: int = 0 - self.test_cases_error: int = 0 # 测试用例代码本身出错 - self.test_cases_skipped_in_endpoint: int = 0 # 测试用例在端点执行中被跳过 + self.test_cases_error: int = 0 + self.test_cases_skipped_in_endpoint: int = 0 - # 新增:场景测试统计 -> 修改为 Stage 统计 self.total_stages_defined: int = 0 self.total_stages_executed: int = 0 self.stages_passed: int = 0 self.stages_failed: int = 0 - self.stages_skipped: int = 0 # 如果 Stage 因为 is_applicable 返回 False 或其他原因被跳过 - self.detailed_stage_results: List[ExecutedStageResult] = [] + self.stages_error: int = 0 + self.stages_skipped: int = 0 self.start_time = datetime.datetime.now() self.end_time: Optional[datetime.datetime] = None - self.detailed_results: List[TestResult] = [] # 将存储新的 TestResult (EndpointExecutionResult) 对象 + self.detailed_results: List[TestResult] = [] + + self.stage_results: List[ExecutedStageResult] = [] + self.api_call_details_summary: List[Dict[str, Any]] = [] + + self.errors: List[str] = [] + self.logger = logging.getLogger(__name__) + self.logger.info("TestSummary initialized.") def add_endpoint_result(self, result: TestResult): # result 现在是新的 TestResult 类型 self.detailed_results.append(result) @@ -239,19 +245,17 @@ class TestSummary: # 新增:用于场景统计的方法 -> 修改为 Stage 统计方法 def add_stage_result(self, result: ExecutedStageResult): - self.detailed_stage_results.append(result) - # 只有实际执行的 Stage 才会计入 executed 计数器 - # 如果一个Stage因为is_applicable=False而被跳过,它的executed_steps会是空的 - if result.overall_status != ExecutedStageResult.Status.SKIPPED or result.executed_steps: - self.total_stages_executed += 1 - + self.stage_results.append(result) if result.overall_status == ExecutedStageResult.Status.PASSED: self.stages_passed += 1 elif result.overall_status == ExecutedStageResult.Status.FAILED: self.stages_failed += 1 + elif result.overall_status == ExecutedStageResult.Status.ERROR: # Assuming ERROR maps to a fail count for summary + self.stages_error +=1 # or self.stages_failed +=1 depending on how you want to count errors elif result.overall_status == ExecutedStageResult.Status.SKIPPED: - self.stages_skipped +=1 - + self.stages_skipped += 1 + self.total_stages_executed +=1 + def set_total_stages_defined(self, count: int): self.total_stages_defined = count @@ -279,43 +283,40 @@ class TestSummary: def to_dict(self) -> Dict[str, Any]: data = { - "summary_metadata": { "start_time": self.start_time.isoformat(), "end_time": self.end_time.isoformat() if self.end_time else None, - "duration_seconds": f"{self.duration:.2f}", - }, - "endpoint_stats": { - "total_defined": self.total_endpoints_defined, - "total_tested": self.total_endpoints_tested, - "passed": self.endpoints_passed, - "failed": self.endpoints_failed, - "partial_success": self.endpoints_partial_success, - "error": self.endpoints_error, - "skipped": self.endpoints_skipped, - "success_rate_percentage": f"{self.endpoint_success_rate:.2f}", - }, - "test_case_stats": { - "total_applicable": self.total_test_cases_applicable, # 计划执行的测试用例总数 - "total_executed": self.total_test_cases_executed, # 实际执行的测试用例总数 - "passed": self.test_cases_passed, - "failed": self.test_cases_failed, - "error_in_execution": self.test_cases_error, - "skipped_during_endpoint_execution": self.test_cases_skipped_in_endpoint, - "success_rate_percentage": f"{self.test_case_success_rate:.2f}", + "duration_seconds": f"{self.duration:.2f}", + "overall_summary": { + "total_endpoints_defined": self.total_endpoints_defined, + "endpoints_tested": len(self.detailed_results), + "endpoints_passed": self.endpoints_passed, + "endpoints_failed": self.endpoints_failed, + "endpoints_error": self.endpoints_error, + "endpoints_skipped": self.endpoints_skipped, + "endpoints_partial_success": self.endpoints_partial_success, + "endpoint_success_rate": f"{self.endpoint_success_rate:.2f}%", + "total_test_cases_applicable": self.total_test_cases_applicable, + "total_test_cases_executed": self.total_test_cases_executed, + "test_cases_passed": self.test_cases_passed, + "test_cases_failed": self.test_cases_failed, + "test_cases_error": self.test_cases_error, + "test_cases_skipped_in_endpoint": self.test_cases_skipped_in_endpoint, + "test_case_success_rate": f"{self.test_case_success_rate:.2f}%", + + "total_stages_defined": self.total_stages_defined, + "total_stages_executed": self.total_stages_executed, + "stages_passed": self.stages_passed, + "stages_failed": self.stages_failed, + "stages_error": self.stages_error, + "stages_skipped": self.stages_skipped, + "stage_success_rate": f"{self.stage_success_rate:.2f}%" if self.total_stages_executed > 0 else "N/A", }, - "detailed_results": [result.to_dict() for result in self.detailed_results] + "errors": self.errors, + "endpoint_results": [res.to_dict() for res in self.detailed_results], + "stage_results": [res.to_dict() for res in self.stage_results], + "api_call_details_summary": self.api_call_details_summary } - # 新增:将场景测试结果添加到字典 -> 修改为 Stage 测试结果 - data["stage_stats"] = { - "total_defined": self.total_stages_defined, - "total_executed": self.total_stages_executed, - "passed": self.stages_passed, - "failed": self.stages_failed, - "skipped": self.stages_skipped, - "success_rate_percentage": f"{(self.stages_passed / self.total_stages_executed * 100) if self.total_stages_executed > 0 else 0:.2f}" - } - data["detailed_stage_results"] = [res.to_dict() for res in self.detailed_stage_results] return data def to_json(self, pretty=True) -> str: @@ -324,65 +325,62 @@ class TestSummary: def print_summary_to_console(self): # Renamed from print_summary # (Implementation can be more detailed based on the new stats) - print("\n===== 测试运行摘要 =====") - print(f"开始时间: {self.start_time.isoformat()}") + self.logger.info("-------------------- API Test Summary --------------------") + self.logger.info(f"Start Time: {self.start_time.isoformat()}") if self.end_time: - print(f"结束时间: {self.end_time.isoformat()}") - print(f"总耗时: {self.duration:.2f} 秒") + self.logger.info(f"End Time: {self.end_time.isoformat()}") + self.logger.info(f"Total Duration: {self.duration:.2f} seconds") - print("\n--- 端点统计 ---") - print(f"定义的端点总数: {self.total_endpoints_defined}") - print(f"实际测试的端点数: {self.total_endpoints_tested}") - print(f" 通过: {self.endpoints_passed}") - print(f" 失败: {self.endpoints_failed}") - print(f" 部分成功: {self.endpoints_partial_success}") - print(f" 执行错误: {self.endpoints_error}") - print(f" 跳过执行: {self.endpoints_skipped}") - print(f" 端点通过率: {self.endpoint_success_rate:.2f}%") + self.logger.info("--- Endpoints ---") + self.logger.info(f"Total Endpoints Defined: {self.total_endpoints_defined}") + self.logger.info(f"Endpoints Tested: {len(self.detailed_results)}") + self.logger.info(f" Passed: {self.endpoints_passed}") + self.logger.info(f" Failed: {self.endpoints_failed}") + self.logger.info(f" Error: {self.endpoints_error}") + self.logger.info(f" Skipped: {self.endpoints_skipped}") + self.logger.info(f" Partial Success: {self.endpoints_partial_success}") + self.logger.info(f" Success Rate: {self.endpoint_success_rate:.2f}%") - print("\n--- 测试用例统计 ---") - print(f"适用的测试用例总数 (计划执行): {self.total_test_cases_applicable}") - print(f"实际执行的测试用例总数: {self.total_test_cases_executed}") - print(f" 通过: {self.test_cases_passed}") - print(f" 失败: {self.test_cases_failed}") - print(f" 执行错误 (测试用例代码问题): {self.test_cases_error}") - print(f" 跳过 (在端点内被跳过): {self.test_cases_skipped_in_endpoint}") - print(f" 测试用例通过率: {self.test_case_success_rate:.2f}%") - - # 可选:打印失败的端点和测试用例摘要 - failed_endpoints = [res for res in self.detailed_results if res.overall_status == TestResult.Status.FAILED] - if failed_endpoints: - print("\n--- 失败的端点摘要 ---") - for ep_res in failed_endpoints: - print(f" 端点: {ep_res.endpoint_id} ({ep_res.endpoint_name}) - 状态: {ep_res.overall_status.value}") - for tc_res in ep_res.executed_test_cases: - if tc_res.status == ExecutedTestCaseResult.Status.FAILED: - print(f" - 测试用例失败: {tc_res.test_case_id} ({tc_res.test_case_name})") - for vp in tc_res.validation_points: - if not vp.passed: - print(f" - 验证点: {vp.message}") - - # 新增:打印场景测试摘要 -> 修改为 Stage 测试摘要 - if self.total_stages_defined > 0 or self.total_stages_executed > 0: - print("\n--- API测试阶段 (Stage) 统计 ---") - print(f"定义的API阶段总数: {self.total_stages_defined}") - print(f"实际执行的API阶段数: {self.total_stages_executed}") - print(f" 通过: {self.stages_passed}") - print(f" 失败: {self.stages_failed}") - print(f" 跳过: {self.stages_skipped}") - if self.total_stages_executed > 0: - print(f" 阶段通过率: {(self.stages_passed / self.total_stages_executed * 100):.2f}%") + self.logger.info("--- Test Cases ---") + self.logger.info(f"Total Test Cases Applicable: {self.total_test_cases_applicable}") + self.logger.info(f"Total Test Cases Executed: {self.total_test_cases_executed}") + self.logger.info(f" Passed: {self.test_cases_passed}") + self.logger.info(f" Failed: {self.test_cases_failed}") + self.logger.info(f" Error: {self.test_cases_error}") + self.logger.info(f" Skipped (within endpoints): {self.test_cases_skipped_in_endpoint}") + self.logger.info(f" Success Rate: {self.test_case_success_rate:.2f}%") - failed_stages = [res for res in self.detailed_stage_results if res.overall_status == ExecutedStageResult.Status.FAILED] - if failed_stages: - print("\n--- 失败的API阶段摘要 ---") - for st_res in failed_stages: - print(f" 阶段: {st_res.stage_id} ({st_res.stage_name}) - 应用于分组: '{st_res.api_group_metadata.get('name', 'N/A')}' - 状态: {st_res.overall_status.value}") - for step_res in st_res.executed_steps: - if step_res.status == ExecutedStageStepResult.Status.FAILED: - print(f" - 步骤失败: {step_res.step_name} - 消息: {step_res.message}") - elif step_res.status == ExecutedStageStepResult.Status.ERROR: - print(f" - 步骤错误: {step_res.step_name} - 消息: {step_res.message}") + self.logger.info("--- Stages ---") + self.logger.info(f"Total Stages Defined: {self.total_stages_defined}") + self.logger.info(f"Total Stages Executed: {self.total_stages_executed}") + self.logger.info(f" Passed: {self.stages_passed}") + self.logger.info(f" Failed: {self.stages_failed}") + self.logger.info(f" Error: {self.stages_error}") + self.logger.info(f" Skipped: {self.stages_skipped}") + if self.total_stages_executed > 0: + self.logger.info(f" Success Rate: {self.stage_success_rate:.2f}%") + else: + self.logger.info(" Success Rate: N/A (No stages executed)") + + + if self.errors: + self.logger.error("--- Orchestration Errors ---") + for err in self.errors: + self.logger.error(err) + + self.logger.info("--------------------------------------------------------") + + def add_api_call_details(self, details: Dict[str, Any]): + self.api_call_details_summary.append(details) + + def add_error(self, error_message: str): + self.errors.append(error_message) + + @property + def stage_success_rate(self) -> float: + if self.total_stages_executed == 0: + return 0.0 + return (self.stages_passed / self.total_stages_executed) * 100 class APITestOrchestrator: """ @@ -396,10 +394,11 @@ class APITestOrchestrator: 6. 生成测试报告和API调用详情 """ + MAX_RECURSION_DEPTH_PYDANTIC = 10 # 新增一个常量用于 Pydantic 模型创建的递归深度限制 + def __init__(self, base_url: str, custom_test_cases_dir: Optional[str] = None, - scenarios_dir: Optional[str] = None, # Keep existing scenarios_dir - stages_dir: Optional[str] = None, # New: Directory for stages + stages_dir: Optional[str] = None, llm_api_key: Optional[str] = None, llm_base_url: Optional[str] = None, llm_model_name: Optional[str] = None, @@ -409,84 +408,66 @@ class APITestOrchestrator: use_llm_for_headers: bool = False, output_dir: Optional[str] = None ): - self.base_url = base_url.rstrip('/') self.logger = logging.getLogger(__name__) - self.parser = InputParser() # Initialize the parser - self.api_caller = APICaller() # APICaller does not take base_url in __init__ - self.json_validator = JSONSchemaValidator() - - self.test_case_registry: Optional[TestCaseRegistry] = None # Initialize as Optional - if custom_test_cases_dir: - self.logger.info(f"正在从目录加载自定义测试用例: {custom_test_cases_dir}") - try: - self.test_case_registry = TestCaseRegistry(test_cases_dir=custom_test_cases_dir) - self.logger.info(f"加载了 {len(self.test_case_registry.get_all_test_case_classes())} 个自定义测试用例。") - except Exception as e: - self.logger.error(f"初始化 TestCaseRegistry 或加载测试用例失败: {e}", exc_info=True) - self.test_case_registry = None #确保在出错时 registry 为 None - else: - self.logger.info("未提供自定义测试用例目录,跳过加载自定义测试用例。") + self.base_url = base_url.rstrip('/') + self.api_caller = APICaller() + self.test_case_registry = TestCaseRegistry(test_cases_dir=custom_test_cases_dir) + self.global_api_call_details: List[APICallDetail] = [] - # Scenario Registry (existing) - self.scenario_registry: Optional[ScenarioRegistry] = None # Initialize as Optional - if scenarios_dir: - self.logger.info(f"正在从目录加载API场景: {scenarios_dir}") - self.scenario_registry = ScenarioRegistry() - self.scenario_registry.discover_and_load_scenarios(scenarios_dir) - self.logger.info(f"加载了 {len(self.scenario_registry.get_all_scenario_classes())} 个API场景。") - else: - self.logger.info("未提供API场景目录,跳过加载场景测试。") - - # Stage Registry (New) + self.stages_dir = stages_dir self.stage_registry: Optional[StageRegistry] = None - if stages_dir: - self.logger.info(f"APITestOrchestrator: 尝试从目录加载API测试阶段: {stages_dir}") - try: - self.stage_registry = StageRegistry(stages_dir=stages_dir) # Pass stages_dir to constructor - # Discovery now happens within StageRegistry.__init__ - self.logger.info(f"APITestOrchestrator: StageRegistry 初始化完毕。加载的API测试阶段数量: {len(self.stage_registry.get_all_stage_classes())}") - load_errors = self.stage_registry.get_load_errors() - if load_errors: - for err in load_errors: - self.logger.error(f"APITestOrchestrator: StageRegistry 加载错误: {err}") - except Exception as e: - self.logger.error(f"APITestOrchestrator: 初始化 StageRegistry 时发生错误: {e}", exc_info=True) - self.stage_registry = None # 确保出错时为 None - else: - self.logger.info("APITestOrchestrator: 未提供API测试阶段目录,跳过加载阶段测试。") - # LLM Service Initialization self.llm_service: Optional[LLMService] = None - if LLMService and llm_api_key: + self.llm_config = { + "use_for_request_body": use_llm_for_request_body, + "use_for_path_params": use_llm_for_path_params, + "use_for_query_params": use_llm_for_query_params, + "use_for_headers": use_llm_for_headers, + } + + if llm_api_key and LLMService: try: self.llm_service = LLMService(api_key=llm_api_key, base_url=llm_base_url, model_name=llm_model_name) - self.logger.info(f"LLMService initialized successfully with model: {llm_model_name or 'default'}.") + self.logger.info(f"LLMService initialized with model: {self.llm_service.model_name}.") + if not any(self.llm_config.values()): + self.logger.info("LLMService is initialized, but no LLM generation flags (--use-llm-for-*) are enabled.") except Exception as e: - self.logger.error(f"LLMService initialization failed: {e}. LLM features will be disabled.", exc_info=True) - self.llm_service = None - elif LLMService and not llm_api_key: - self.logger.info("LLMService is available, but LLM API key was not provided. LLM features will be disabled.") - - self.use_llm_for_request_body = use_llm_for_request_body - self.use_llm_for_path_params = use_llm_for_path_params - self.use_llm_for_query_params = use_llm_for_query_params - self.use_llm_for_headers = use_llm_for_headers + self.logger.error(f"Failed to initialize LLMService: {e}. LLM features will be disabled.", exc_info=True) + self.llm_service = None + elif not LLMService and any(self.llm_config.values()): + self.logger.warning("LLM usage flags are set, but LLMService components are not available. LLM features will be disabled.") + for key in self.llm_config: self.llm_config[key] = False + elif not llm_api_key: + self.logger.info("LLM API key not provided. LLM-based data generation will be disabled.") + for key in self.llm_config: self.llm_config[key] = False - self.llm_endpoint_params_cache: Dict[str, Dict[str, Any]] = {} + if self.stages_dir: + self.stage_registry = StageRegistry(stages_dir=self.stages_dir) + if self.stage_registry and self.stage_registry.get_discovery_errors(): + for err in self.stage_registry.get_discovery_errors(): + self.logger.error(f"Error loading stage: {err}") + elif self.stage_registry: + self.logger.info(f"StageRegistry initialized. Loaded {len(self.stage_registry.get_all_stages())} stages.") # Changed from get_all_stage_classes + else: + self.logger.info("No stages_dir provided, stage testing will be skipped.") - if (self.use_llm_for_request_body or \ - self.use_llm_for_path_params or \ - self.use_llm_for_query_params or \ - self.use_llm_for_headers) and not self.llm_service: - self.logger.warning("LLM-based data generation was enabled, but LLMService is not available or failed to initialize. Disabling all LLM features.") - self.use_llm_for_request_body = False - self.use_llm_for_path_params = False - self.use_llm_for_query_params = False - self.use_llm_for_headers = False + self.output_dir_path = Path(output_dir) if output_dir else Path("./test_reports_orchestrator") + try: + self.output_dir_path.mkdir(parents=True, exist_ok=True) + self.logger.info(f"Orchestrator output directory set to: {self.output_dir_path.resolve()}") + except OSError as e: + self.logger.warning(f"Could not create orchestrator output directory {self.output_dir_path}: {e}. Falling back to current directory.") + self.output_dir_path = Path(".") + + self.schema_cache: Dict[str, Type[BaseModel]] = {} + self.model_name_counts: Dict[str, int] = defaultdict(int) + self.parser = InputParser() + self.json_resolver_cache: Dict[str, Any] = {} + self.json_validator = JSONSchemaValidator() def get_api_call_details(self) -> List[APICallDetail]: """Returns the collected list of API call details.""" - return self.api_call_details_log + return self.global_api_call_details def _should_use_llm_for_param_type( self, @@ -504,19 +485,19 @@ class APITestOrchestrator: tc_specific_flag: Optional[bool] = None if param_type_key == "body": - global_flag = self.use_llm_for_request_body + global_flag = self.llm_config["use_for_request_body"] if test_case_instance: tc_specific_flag = test_case_instance.use_llm_for_body elif param_type_key == "path_params": - global_flag = self.use_llm_for_path_params + global_flag = self.llm_config["use_for_path_params"] if test_case_instance: tc_specific_flag = test_case_instance.use_llm_for_path_params elif param_type_key == "query_params": - global_flag = self.use_llm_for_query_params + global_flag = self.llm_config["use_for_query_params"] if test_case_instance: tc_specific_flag = test_case_instance.use_llm_for_query_params elif param_type_key == "headers": - global_flag = self.use_llm_for_headers + global_flag = self.llm_config["use_for_headers"] if test_case_instance: tc_specific_flag = test_case_instance.use_llm_for_headers else: @@ -1053,7 +1034,7 @@ class APITestOrchestrator: response_call_start_time = time.time() # api_response_obj = self.api_caller.call_api(api_request_obj) api_response, api_call_detail = self.api_caller.call_api(api_request_obj) - self.api_call_details_log.append(api_call_detail) # 记录日志 + self.global_api_call_details.append(api_call_detail) # 记录日志 response_call_elapsed_time = time.time() - response_call_start_time @@ -1540,7 +1521,7 @@ class APITestOrchestrator: custom_test_cases_dir: Optional[str] = None ) -> Tuple[TestSummary, Optional[ParsedAPISpec]]: self.logger.info(f"准备从YAPI文件运行测试用例: {yapi_file_path}") - self.api_call_details_log = [] # 为新的测试用例运行重置API调用日志 + self.global_api_call_details = [] # 为新的测试用例运行重置API调用日志 parsed_yapi = self.parser.parse_yapi_spec(yapi_file_path) summary = TestSummary() @@ -1565,7 +1546,7 @@ class APITestOrchestrator: custom_test_cases_dir: Optional[str] = None ) -> Tuple[TestSummary, Optional[ParsedAPISpec]]: self.logger.info(f"准备从Swagger文件运行测试用例: {swagger_file_path}") - self.api_call_details_log = [] # 为新的测试用例运行重置API调用日志 + self.global_api_call_details = [] # 为新的测试用例运行重置API调用日志 parsed_swagger = self.parser.parse_swagger_spec(swagger_file_path) summary = TestSummary() @@ -1960,8 +1941,10 @@ class APITestOrchestrator: self.logger.debug(f"[阶段步骤 '{step_name_for_log}'] 解析上下文路径: '{path_expression}' 来自模板 '{value_template}'") try: current_value = stage_context + # Improved path splitting to handle array indices correctly + # e.g. items[0].id -> ["items", "0", "id"] parts = re.split(r'\.(?![^\[]*\])|\[|\]', path_expression) - parts = [p for p in parts if p] # 移除空字符串 + parts = [p for p in parts if p] # Remove empty strings from split, e.g. from "[0]" for part in parts: if isinstance(current_value, dict): @@ -1969,75 +1952,105 @@ class APITestOrchestrator: elif isinstance(current_value, list) and part.isdigit(): current_value = current_value[int(part)] else: - raise KeyError(f"路径部分 '{part}' 无法从当前值类型 {type(current_value)} 中解析") - self.logger.info(f"[测试阶段步骤 '{step_name_for_log}'] 从上下文解析到值 '{current_value}' (路径: '{path_expression}')") + raise KeyError(f"路径部分 '{part}' 无法从当前值类型 {type(current_value)} (路径: {path_expression}) 中解析") + self.logger.info(f"[测试阶段步骤 '{step_name_for_log}'] 从上下文解析到值 '{str(current_value)[:100]}...' (路径: '{path_expression}')") return current_value except (KeyError, IndexError, TypeError) as e: - self.logger.error(f"[测试阶段步骤 '{step_name_for_log}'] 从阶段上下文解析路径 '{path_expression}' 失败: {e}", exc_info=True) - return None # 或抛出错误,或返回原始模板以提示错误 - return value_template # 不是有效的占位符,返回原始字符串 + self.logger.error(f"[测试阶段步骤 '{step_name_for_log}'] 从阶段上下文解析路径 '{path_expression}' 失败: {e}", exc_info=False) # exc_info=False to reduce noise for expected failures + return None # Return None or original template to indicate failure + return value_template # Not a valid placeholder, return original string elif isinstance(value_template, list): return [self._resolve_value_from_context_or_literal(item, stage_context, step_name_for_log) for item in value_template] elif isinstance(value_template, dict): - return {k: self._resolve_value_from_context_or_literal(v, stage_context, step_name_for_log) for k, v in value_template.items()} # Corrected scenario_context to stage_context + return {k: self._resolve_value_from_context_or_literal(v, stage_context, step_name_for_log) for k, v in value_template.items()} else: - return value_template # 其他类型直接返回 + return value_template # Other types directly return - def _extract_outputs_to_context(self, response_content: Any, outputs_map: Dict[str, str], stage_context: Dict[str, Any], step_name_for_log: str): + def _extract_outputs_to_context(self, response_data: Dict[str, Any], outputs_map: Dict[str, str], stage_context: Dict[str, Any], step_name_for_log: str): """ 根据 outputs_map 从API响应中提取值并存入 stage_context。 Args: - response_content: API响应的内容 (通常是解析后的JSON字典)。 - outputs_map: 定义如何提取的字典,例如 {"user_id": "data.id", "token": "header.X-Auth-Token"}。 + response_data: 包含 'json_content', 'headers', 'status_code' 的字典。 + outputs_map: 定义如何提取的字典,例如 {"user_id": "body.data.id", "token": "header.X-Auth-Token"}。 支持 "body.", "header.", "status_code" 作为路径前缀。 stage_context: 要更新的阶段上下文。 step_name_for_log: 当前步骤名称,用于日志。 """ - if not outputs_map or response_content is None: + if not outputs_map or response_data is None: return for context_var_name, extraction_path in outputs_map.items(): - self.logger.debug(f"[阶段步骤 '{step_name_for_log}'] 尝试提取 '{extraction_path}' 到上下文变量 '{context_var_name}'") + self.logger.debug(f"[{step_name_for_log}] 尝试提取 '{extraction_path}' 到上下文变量 '{context_var_name}'") value_to_extract = None try: - current_data = response_content path_parts = extraction_path.split('.') - source_type = path_parts[0].lower() actual_path_parts = path_parts[1:] + target_obj = None if source_type == "body": - target_obj = current_data.get('json_content') + target_obj = response_data.get('json_content') elif source_type == "header": - target_obj = current_data.get('headers') + target_obj = response_data.get('headers') + # Header keys are case-insensitive, normalize target_obj keys for lookup if it's header + if target_obj and actual_path_parts: + normalized_headers = {k.lower(): v for k, v in target_obj.items()} + # Check if the first part of actual_path is a key in normalized_headers + # This is for direct header access like header.X-Some-Token + if actual_path_parts[0].lower() in normalized_headers: + target_obj = normalized_headers + actual_path_parts[0] = actual_path_parts[0].lower() # Ensure lookup is also lower + # If not a direct key, it might be a deeper path within a structured header (less common) + # For simplicity, we'll assume direct access for now unless target_obj is not dict. + elif source_type == "status_code": if not actual_path_parts: - value_to_extract = current_data.get('status_code') + value_to_extract = response_data.get('status_code') stage_context[context_var_name] = value_to_extract - self.logger.info(f"[阶段步骤 '{step_name_for_log}'] 提取到 '{context_var_name}': {value_to_extract}") + self.logger.info(f"[{step_name_for_log}] 提取到 '{context_var_name}': {value_to_extract}") continue else: - self.logger.warning(f"[阶段步骤 '{step_name_for_log}'] status_code 不支持进一步的路径提取: '{extraction_path}'") + self.logger.warning(f"[{step_name_for_log}] status_code 不支持进一步的路径提取: '{extraction_path}'") continue else: - self.logger.warning(f"[阶段步骤 '{step_name_for_log}'] 未知的提取源类型 '{source_type}' in path '{extraction_path}'") + self.logger.warning(f"[{step_name_for_log}] 未知的提取源类型 '{source_type}' in path '{extraction_path}'") continue if target_obj is None and source_type != "status_code": - self.logger.warning(f"[阶段步骤 '{step_name_for_log}'] 提取源 '{source_type}' 为空或不存在。") + self.logger.warning(f"[{step_name_for_log}] 提取源 '{source_type}' 为空或不存在。无法提取 '{extraction_path}'") continue temp_val = target_obj - for part in actual_path_parts: + for part_idx, part in enumerate(actual_path_parts): if isinstance(temp_val, dict): - temp_val = temp_val.get(part) + # For headers, we might have already normalized keys. If not, try original then lower. + if source_type == "header" and part.lower() in temp_val: # Already normalized + temp_val = temp_val.get(part.lower()) + elif part in temp_val: # Original case or body + temp_val = temp_val.get(part) + elif source_type == "header" and part.lower() not in temp_val: # Final attempt for header after initial direct check failed + self.logger.debug(f"[{step_name_for_log}] Header key '{part}' (path: '{extraction_path}') not found directly, checking case-insensitively if not already done.") + # This part might be redundant if the earlier normalization handled it for direct keys. + # This mainly helps if the initial actual_path_parts[0] wasn't the direct key but a deeper one. + found_case_insensitive = False + for k_header, v_header in temp_val.items(): + if k_header.lower() == part.lower(): + temp_val = v_header + found_case_insensitive = True + break + if not found_case_insensitive: + temp_val = None; break + else: # Not found in dict + temp_val = None; break elif isinstance(temp_val, list) and part.isdigit(): idx = int(part) if 0 <= idx < len(temp_val): temp_val = temp_val[idx] - else: + else: + self.logger.warning(f"[{step_name_for_log}] 数组索引 '{idx}' (来自部分 '{part}') 超出范围 for '{extraction_path}'. 列表长度: {len(temp_val)}.") temp_val = None; break else: + self.logger.warning(f"[{step_name_for_log}] 无法从类型 {type(temp_val)} (路径 '{'.'.join(actual_path_parts[:part_idx+1])}') 中提取部分 '{part}'. 路径: '{extraction_path}'") temp_val = None; break if temp_val is None: break @@ -2045,230 +2058,184 @@ class APITestOrchestrator: if value_to_extract is not None: stage_context[context_var_name] = value_to_extract - self.logger.info(f"[阶段步骤 '{step_name_for_log}'] 提取到上下文 '{context_var_name}': {str(value_to_extract)[:100]}...") + self.logger.info(f"[{step_name_for_log}] 提取到上下文 '{context_var_name}': {str(value_to_extract)[:100]}...") else: - self.logger.warning(f"[阶段步骤 '{step_name_for_log}'] 未能从路径 '{extraction_path}' 提取到值。") + self.logger.warning(f"[{step_name_for_log}] 未能从路径 '{extraction_path}' 提取到值。最终 temp_val 为 None.") except Exception as e: - self.logger.error(f"[阶段步骤 '{step_name_for_log}'] 从路径 '{extraction_path}' 提取值时出错: {e}", exc_info=True) + self.logger.error(f"[{step_name_for_log}] 从路径 '{extraction_path}' 提取值时出错: {e}", exc_info=True) - def execute_single_stage(self, - stage_instance: BaseAPIStage, - parsed_spec: ParsedAPISpec, - api_group_name: Optional[str] - ) -> ExecutedStageResult: + def execute_single_stage( + self, + stage_instance: BaseAPIStage, + parsed_spec: ParsedAPISpec, # This is the global ParsedAPISpec object + api_group_name: Optional[str] # Name of the current YAPI category or Swagger tag, or None if global + ) -> ExecutedStageResult: stage_start_time = datetime.datetime.now() stage_context: Dict[str, Any] = {} executed_steps_results: List[ExecutedStageStepResult] = [] + stage_id = stage_instance.id + stage_name = stage_instance.name + + self.logger.info(f"开始执行测试阶段: ID='{stage_id}', Name='{stage_name}', API分组='{api_group_name or 'Global'}'") + stage_result = ExecutedStageResult( - stage_id=stage_instance.id, - stage_name=stage_instance.name, + stage_id=stage_id, + stage_name=stage_name, description=stage_instance.description, - api_group_metadata={"name": api_group_name} if api_group_name else None # <--- 修改参数名并包装为字典 - # overall_status is set by default in __init__ + api_group_metadata=stage_instance.current_api_group_metadata, # Changed from api_group_metadata + tags=stage_instance.tags ) try: - self.logger.debug(f"Calling before_stage for stage '{stage_instance.id}'. Context: {stage_context}") - # Ensure all parameters passed to before_stage are accepted by its definition + self.logger.debug(f"调用 stage '{stage_id}' 的 before_stage 钩子。初始上下文: {stage_context}") stage_instance.before_stage(stage_context=stage_context, global_api_spec=parsed_spec, api_group_name=api_group_name) - except Exception as e: - self.logger.error(f"Error in before_stage for stage '{stage_instance.id}': {e}", exc_info=True) - # stage_result.overall_status = ExecutedStageResult.Status.ERROR # This is already set if ERROR is present in Enum - # The following line should correctly set the status if an error occurs in before_stage - if hasattr(ExecutedStageResult.Status, 'ERROR'): - stage_result.overall_status = ExecutedStageResult.Status.ERROR - else: # Fallback if somehow ERROR is still not in the enum (should not happen now) - stage_result.overall_status = ExecutedStageResult.Status.FAILED - stage_result.message = f"before_stage hook failed: {e}" - stage_result.finalize_stage_result(final_context=stage_context) # <--- 更正方法名, 移除多余参数 + except Exception as e_bs: + self.logger.error(f"Stage '{stage_id}' 的 before_stage 钩子执行失败: {e_bs}", exc_info=True) + stage_result.overall_status = ExecutedStageResult.Status.ERROR + stage_result.message = f"before_stage hook failed: {e_bs}" + stage_result.finalize_stage_result(final_context=stage_context) return stage_result - # Assume PASSED, will be changed on any step failure/error not overridden by continue_on_failure logic - # The final status is determined more comprehensively at the end. - # stage_result.overall_status = ExecutedStageResult.Status.PASSED - for step_index, step_definition in enumerate(stage_instance.steps): step_start_time = datetime.datetime.now() - step_name = step_definition.name or f"Step {step_index + 1}" - step_message = "" - step_validation_points: List[ValidationResult] = [] + current_step_name = step_definition.name or f"Step {step_index + 1}" + step_log_prefix = f"Stage '{stage_id}', Step '{current_step_name}'" + self.logger.info(f"{step_log_prefix}: 开始执行.") + current_step_result = ExecutedStageStepResult( - step_name=step_name, - description=getattr(step_definition, 'description', None), # <--- 使用 getattr + step_name=current_step_name, + description=step_definition.description, lookup_key=step_definition.endpoint_spec_lookup_key, - status=ExecutedStageStepResult.Status.PENDING - # 其他参数 (如 resolved_endpoint, request_details, api_call_details, context_after_step) - # 会在步骤执行过程中或之后被填充到 current_step_result 对象上 + status=ExecutedStageStepResult.Status.PENDING # Initial status ) try: - self.logger.debug(f"Calling before_step for stage '{stage_instance.id}', step '{step_name}'. Context: {stage_context}") - # Corrected: 'step' instead of 'step_definition' to match method signature - # Ensure all parameters passed are accepted by before_step definition + self.logger.debug(f"{step_log_prefix}: 调用 before_step 钩子. 上下文: {stage_context}") stage_instance.before_step(step=step_definition, stage_context=stage_context, global_api_spec=parsed_spec, api_group_name=api_group_name) - self.logger.info(f"Stage '{stage_instance.id}', Step '{step_name}': Looking up endpoint key='{step_definition.endpoint_spec_lookup_key}', group='{api_group_name}'") + self.logger.debug(f"{step_log_prefix}: 查找端点定义. Key='{step_definition.endpoint_spec_lookup_key}', Group='{api_group_name}'") api_op_spec: Optional[APIOperationSpec] = stage_instance.get_api_spec_for_operation( - lookup_key=step_definition.endpoint_spec_lookup_key, # Pass lookup_key by name - global_api_spec=parsed_spec, # Pass global_api_spec by name - api_group_name=api_group_name # Pass api_group_name by name + lookup_key=step_definition.endpoint_spec_lookup_key, + global_api_spec=parsed_spec, + api_group_name=api_group_name ) if not api_op_spec or not api_op_spec.spec: current_step_result.status = ExecutedStageStepResult.Status.ERROR - current_step_result.message = f"Could not find API operation for key '{step_definition.endpoint_spec_lookup_key}' and group '{api_group_name}'." - self.logger.error(f"Stage '{stage_instance.id}', Step '{step_name}': {current_step_result.message}") + current_step_result.message = f"找不到端点定义 (Key: '{step_definition.endpoint_spec_lookup_key}', Group: '{api_group_name}')." + self.logger.error(f"{step_log_prefix}: {current_step_result.message}") else: - actual_endpoint_spec_dict = api_op_spec.spec - current_step_result.resolved_endpoint = f"{api_op_spec.method.upper()} {api_op_spec.path}" if api_op_spec.method and api_op_spec.path else "Unknown Endpoint" - current_step_result.status = ExecutedStageStepResult.Status.PASSED # Assume pass, changed on failure + actual_endpoint_spec_dict = api_op_spec.spec + current_step_result.resolved_endpoint = f"{api_op_spec.method.upper()} {api_op_spec.path}" + current_step_result.status = ExecutedStageStepResult.Status.PASSED # Assume pass initially + self.logger.info(f"{step_log_prefix}: 已解析端点 '{current_step_result.resolved_endpoint}'. 准备请求数据.") - self.logger.debug(f"Stage '{stage_instance.id}', Step '{step_name}': Preparing request data for resolved endpoint: {current_step_result.resolved_endpoint}") base_request_context: APIRequestContext = self._prepare_initial_request_data(actual_endpoint_spec_dict, None) final_path_params = copy.deepcopy(base_request_context.path_params) final_query_params = copy.deepcopy(base_request_context.query_params) final_headers = copy.deepcopy(base_request_context.headers) - final_body = base_request_context.body + final_body = base_request_context.body # This could be None or generated data - # Default Content-Type for JSON body if body is overridden and Content-Type not in headers - if "body" in step_definition.request_overrides: - temp_resolved_body_val = self._resolve_value_from_context_or_literal( - step_definition.request_overrides["body"], stage_context, step_name - ) - # Check if Content-Type is already being set by header overrides - is_content_type_in_header_override = False - if "headers" in step_definition.request_overrides: - resolved_header_overrides = self._resolve_value_from_context_or_literal( - step_definition.request_overrides["headers"], stage_context, step_name - ) - if isinstance(resolved_header_overrides, dict): - for h_key in resolved_header_overrides.keys(): - if h_key.lower() == 'content-type': - is_content_type_in_header_override = True; break - - # Check Content-Type in base_request_context.headers (after _prepare_initial_request_data) - is_content_type_in_final_headers = any(h_key.lower() == 'content-type' for h_key in final_headers.keys()) + # Apply overrides, resolving context variables + if step_definition.request_overrides: + self.logger.debug(f"{step_log_prefix}: 应用请求覆盖: {step_definition.request_overrides}") + for key, value_template in step_definition.request_overrides.items(): + resolved_value = self._resolve_value_from_context_or_literal(value_template, stage_context, current_step_name) + if key == "path_params" and isinstance(resolved_value, dict): final_path_params.update(resolved_value) + elif key == "query_params" and isinstance(resolved_value, dict): final_query_params.update(resolved_value) + elif key == "headers" and isinstance(resolved_value, dict): final_headers.update(resolved_value) + elif key == "body": final_body = resolved_value # Override entire body + else: self.logger.warning(f"{step_log_prefix}: 未知的请求覆盖键 '{key}' 或类型不匹配.") - if isinstance(temp_resolved_body_val, (dict, list)) and not is_content_type_in_header_override and not is_content_type_in_final_headers: - final_headers['Content-Type'] = 'application/json' - self.logger.debug(f"Stage '{stage_instance.id}', Step '{step_name}': Defaulted Content-Type to application/json for overridden body.") + # Default Content-Type for JSON body if body exists and Content-Type not set + if final_body is not None and isinstance(final_body, (dict, list)) and not any(h.lower() == 'content-type' for h in final_headers.keys()): + final_headers['Content-Type'] = 'application/json' + self.logger.debug(f"{step_log_prefix}: 为JSON请求体设置默认Content-Type: application/json") - - for key, value_template in step_definition.request_overrides.items(): - resolved_value = self._resolve_value_from_context_or_literal(value_template, stage_context, step_name) - if key == "path_params": - if isinstance(resolved_value, dict): final_path_params.update(resolved_value) - else: self.logger.warning(f"Step '{step_name}': path_params override was not a dict (type: {type(resolved_value)}).") - elif key == "query_params": - if isinstance(resolved_value, dict): final_query_params.update(resolved_value) - else: self.logger.warning(f"Step '{step_name}': query_params override was not a dict (type: {type(resolved_value)}).") - elif key == "headers": - if isinstance(resolved_value, dict): final_headers.update(resolved_value) # Allows case-sensitive overrides if needed by server - else: self.logger.warning(f"Step '{step_name}': headers override was not a dict (type: {type(resolved_value)}).") - elif key == "body": - final_body = resolved_value - else: - self.logger.warning(f"Stage '{stage_instance.id}', Step '{step_name}': Unknown request override key '{key}'.") - - # 构建完整的请求 URL - full_request_url = self._format_url_with_path_params( - path_template=api_op_spec.path, - path_params=final_path_params - ) - self.logger.debug(f"Stage '{stage_instance.id}', Step '{step_name}': Constructed full_request_url: {full_request_url}") - - api_request = APIRequest( + full_request_url = self._format_url_with_path_params(api_op_spec.path, final_path_params) + api_request_obj = APIRequest( method=api_op_spec.method, - url=full_request_url, # <--- 使用构建好的完整 URL - params=final_query_params, # <--- query_params 对应 APIRequest 中的 params + url=full_request_url, + params=final_query_params, headers=final_headers, - body=final_body # APIRequest 会通过 model_post_init 将 body 赋给 json_data + body=final_body # APIRequest handles if body is str/dict/list for json_data ) - current_step_result.request_details = api_request.model_dump(mode='json') # Use model_dump for Pydantic v2 + current_step_result.request_details = api_request_obj.model_dump(mode='json') - self.logger.info(f"Stage '{stage_instance.id}', Step '{step_name}': Executing API call {api_request.method} {api_request.url}") # Log the full URL - api_response, api_call_detail = self.api_caller.call_api(api_request) # APICaller.call_api expects APIRequest - current_step_result.api_call_details = api_call_detail.model_dump(mode='json') # Use model_dump for Pydantic v2 + self.logger.info(f"{step_log_prefix}: 发送API请求: {api_request_obj.method} {api_request_obj.url}") + api_response_obj, api_call_detail_obj = self.api_caller.call_api(api_request_obj) + self.global_api_call_details.append(api_call_detail_obj) # Log globally + current_step_result.api_call_details = api_call_detail_obj.model_dump(mode='json') - self.logger.debug(f"Stage '{stage_instance.id}', Step '{step_name}': Validating response. Status: {api_response.status_code}") + self.logger.info(f"{step_log_prefix}: 收到响应. Status: {api_response_obj.status_code}. 验证中...") - # Create APIResponseContext with the *actual* request sent - actual_request_context = APIRequestContext( - method=api_request.method, - url=str(api_request.url), # Pass the full URL string - path_params=final_path_params, # Keep for context, though URL is final - query_params=api_request.params, # query_params from APIRequest - headers=api_request.headers, - body=api_request.json_data, # body from APIRequest (after potential alias) - endpoint_spec=actual_endpoint_spec_dict # Ensure endpoint_spec is passed - # Removed full_url=str(api_call_detail.request_url) as it's redundant with 'url' - ) - response_context = APIResponseContext( - request_context=actual_request_context, - status_code=api_response.status_code, - headers=api_response.headers, - json_content=api_response.json_content, - text_content=api_response.content.decode('utf-8', errors='replace') if api_response.content else None, - elapsed_time=api_response.elapsed_time, - original_response= getattr(api_response, 'raw_response', None) - # Removed endpoint_spec=actual_endpoint_spec_dict as it's part of actual_request_context - ) - - if step_definition.expected_status_codes and api_response.status_code not in step_definition.expected_status_codes: # Check against list - msg = f"Expected status code in {step_definition.expected_status_codes}, got {api_response.status_code}." - step_validation_points.append(ValidationResult(passed=False, message=msg, details={"expected": step_definition.expected_status_codes, "actual": api_response.status_code})) + step_validation_points: List[ValidationResult] = [] + # Status Code Check + if step_definition.expected_status_codes and api_response_obj.status_code not in step_definition.expected_status_codes: + msg = f"预期状态码为 {step_definition.expected_status_codes}, 实际为 {api_response_obj.status_code}." + step_validation_points.append(ValidationResult(passed=False, message=msg, details={"expected": step_definition.expected_status_codes, "actual": api_response_obj.status_code})) current_step_result.status = ExecutedStageStepResult.Status.FAILED - step_message += msg + " " - self.logger.warning(f"Stage '{stage_instance.id}', Step '{step_name}': {msg}") - elif step_definition.expected_status_codes and api_response.status_code in step_definition.expected_status_codes: - step_validation_points.append(ValidationResult(passed=True, message=f"Status code matched ({api_response.status_code}).")) + self.logger.warning(f"{step_log_prefix}: {msg}") + elif step_definition.expected_status_codes: # If codes are defined and it passed + step_validation_points.append(ValidationResult(passed=True, message=f"状态码匹配 ({api_response_obj.status_code}).")) + + # Response Assertions + request_context_for_assertion = APIRequestContext( + method=api_request_obj.method, url=str(api_request_obj.url), + path_params=final_path_params, query_params=api_request_obj.params, + headers=api_request_obj.headers, body=api_request_obj.json_data, + endpoint_spec=actual_endpoint_spec_dict + ) + response_context_for_assertion = APIResponseContext( + status_code=api_response_obj.status_code, headers=api_response_obj.headers, + json_content=api_response_obj.json_content, + text_content=api_response_obj.content.decode('utf-8', errors='replace') if api_response_obj.content else None, # 修复:解码 bytes 内容 + elapsed_time=api_response_obj.elapsed_time, original_response=getattr(api_response_obj, 'raw_response', None), + request_context=request_context_for_assertion + ) - for i, assertion_func in enumerate(step_definition.response_assertions): # <--- Corrected: custom_assertions to response_assertions + for i, assertion_func in enumerate(step_definition.response_assertions): assertion_name = getattr(assertion_func, '__name__', f"custom_assertion_{i+1}") try: - self.logger.debug(f"Stage '{stage_instance.id}', Step '{step_name}': Running assertion '{assertion_name}'") - val_res = assertion_func(response_context, stage_context) + self.logger.debug(f"{step_log_prefix}: 执行断言 '{assertion_name}'") + val_res = assertion_func(response_context_for_assertion, stage_context) step_validation_points.append(val_res) if not val_res.passed: current_step_result.status = ExecutedStageStepResult.Status.FAILED - step_message += f"Assertion '{assertion_name}' failed: {val_res.message}. " - self.logger.warning(f"Stage '{stage_instance.id}', Step '{step_name}': Assertion '{assertion_name}' failed: {val_res.message}") + self.logger.warning(f"{step_log_prefix}: 断言 '{assertion_name}' 失败: {val_res.message}") except Exception as assert_exc: current_step_result.status = ExecutedStageStepResult.Status.ERROR - errMsg = f"Assertion '{assertion_name}' execution error: {assert_exc}" - step_message += errMsg + " " + errMsg = f"断言 '{assertion_name}' 执行错误: {assert_exc}" step_validation_points.append(ValidationResult(passed=False, message=errMsg, details={"error": str(assert_exc)})) - self.logger.error(f"Stage '{stage_instance.id}', Step '{step_name}': {errMsg}", exc_info=True) + self.logger.error(f"{step_log_prefix}: {errMsg}", exc_info=True) + current_step_result.validation_points = step_validation_points # 修复:存储 ValidationResult 对象本身 + if current_step_result.status != ExecutedStageStepResult.Status.ERROR: - self.logger.debug(f"Stage '{stage_instance.id}', Step '{step_name}': Extracting outputs. Map: {step_definition.outputs_to_context}") + self.logger.debug(f"{step_log_prefix}: 提取输出到上下文. Map: {step_definition.outputs_to_context}") response_data_for_extraction = { - "json_content": api_response.json_content, - "headers": api_response.headers, - "status_code": api_response.status_code + "json_content": api_response_obj.json_content, + "headers": api_response_obj.headers, + "status_code": api_response_obj.status_code } - self._extract_outputs_to_context( - response_data_for_extraction, step_definition.outputs_to_context, - stage_context, f"Stage '{stage_instance.id}', Step '{step_name}'" - ) + self._extract_outputs_to_context(response_data_for_extraction, step_definition.outputs_to_context, stage_context, current_step_name) current_step_result.context_after_step = copy.deepcopy(stage_context) except Exception as step_exec_exc: current_step_result.status = ExecutedStageStepResult.Status.ERROR - current_step_result.message = (current_step_result.message + f" | Unexpected error during step execution: {step_exec_exc}").strip() - self.logger.error(f"Stage '{stage_instance.id}', Step '{step_name}': {current_step_result.message}", exc_info=True) - + err_msg = f"步骤执行期间发生意外错误: {step_exec_exc}" + current_step_result.message = f"{current_step_result.message or ''} | {err_msg}".strip(" | ") + self.logger.error(f"{step_log_prefix}: {err_msg}", exc_info=True) + finally: current_step_result.duration_seconds = (datetime.datetime.now() - step_start_time).total_seconds() - current_step_result.message = (current_step_result.message + " " + step_message).strip() - current_step_result.validation_points = [vp.to_dict() for vp in step_validation_points] - + current_step_result.finalize_step_result() # Consolidate messages from validation points if main message is empty + + self.logger.debug(f"{step_log_prefix}: 调用 after_step 钩子.") try: - self.logger.debug(f"Calling after_step for stage '{stage_instance.id}', step '{step_name}'.") - # Corrected: Pass arguments by keyword to match signature and avoid positional errors stage_instance.after_step( step=step_definition, step_result=current_step_result, @@ -2277,217 +2244,247 @@ class APITestOrchestrator: api_group_name=api_group_name ) except Exception as e_as: - self.logger.error(f"Error in after_step for stage '{stage_instance.id}', step '{step_name}': {e_as}", exc_info=True) + self.logger.error(f"{step_log_prefix}: after_step 钩子执行失败: {e_as}", exc_info=True) if current_step_result.status == ExecutedStageStepResult.Status.PASSED: - current_step_result.status = ExecutedStageStepResult.Status.ERROR - current_step_result.message = (current_step_result.message + f" | after_step hook failed: {e_as}").strip() - elif current_step_result.message: current_step_result.message += f" | after_step hook failed: {e_as}" - else: current_step_result.message = f"after_step hook failed: {e_as}" + current_step_result.status = ExecutedStageStepResult.Status.ERROR # Downgrade to error if after_step fails a passed step + # Append error to message regardless of original status if after_step fails + current_step_result.message = f"{current_step_result.message or ''} | after_step hook failed: {e_as}".strip(" | ") executed_steps_results.append(current_step_result) + self.logger.info(f"{step_log_prefix}: 执行完毕. 状态: {current_step_result.status.value}, 耗时: {current_step_result.duration_seconds:.2f}s") - if current_step_result.status != ExecutedStageStepResult.Status.PASSED: - if not stage_instance.continue_on_failure: - self.logger.warning(f"Stage '{stage_instance.id}', Step '{step_name}' status {current_step_result.status.value}, continue_on_failure=False. Aborting stage.") - # Update stage_result's overall status and message pre-emptively if aborting - if current_step_result.status == ExecutedStageStepResult.Status.ERROR: - stage_result.overall_status = ExecutedStageResult.Status.ERROR - stage_result.message = stage_result.message or f"Stage aborted due to error in step '{step_name}'." - elif current_step_result.status == ExecutedStageStepResult.Status.FAILED and stage_result.overall_status != ExecutedStageResult.Status.ERROR: - stage_result.overall_status = ExecutedStageResult.Status.FAILED - stage_result.message = stage_result.message or f"Stage aborted due to failure in step '{step_name}'." - break + if current_step_result.status != ExecutedStageStepResult.Status.PASSED and not stage_instance.continue_on_failure: + self.logger.warning(f"{step_log_prefix}: 状态为 {current_step_result.status.value} 且 continue_on_failure=False. 中止测试阶段 '{stage_id}'.") + # Update stage_result's overall status pre-emptively if aborting + if current_step_result.status == ExecutedStageStepResult.Status.ERROR: + stage_result.overall_status = ExecutedStageResult.Status.ERROR + elif current_step_result.status == ExecutedStageStepResult.Status.FAILED and stage_result.overall_status != ExecutedStageResult.Status.ERROR: + stage_result.overall_status = ExecutedStageResult.Status.FAILED + stage_result.message = stage_result.message or f"测试阶段因步骤 '{current_step_name}' 的状态 ({current_step_result.status.value}) 而中止." + break # Abort stage execution - # Determine final stage status + # Determine final stage status based on all executed steps if stage_result.overall_status == ExecutedStageResult.Status.PENDING: # If not set by before_stage error or early abort - if not executed_steps_results and stage_instance.steps: # Steps defined but loop didn't run/finish (e.g. continue_on_failure issue) - stage_result.overall_status = ExecutedStageResult.Status.SKIPPED - stage_result.message = stage_result.message or "No steps were effectively executed." - elif not stage_instance.steps: # No steps defined for the stage - stage_result.overall_status = ExecutedStageResult.Status.PASSED # Considered PASSED if before_stage was OK - stage_result.message = stage_result.message or "Stage has no steps." + if not executed_steps_results and stage_instance.steps: + stage_result.overall_status = ExecutedStageResult.Status.SKIPPED # Or ERROR if this is unexpected + stage_result.message = stage_result.message or "阶段已定义步骤但未执行任何步骤." + elif not stage_instance.steps: + stage_result.overall_status = ExecutedStageResult.Status.PASSED # No steps, before_stage OK elif any(s.status == ExecutedStageStepResult.Status.ERROR for s in executed_steps_results): stage_result.overall_status = ExecutedStageResult.Status.ERROR - stage_result.message = stage_result.message or "One or more steps encountered an error." elif any(s.status == ExecutedStageStepResult.Status.FAILED for s in executed_steps_results): stage_result.overall_status = ExecutedStageResult.Status.FAILED - stage_result.message = stage_result.message or "One or more steps failed." - elif all(s.status == ExecutedStageStepResult.Status.PASSED for s in executed_steps_results if executed_steps_results): # all steps passed + elif all(s.status == ExecutedStageStepResult.Status.PASSED for s in executed_steps_results if executed_steps_results): stage_result.overall_status = ExecutedStageResult.Status.PASSED - elif all(s.status == ExecutedStageStepResult.Status.SKIPPED for s in executed_steps_results if executed_steps_results): # all steps skipped + elif all(s.status == ExecutedStageStepResult.Status.SKIPPED for s in executed_steps_results if executed_steps_results): stage_result.overall_status = ExecutedStageResult.Status.SKIPPED - stage_result.message = stage_result.message or "All steps were skipped." - else: # Mix of PASSED, SKIPPED, etc., but no FAILED or ERROR that wasn't handled by continue_on_failure - # This case implies successful completion if no explicit FAILED/ERROR states propagated. - # If there are executed steps, and none failed or errored, it's a pass. - # If all executed steps passed or were skipped, and at least one passed: PASSED - # If all executed steps were skipped: SKIPPED + else: # Mix of PASSED, SKIPPED, implies PASSED if no FAILED/ERROR propagated has_passed_step = any(s.status == ExecutedStageStepResult.Status.PASSED for s in executed_steps_results) if has_passed_step: stage_result.overall_status = ExecutedStageResult.Status.PASSED - else: # No errors, no failures, no passes, implies all skipped or pending (which shouldn't happen for completed steps) - stage_result.overall_status = ExecutedStageResult.Status.SKIPPED - stage_result.message = stage_result.message or "Steps completed without explicit pass, fail, or error." - + else: # No explicit FAILED/ERROR, no PASSED -> likely all SKIPPED or a mix that doesn't constitute overall failure + stage_result.overall_status = ExecutedStageResult.Status.SKIPPED + stage_result.message = stage_result.message or "所有步骤均已跳过或以非失败/错误状态完成." + + stage_result.message = stage_result.message or stage_instance.description # Default message if none set try: - self.logger.debug(f"Calling after_stage for stage '{stage_instance.id}'.") + self.logger.debug(f"调用 stage '{stage_id}' 的 after_stage 钩子. 当前阶段结果状态: {stage_result.overall_status.value}") stage_instance.after_stage(stage_result=stage_result, stage_context=stage_context, global_api_spec=parsed_spec, api_group_name=api_group_name) except Exception as e_asg: - self.logger.error(f"Error in after_stage for stage '{stage_instance.id}': {e_asg}", exc_info=True) - if stage_result.overall_status not in [ExecutedStageResult.Status.ERROR]: # Don't override a more severe status - original_status_msg = f"(Original status: {stage_result.overall_status.value})" if stage_result.overall_status != ExecutedStageResult.Status.PASSED else "" - stage_result.overall_status = ExecutedStageResult.Status.ERROR - current_msg = stage_result.message if stage_result.message else "" - stage_result.message = f"{current_msg} after_stage hook failed: {e_asg} {original_status_msg}".strip() - elif stage_result.message: stage_result.message += f" | after_stage hook failed: {e_asg}" - else: stage_result.message = f"after_stage hook failed: {e_asg}" + self.logger.error(f"Stage '{stage_id}' 的 after_stage 钩子执行失败: {e_asg}", exc_info=True) + if stage_result.overall_status not in [ExecutedStageResult.Status.ERROR]: + stage_result.overall_status = ExecutedStageResult.Status.ERROR # Downgrade + stage_result.message = f"{stage_result.message or ''} | after_stage hook failed: {e_asg}".strip(" | ") - stage_result.executed_steps = executed_steps_results # <--- 将局部步骤结果列表赋值给最终结果对象 + stage_result.executed_steps = executed_steps_results stage_result.finalize_stage_result(final_context=stage_context) - self.logger.info(f"Stage '{stage_instance.id}' execution finished. API Group: '{api_group_name}', Final Status: {stage_result.overall_status.value}, Duration: {stage_result.duration:.2f}s") # Corrected duration_seconds to duration + + self.logger.info(f"测试阶段 '{stage_id}' (API分组: '{api_group_name or 'Global'}') 执行完毕. 最终状态: {stage_result.overall_status.value}, 耗时: {stage_result.duration:.2f}s") return stage_result def run_stages_from_spec(self, parsed_spec: ParsedAPISpec, summary: TestSummary): - self.logger.info("Starting API Test Stage execution...") - if not self.stage_registry or not self.stage_registry.get_all_stage_classes(): - self.logger.info("No API Test Stages loaded. Skipping stage execution.") + self.logger.info("开始执行API测试阶段 (Stages)...") + if not self.stage_registry or not self.stage_registry.get_all_stages(): + self.logger.info("未加载任何API测试阶段。跳过阶段执行。") + summary.set_total_stages_defined(0) # Ensure this is set even if no stages run return - stage_classes = self.stage_registry.get_all_stage_classes() + stage_classes = self.stage_registry.get_all_stages() summary.set_total_stages_defined(len(stage_classes)) + self.logger.info(f"发现了 {len(stage_classes)} 个已定义的测试阶段: {[sc.id if hasattr(sc, 'id') else sc.__name__ for sc in stage_classes]}") - api_groups: List[Optional[str]] = [] + total_stages_considered_for_execution = 0 # 初始化计数器 + + api_groups_to_iterate: List[Optional[str]] = [] if isinstance(parsed_spec, ParsedYAPISpec): - # Use parsed_spec.categories which are List[Dict[str, str]] from YAPIInput if parsed_spec.categories: - api_groups.extend([cat.get('name') for cat in parsed_spec.categories if cat.get('name')]) - # If categories list exists but all are unnamed or empty, or if no categories attribute - if not api_groups and (not hasattr(parsed_spec, 'categories') or parsed_spec.categories is not None): - self.logger.info("YAPI spec: No named categories found or categories attribute missing/empty. Applying stages to the whole spec (api_group_name=None).") - api_groups.append(None) + api_groups_to_iterate.extend([cat.get('name') for cat in parsed_spec.categories if cat.get('name')]) + if not api_groups_to_iterate: + self.logger.info("YAPI规范: 未找到已命名的分类,或分类列表为空。将阶段应用于整个规范 (api_group_name=None).") + api_groups_to_iterate.append(None) elif isinstance(parsed_spec, ParsedSwaggerSpec): - # Use parsed_spec.tags which are List[Dict[str, str]] - if parsed_spec.tags: - api_groups.extend([tag.get('name') for tag in parsed_spec.tags if tag.get('name')]) - if not api_groups and (not hasattr(parsed_spec, 'tags') or parsed_spec.tags is not None): - self.logger.info("Swagger spec: No named tags found or tags attribute missing/empty. Applying stages to the whole spec (api_group_name=None).") - api_groups.append(None) + # For Swagger, iterate through globally defined tags. Stages can then filter APIs based on these tags. + # If a stage is designed for broader application, it can ignore the specific group name. + if parsed_spec.tags: + api_groups_to_iterate.extend([tag.get('name') for tag in parsed_spec.tags if tag.get('name')]) + if not api_groups_to_iterate: + self.logger.info("Swagger规范: 未找到已定义的标签,或标签列表为空。将阶段应用于整个规范 (api_group_name=None).") + api_groups_to_iterate.append(None) + else: + self.logger.warning(f"未知的解析规范类型: {type(parsed_spec)}。将阶段应用于整个规范 (api_group_name=None).") + api_groups_to_iterate.append(None) - if not api_groups: # Default for other spec types or if above logic resulted in empty list - self.logger.info("No specific API groups (categories/tags) identified. Applying stages to the whole spec (api_group_name=None).") - api_groups.append(None) + if not api_groups_to_iterate: # Should always have at least [None] due to above logic + self.logger.error("逻辑错误: api_groups_to_iterate 为空,将默认为 [None].") + api_groups_to_iterate = [None] - self.logger.info(f"Evaluating test stages against {len(api_groups)} API group(s): {api_groups}") - total_stages_considered_for_execution = 0 + self.logger.info(f"将针对 {len(api_groups_to_iterate)} 个API分组评估测试阶段: {api_groups_to_iterate}") + + for stage_class_to_init in stage_classes: + stage_id_for_log = getattr(stage_class_to_init, 'id', stage_class_to_init.__name__) + stage_name_for_log = getattr(stage_class_to_init, 'name', stage_class_to_init.__name__) + self.logger.info(f"处理测试阶段定义: ID='{stage_id_for_log}', Name='{stage_name_for_log}'") - for stage_class in stage_classes: - # For template instance, provide default/empty metadata and api lists - # as it's mainly used for accessing static-like properties before group-specific execution. - default_group_meta = {"name": "Template Group", "description": "Used for stage template loading"} - stage_instance_template = stage_class( - api_group_metadata=default_group_meta, - apis_in_group=[], - llm_service=self.llm_service, - global_api_spec=parsed_spec # Template might still need global spec for some pre-checks - ) - self.logger.info(f"Processing Test Stage definition: ID='{stage_instance_template.id}', Name='{stage_instance_template.name}'") - was_applicable_and_executed_at_least_once = False + + # Create a template instance once to check fail_if_not_applicable_to_any_group + # This template instance doesn't need full group-specific data yet. + template_stage_instance_check = stage_class_to_init( + api_group_metadata={"name": "_template_check", "description": "用于预检查的模板实例"}, # Provide a default dict + apis_in_group=[], + global_api_spec=parsed_spec, + llm_service=self.llm_service + ) - for api_group_name in api_groups: - # Prepare api_group_metadata and apis_in_group for the current group - current_group_metadata: Dict[str, Any] = {} - current_apis_in_group_dicts: List[Dict[str, Any]] = [] + for current_api_group_name in api_groups_to_iterate: + total_stages_considered_for_execution += 1 # 递增计数器 + self.logger.debug(f"准备阶段 '{stage_id_for_log}' 的上下文,针对API分组: '{current_api_group_name or 'Global'}'") + current_group_metadata: Optional[Dict[str, Any]] = None + apis_for_current_group_objects: List[Union[YAPIEndpoint, SwaggerEndpoint]] = [] - if api_group_name: - if isinstance(parsed_spec, ParsedYAPISpec) and parsed_spec.spec and 'categories' in parsed_spec.spec: - category_details_list = parsed_spec.spec.get('categories', []) - category_detail = next((cat for cat in category_details_list if cat.get('name') == api_group_name), None) - if category_detail: - current_group_metadata = {"name": api_group_name, - "description": category_detail.get("desc"), - "id": category_detail.get("_id")} - category_id_to_match = category_detail.get("_id") - # Filter endpoints for this category by id - current_apis_in_group_dicts = [ - ep.to_dict() for ep in parsed_spec.endpoints - if hasattr(ep, 'category_id') and ep.category_id == category_id_to_match - ] - else: - self.logger.warning(f"Could not find details for YAPI category: {api_group_name} in parsed_spec.spec.categories. API list for this group might be empty.") - current_group_metadata = {"name": api_group_name, "description": "Details not found in spec top-level categories"} - current_apis_in_group_dicts = [] # Or could attempt to filter by name if IDs are unreliable - elif isinstance(parsed_spec, ParsedSwaggerSpec): - # For Swagger, tags on operations are primary; global tags are for definition. - current_group_metadata = {"name": api_group_name} - if parsed_spec.spec and 'tags' in parsed_spec.spec: - tag_detail = next((tag for tag in parsed_spec.spec.get('tags', []) if tag.get('name') == api_group_name), None) - if tag_detail: - current_group_metadata["description"] = tag_detail.get("description") - else: # Tag name exists (from api_groups list) but not in the top-level tags definitions - current_group_metadata["description"] = "Tag defined on operation, not in global tags list." + if current_api_group_name: + if isinstance(parsed_spec, ParsedYAPISpec): + category_metadata_from_spec = next((cat for cat in parsed_spec.categories if cat.get('name') == current_api_group_name), None) - # Filter endpoints for this tag - current_apis_in_group_dicts = [ - ep.to_dict() for ep in parsed_spec.endpoints - if hasattr(ep, 'tags') and isinstance(ep.tags, list) and api_group_name in ep.tags + if not category_metadata_from_spec: + self.logger.warning(f"YAPI group '{current_api_group_name}': Could not find its metadata in parsed_spec.categories. Skipping this group for stage '{stage_id_for_log}'.") + current_group_metadata = {'name': current_api_group_name, 'description': '分类元数据未找到'} + else: + current_group_metadata = dict(category_metadata_from_spec) + effective_category_id: Optional[int] = None + for ep_lookup in parsed_spec.endpoints: + if isinstance(ep_lookup, YAPIEndpoint) and ep_lookup.category_name == current_api_group_name: + effective_category_id = ep_lookup.category_id + break + + if effective_category_id is not None: + current_group_metadata['id'] = effective_category_id + + apis_for_current_group_objects = [ + api for api in parsed_spec.endpoints + if isinstance(api, YAPIEndpoint) and api.category_id == effective_category_id + ] + self.logger.debug(f"For YAPI group '{current_api_group_name}' (resolved ID: {effective_category_id}), selected {len(apis_for_current_group_objects)} endpoint objects.") + else: + self.logger.warning( + f"YAPI group '{current_api_group_name}': Could not determine a definitive integer category ID " + f"from its endpoints (metadata ID from spec was '{current_group_metadata.get('id')}'). " + f"No APIs will be selected for this group for stage '{stage_id_for_log}'." + ) + + elif isinstance(parsed_spec, ParsedSwaggerSpec): + tag_metadata_obj = next((tag for tag in parsed_spec.tags if tag.get('name') == current_api_group_name), None) + if tag_metadata_obj: + current_group_metadata = {'name': current_api_group_name, 'description': tag_metadata_obj.get('description', '')} + else: + self.logger.warning(f"Swagger tag '{current_api_group_name}': Could not find its metadata in global tags. Will use name only.") + current_group_metadata = {'name': current_api_group_name, 'description': '标签定义可能仅在操作上'} + + apis_for_current_group_objects = [ + api for api in parsed_spec.endpoints + if isinstance(api, SwaggerEndpoint) and hasattr(api, 'tags') and isinstance(api.tags, list) and current_api_group_name in api.tags ] + self.logger.debug(f"For Swagger group '{current_api_group_name}', selected {len(apis_for_current_group_objects)} endpoint objects.") else: - self.logger.warning(f"API group '{api_group_name}' provided, but cannot determine group details or filter APIs for spec type {type(parsed_spec)}.") - current_group_metadata = {"name": api_group_name, "description": "Unknown group type or spec structure"} - current_apis_in_group_dicts = [ep.to_dict() for ep in parsed_spec.endpoints] + self.logger.warning(f"Unknown spec type ({type(parsed_spec)}) for group '{current_api_group_name}'.") + current_group_metadata = {"name": current_api_group_name, "description": f"未知规范类型 ({type(parsed_spec)}) 的分组"} + else: + current_group_metadata = {"name": "Global (所有API)", "description": "适用于规范中的所有API"} + if parsed_spec and parsed_spec.endpoints: + apis_for_current_group_objects = list(parsed_spec.endpoints) + else: + apis_for_current_group_objects = [] + self.logger.debug(f"For Global context, selected {len(apis_for_current_group_objects)} endpoint objects.") - else: # api_group_name is None (global scope) - current_group_metadata = {"name": "Global (All APIs)", "description": "Applies to all APIs in the spec"} - current_apis_in_group_dicts = [ep.to_dict() for ep in parsed_spec.endpoints] + if current_api_group_name and not current_group_metadata: + self.logger.error(f"INTERNAL ERROR: Metadata for group '{current_api_group_name}' ended up None. Skipping.") + continue - # Instantiate the stage with the prepared context for the current API group - stage_instance = stage_class( + current_apis_in_group_for_stage = apis_for_current_group_objects + + self.logger.debug(f"为阶段 '{stage_id_for_log}' 和分组 '{current_api_group_name or 'Global'}' 实例化。API对象数量: {len(current_apis_in_group_for_stage)}. 元数据: {current_group_metadata}") + + stage_instance_for_execution = stage_class_to_init( api_group_metadata=current_group_metadata, - apis_in_group=current_apis_in_group_dicts, - llm_service=self.llm_service, - global_api_spec=parsed_spec + apis_in_group=current_apis_in_group_for_stage, + global_api_spec=parsed_spec, + llm_service=self.llm_service ) - total_stages_considered_for_execution += 1 try: - self.logger.debug(f"Checking applicability of stage '{stage_instance.id}' for API group '{api_group_name}'...") - applicable = stage_instance.is_applicable_to_api_group( - api_group_name=api_group_name, + self.logger.debug(f"检查阶段 '{stage_instance_for_execution.id}' 是否适用于API分组 '{current_api_group_name or 'Global'}'...") + # is_applicable_to_api_group expects the api_group_name string and the full spec + applicable = stage_instance_for_execution.is_applicable_to_api_group( + api_group_name=current_api_group_name, # Pass the name string global_api_spec=parsed_spec ) - except Exception as e: - self.logger.error(f"Error checking applicability of stage '{stage_instance.id}' for group '{api_group_name}': {e}", exc_info=True) + except Exception as e_is_app: + self.logger.error(f"检查阶段 '{stage_instance_for_execution.id}' 对分组 '{current_api_group_name or 'Global'}' 的适用性时出错: {e_is_app}", exc_info=True) error_result = ExecutedStageResult( - stage_id=stage_instance.id, stage_name=stage_instance.name, api_group=api_group_name, - overall_status=ExecutedStageResult.Status.ERROR, message=f"Error during applicability check: {e}" + stage_id=stage_instance_for_execution.id, + stage_name=stage_instance_for_execution.name, + description=stage_instance_for_execution.description, + api_group_metadata=current_group_metadata, + tags=stage_instance_for_execution.tags, + overall_status=ExecutedStageResult.Status.ERROR, + message=f"适用性检查期间出错: {e_is_app}" ) - error_result.finalize_result(datetime.datetime.now(), [], {}) + error_result.finalize_stage_result(final_context={}) # Minimal context summary.add_stage_result(error_result) - was_applicable_and_executed_at_least_once = True # Considered an attempt - continue + was_applicable_and_executed_at_least_once = True # Count as an attempt + continue # Skip to next group or stage if applicable: - self.logger.info(f"Test Stage '{stage_instance.id}' is APPLICABLE to API group '{api_group_name}'. Executing...") - stage_execution_result = self.execute_single_stage(stage_instance, parsed_spec, api_group_name) + self.logger.info(f"测试阶段 '{stage_instance_for_execution.id}' 适用于API分组 '{current_api_group_name or 'Global'}'。开始执行...") + stage_execution_result = self.execute_single_stage( + stage_instance=stage_instance_for_execution, + parsed_spec=parsed_spec, + api_group_name=current_api_group_name # Pass the group name string + ) summary.add_stage_result(stage_execution_result) - was_applicable_and_executed_at_least_once = True - else: - self.logger.info(f"Test Stage '{stage_instance.id}' is NOT APPLICABLE to API group '{api_group_name}'. Skipping for this group.") + was_applicable_and_executed_at_least_once = True # 确保在成功执行后设置 + else: # This else corresponds to 'if applicable:' + self.logger.info(f"测试阶段 '{stage_instance_for_execution.id}' 不适用于API分组 '{current_api_group_name or 'Global'}'。跳过此分组。") - if not was_applicable_and_executed_at_least_once and stage_instance_template.fail_if_not_applicable_to_any_group: - self.logger.warning(f"Test Stage '{stage_instance_template.id}' was not applicable to any API group and 'fail_if_not_applicable_to_any_group' is True.") + # fail_if_not_applicable_to_any_group 检查逻辑应使用 template_stage_instance_check + if not was_applicable_and_executed_at_least_once and template_stage_instance_check.fail_if_not_applicable_to_any_group: + self.logger.warning(f"测试阶段 '{template_stage_instance_check.id}' 未适用于任何API分组,且 'fail_if_not_applicable_to_any_group' 为 True.") + # 使用 template_stage_instance_check 的属性来创建失败结果 failure_result = ExecutedStageResult( - stage_id=stage_instance_template.id, stage_name=stage_instance_template.name, api_group=None, + stage_id=template_stage_instance_check.id, + stage_name=template_stage_instance_check.name, + description=template_stage_instance_check.description, + api_group_metadata=None, # 因为它没有应用于任何特定组 + tags=template_stage_instance_check.tags, overall_status=ExecutedStageResult.Status.FAILED, - message=f"Stage marked as 'must apply' but was not applicable to any of the evaluated groups: {api_groups}." + message=f"阶段标记为 '必须应用' 但未适用于任何评估的分组: {[g for g in api_groups_to_iterate if g is not None]}" ) - failure_result.finalize_result(datetime.datetime.now(), [], {}) + failure_result.finalize_stage_result(final_context={}) summary.add_stage_result(failure_result) self.logger.info(f"API Test Stage execution processed. Considered {total_stages_considered_for_execution} (stage_definition x api_group) combinations.") diff --git a/log_stage.txt b/log_stage.txt index f195c47..1401905 100644 --- a/log_stage.txt +++ b/log_stage.txt @@ -1,411 +1,409 @@ -2025-06-05 15:29:09,338 - __main__ - DEBUG - 已启用详细日志模式 -2025-06-05 15:29:09,338 - __main__ - INFO - 主输出目录设置为: /Users/zpc01/workspace/zzlh/compliance/test_reports -2025-06-05 15:29:09,339 - ddms_compliance_suite.test_orchestrator - INFO - 正在从目录加载自定义测试用例: ./custom_testcases -2025-06-05 15:29:09,339 - ddms_compliance_suite.test_case_registry - INFO - 开始从目录 './custom_testcases' 及其子目录发现测试用例... -2025-06-05 15:29:09,339 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: basic_checks 从 ./custom_testcases/basic_checks.py -2025-06-05 15:29:09,339 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-STATUS-001' (基本状态码 200 检查) 来自类 'StatusCode200Check' (路径: ./custom_testcases/basic_checks.py) -2025-06-05 15:29:09,339 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: basic_api_sanity_check_case 从 ./custom_testcases/setup_checks/basic_api_sanity_check_case.py -2025-06-05 15:29:09,339 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: https_mandatory_case 从 ./custom_testcases/compliance_catalog/security/https_mandatory_case.py -2025-06-05 15:29:09,340 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) 来自类 'HTTPSMandatoryCase' (路径: ./custom_testcases/compliance_catalog/security/https_mandatory_case.py) -2025-06-05 15:29:09,340 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: url_llm_checks 从 ./custom_testcases/compliance_catalog/normative_spec/url_llm_checks.py -2025-06-05 15:29:09,340 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: http_method_usage_case 从 ./custom_testcases/compliance_catalog/normative_spec/http_method_usage_case.py -2025-06-05 15:29:09,340 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: missing_required_field_query_case 从 ./custom_testcases/compliance_catalog/error_handling/missing_required_field_query_case.py -2025-06-05 15:29:09,340 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) 来自类 'MissingRequiredFieldQueryCase' (路径: ./custom_testcases/compliance_catalog/error_handling/missing_required_field_query_case.py) -2025-06-05 15:29:09,340 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: type_mismatch_body_case 从 ./custom_testcases/compliance_catalog/error_handling/type_mismatch_body_case.py -2025-06-05 15:29:09,340 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) 来自类 'TypeMismatchBodyCase' (路径: ./custom_testcases/compliance_catalog/error_handling/type_mismatch_body_case.py) -2025-06-05 15:29:09,341 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: missing_required_field_body_case 从 ./custom_testcases/compliance_catalog/error_handling/missing_required_field_body_case.py -2025-06-05 15:29:09,341 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) 来自类 'MissingRequiredFieldBodyCase' (路径: ./custom_testcases/compliance_catalog/error_handling/missing_required_field_body_case.py) -2025-06-05 15:29:09,341 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: type_mismatch_query_param_case 从 ./custom_testcases/compliance_catalog/error_handling/type_mismatch_query_param_case.py -2025-06-05 15:29:09,341 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) 来自类 'TypeMismatchQueryParamCase' (路径: ./custom_testcases/compliance_catalog/error_handling/type_mismatch_query_param_case.py) -2025-06-05 15:29:09,341 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: schema_validation_case 从 ./custom_testcases/compliance_catalog/core_functionality/schema_validation_case.py -2025-06-05 15:29:09,341 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) 来自类 'ResponseSchemaValidationCase' (路径: ./custom_testcases/compliance_catalog/core_functionality/schema_validation_case.py) -2025-06-05 15:29:09,341 - ddms_compliance_suite.test_case_registry - INFO - 已根据 execution_order (主要) 和类名 (次要) 对 7 个测试用例类进行了排序。 -2025-06-05 15:29:09,341 - ddms_compliance_suite.test_case_registry - INFO - 测试用例发现完成。总共注册了 7 个独特的测试用例 (基于ID)。发现并排序了 7 个测试用例类。 -2025-06-05 15:29:09,341 - ddms_compliance_suite.test_orchestrator - INFO - 加载了 7 个自定义测试用例。 -2025-06-05 15:29:09,341 - ddms_compliance_suite.test_orchestrator - INFO - 未提供API场景目录,跳过加载场景测试。 -2025-06-05 15:29:09,341 - ddms_compliance_suite.test_orchestrator - INFO - APITestOrchestrator: 尝试从目录加载API测试阶段: ./custom_stages -2025-06-05 15:29:09,341 - ddms_compliance_suite.stage_registry - INFO - StageRegistry: 开始从目录 './custom_stages' 加载测试阶段... -2025-06-05 15:29:09,341 - ddms_compliance_suite.stage_registry - INFO - StageRegistry: 开始从目录 './custom_stages' 及其子目录发现测试阶段... -2025-06-05 15:29:09,342 - ddms_compliance_suite.stage_registry - DEBUG - StageRegistry: 成功导入模块: keyword_driven_crud_stage 从 ./custom_stages/keyword_driven_crud_stage.py -2025-06-05 15:29:09,342 - ddms_compliance_suite.stage_registry - INFO - StageRegistry: 已注册测试阶段: 'keyword_driven_crud_example' (类: KeywordDrivenCRUDStage) 从模块 'keyword_driven_crud_stage' (路径: ./custom_stages/keyword_driven_crud_stage.py) -2025-06-05 15:29:09,342 - ddms_compliance_suite.stage_registry - INFO - StageRegistry: 加载完成。共加载 1 个测试阶段。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_orchestrator - INFO - APITestOrchestrator: StageRegistry 初始化完毕。加载的API测试阶段数量: 1 -2025-06-05 15:29:09,342 - ddms_compliance_suite.llm_utils.llm_service - INFO - LLMService initialized for model 'qwen-plus' at https://dashscope.aliyuncs.com/compatible-mode/v1 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_orchestrator - INFO - LLMService initialized successfully with model: qwen-plus. -2025-06-05 15:29:09,342 - __main__ - INFO - 从YAPI文件运行测试: ./assets/doc/井筒API示例_simple.json -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_orchestrator - INFO - 准备从YAPI文件运行测试用例: ./assets/doc/井筒API示例_simple.json -2025-06-05 15:29:09,342 - ddms_compliance_suite.input_parser.parser - INFO - Parsing YAPI spec from: ./assets/doc/井筒API示例_simple.json -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:09,342 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version} (数据推送接口) -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 发现了 7 个适用的测试用例 (已排序): ['TC-STATUS-001', 'TC-CORE-FUNC-001', 'TC-SECURITY-001', 'TC-ERROR-4001-QUERY', 'TC-ERROR-4001-BODY', 'TC-ERROR-4003-BODY', 'TC-ERROR-4003-QUERY'] -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,343 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,343 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,343 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,343 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,343 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,343 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: StatusCode200Check 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,343 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 初始化。 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,343 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,344 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version -2025-06-05 15:29:09,392 - testcase.TC-STATUS-001 - INFO - 状态码验证通过: 200 == 200 for http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,392 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,392 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,392 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,392 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,392 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,392 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: ResponseSchemaValidationCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,392 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 初始化。 -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,392 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,393 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,393 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,393 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] -2025-06-05 15:29:09,393 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) -2025-06-05 15:29:09,393 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,393 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version -2025-06-05 15:29:09,412 - testcase.TC-CORE-FUNC-001 - INFO - 响应包含JSON体,但在API规范中未找到针对状态码 200 的JSON schema。跳过schema验证。 -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,412 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,412 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,412 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,412 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,412 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,412 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: HTTPSMandatoryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,412 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 初始化。 -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,412 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,413 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version -2025-06-05 15:29:09,413 - testcase.TC-SECURITY-001 - WARNING - 原始URL 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version' 不是HTTPS。跳过此测试用例的URL修改。 -2025-06-05 15:29:09,445 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 -2025-06-05 15:29:09,445 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 -2025-06-05 15:29:09,445 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 -2025-06-05 15:29:09,445 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,445 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,445 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,445 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,445 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,445 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,445 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,446 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,446 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,446 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,446 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchQueryParamCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,446 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. -2025-06-05 15:29:09,446 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: No suitable simple type field found for query parameters. -2025-06-05 15:29:09,446 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No suitable simple type query parameter found for type mismatch test. -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) -2025-06-05 15:29:09,446 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No target field or original type identified for query param type mismatch. Skipping query param modification. -2025-06-05 15:29:09,446 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,446 - testcase.TC-ERROR-4001-QUERY - DEBUG - TC-ERROR-4001-QUERY is focused on query parameters, generate_request_body will not modify the body. -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,446 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version -2025-06-05 15:29:09,446 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version -2025-06-05 15:29:09,446 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. -2025-06-05 15:29:09,446 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version -2025-06-05 15:29:09,446 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,446 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: -2025-06-05 15:29:09,465 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Skipped type mismatch (query) validation: No target query parameter was identified. -2025-06-05 15:29:09,465 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.018440961837768555 -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4001-QUERY' 执行成功。 -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 通过 -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,465 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,465 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,465 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,465 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,465 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,465 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,465 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Initializing: Looking for a simple type field in request body for type mismatch test. -2025-06-05 15:29:09,465 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json -2025-06-05 15:29:09,465 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... -2025-06-05 15:29:09,465 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=isSearchCount, Type=boolean -2025-06-05 15:29:09,465 - testcase.TC-ERROR-4001-BODY - INFO - _find_simple_type_field_in_schema: Found simple type field in 'request body': Path=isSearchCount, Type=boolean -2025-06-05 15:29:09,465 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): isSearchCount, Original Type: boolean -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) -2025-06-05 15:29:09,465 - testcase.TC-ERROR-4001-BODY - DEBUG - TC-ERROR-4001-BODY is focused on request body, generate_query_params will not modify query parameters. -2025-06-05 15:29:09,465 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,465 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Preparing to modify request body for type mismatch. Target path: ['isSearchCount'], Original type: boolean -2025-06-05 15:29:09,465 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value 'not-a-boolean' for original type 'boolean' at path 'isSearchCount'. -2025-06-05 15:29:09,465 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 isSearchCount (键 'isSearchCount') 处设置值为 'not-a-boolean' -2025-06-05 15:29:09,465 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,465 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version -2025-06-05 15:29:09,466 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version -2025-06-05 15:29:09,466 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. -2025-06-05 15:29:09,466 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version -2025-06-05 15:29:09,466 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,466 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 18:28:02,489 - __main__ - DEBUG - 已启用详细日志模式 +2025-06-05 18:28:02,490 - __main__ - INFO - 主输出目录设置为: /Users/zpc01/workspace/zzlh/compliance/test_reports +2025-06-05 18:28:02,490 - ddms_compliance_suite.test_case_registry - INFO - 开始从目录 './custom_testcases' 及其子目录发现测试用例... +2025-06-05 18:28:02,490 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: basic_checks 从 ./custom_testcases/basic_checks.py +2025-06-05 18:28:02,490 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-STATUS-001' (基本状态码 200 检查) 来自类 'StatusCode200Check' (路径: ./custom_testcases/basic_checks.py) +2025-06-05 18:28:02,490 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: basic_api_sanity_check_case 从 ./custom_testcases/setup_checks/basic_api_sanity_check_case.py +2025-06-05 18:28:02,491 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: https_mandatory_case 从 ./custom_testcases/compliance_catalog/security/https_mandatory_case.py +2025-06-05 18:28:02,491 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) 来自类 'HTTPSMandatoryCase' (路径: ./custom_testcases/compliance_catalog/security/https_mandatory_case.py) +2025-06-05 18:28:02,491 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: url_llm_checks 从 ./custom_testcases/compliance_catalog/normative_spec/url_llm_checks.py +2025-06-05 18:28:02,491 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: http_method_usage_case 从 ./custom_testcases/compliance_catalog/normative_spec/http_method_usage_case.py +2025-06-05 18:28:02,491 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: missing_required_field_query_case 从 ./custom_testcases/compliance_catalog/error_handling/missing_required_field_query_case.py +2025-06-05 18:28:02,491 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) 来自类 'MissingRequiredFieldQueryCase' (路径: ./custom_testcases/compliance_catalog/error_handling/missing_required_field_query_case.py) +2025-06-05 18:28:02,492 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: type_mismatch_body_case 从 ./custom_testcases/compliance_catalog/error_handling/type_mismatch_body_case.py +2025-06-05 18:28:02,492 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) 来自类 'TypeMismatchBodyCase' (路径: ./custom_testcases/compliance_catalog/error_handling/type_mismatch_body_case.py) +2025-06-05 18:28:02,492 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: missing_required_field_body_case 从 ./custom_testcases/compliance_catalog/error_handling/missing_required_field_body_case.py +2025-06-05 18:28:02,492 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) 来自类 'MissingRequiredFieldBodyCase' (路径: ./custom_testcases/compliance_catalog/error_handling/missing_required_field_body_case.py) +2025-06-05 18:28:02,492 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: type_mismatch_query_param_case 从 ./custom_testcases/compliance_catalog/error_handling/type_mismatch_query_param_case.py +2025-06-05 18:28:02,492 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) 来自类 'TypeMismatchQueryParamCase' (路径: ./custom_testcases/compliance_catalog/error_handling/type_mismatch_query_param_case.py) +2025-06-05 18:28:02,492 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: schema_validation_case 从 ./custom_testcases/compliance_catalog/core_functionality/schema_validation_case.py +2025-06-05 18:28:02,492 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) 来自类 'ResponseSchemaValidationCase' (路径: ./custom_testcases/compliance_catalog/core_functionality/schema_validation_case.py) +2025-06-05 18:28:02,492 - ddms_compliance_suite.test_case_registry - INFO - 已根据 execution_order (主要) 和类名 (次要) 对 7 个测试用例类进行了排序。 +2025-06-05 18:28:02,492 - ddms_compliance_suite.test_case_registry - INFO - 测试用例发现完成。总共注册了 7 个独特的测试用例 (基于ID)。发现并排序了 7 个测试用例类。 +2025-06-05 18:28:02,492 - ddms_compliance_suite.llm_utils.llm_service - INFO - LLMService initialized for model 'qwen-plus' at https://dashscope.aliyuncs.com/compatible-mode/v1 +2025-06-05 18:28:02,492 - ddms_compliance_suite.test_orchestrator - INFO - LLMService initialized with model: qwen-plus. +2025-06-05 18:28:02,492 - ddms_compliance_suite.test_orchestrator - INFO - LLMService is initialized, but no LLM generation flags (--use-llm-for-*) are enabled. +2025-06-05 18:28:02,492 - ddms_compliance_suite.stage_registry - INFO - 开始从目录发现测试阶段: custom_stages +2025-06-05 18:28:02,493 - ddms_compliance_suite.stage_registry - DEBUG - 成功加载模块: ddms_compliance_suite.stages.keyword_driven_crud_stage 从 custom_stages/keyword_driven_crud_stage.py +2025-06-05 18:28:02,493 - ddms_compliance_suite.stage_registry - INFO - 成功注册测试阶段: generic_crud_validation_stage (来自 ddms_compliance_suite.stages.keyword_driven_crud_stage.GenericCRUDValidationStage) +2025-06-05 18:28:02,493 - ddms_compliance_suite.stage_registry - INFO - 测试阶段发现完成。共加载 1 个阶段。发现 0 个错误。 +2025-06-05 18:28:02,493 - ddms_compliance_suite.test_orchestrator - INFO - StageRegistry initialized. Loaded 1 stages. +2025-06-05 18:28:02,493 - ddms_compliance_suite.test_orchestrator - INFO - Orchestrator output directory set to: /Users/zpc01/workspace/zzlh/compliance/test_reports +2025-06-05 18:28:02,493 - __main__ - INFO - 从YAPI文件运行测试: ./assets/doc/井筒API示例_simple.json +2025-06-05 18:28:02,493 - ddms_compliance_suite.test_orchestrator - INFO - 准备从YAPI文件运行测试用例: ./assets/doc/井筒API示例_simple.json +2025-06-05 18:28:02,493 - ddms_compliance_suite.input_parser.parser - INFO - Parsing YAPI spec from: ./assets/doc/井筒API示例_simple.json +2025-06-05 18:28:02,493 - ddms_compliance_suite.test_orchestrator - INFO - TestSummary initialized. +2025-06-05 18:28:02,493 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,493 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,493 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version} (数据推送接口) +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 发现了 7 个适用的测试用例 (已排序): ['TC-STATUS-001', 'TC-CORE-FUNC-001', 'TC-SECURITY-001', 'TC-ERROR-4001-QUERY', 'TC-ERROR-4001-BODY', 'TC-ERROR-4003-BODY', 'TC-ERROR-4003-QUERY'] +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,494 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,494 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,494 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,494 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,494 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,494 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: StatusCode200Check 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,494 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 初始化。 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,494 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version +2025-06-05 18:28:02,571 - testcase.TC-STATUS-001 - INFO - 状态码验证通过: 200 == 200 for http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,571 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,571 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,571 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,571 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,571 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,571 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: ResponseSchemaValidationCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,571 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 初始化。 +2025-06-05 18:28:02,571 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,572 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version +2025-06-05 18:28:02,596 - testcase.TC-CORE-FUNC-001 - INFO - 响应包含JSON体,但在API规范中未找到针对状态码 200 的JSON schema。跳过schema验证。 +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,596 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,596 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,596 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,596 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,596 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,596 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: HTTPSMandatoryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,596 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 初始化。 +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string +2025-06-05 18:28:02,596 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,597 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version +2025-06-05 18:28:02,597 - testcase.TC-SECURITY-001 - WARNING - 原始URL 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version' 不是HTTPS。跳过此测试用例的URL修改。 +2025-06-05 18:28:02,618 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,618 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,618 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,618 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,618 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,618 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,618 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchQueryParamCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,618 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. +2025-06-05 18:28:02,618 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: No suitable simple type field found for query parameters. +2025-06-05 18:28:02,618 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No suitable simple type query parameter found for type mismatch test. +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,618 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) +2025-06-05 18:28:02,619 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No target field or original type identified for query param type mismatch. Skipping query param modification. +2025-06-05 18:28:02,619 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,619 - testcase.TC-ERROR-4001-QUERY - DEBUG - TC-ERROR-4001-QUERY is focused on query parameters, generate_request_body will not modify the body. +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,619 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version +2025-06-05 18:28:02,619 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version +2025-06-05 18:28:02,619 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. +2025-06-05 18:28:02,619 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version +2025-06-05 18:28:02,619 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,619 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 18:28:02,635 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Skipped type mismatch (query) validation: No target query parameter was identified. +2025-06-05 18:28:02,635 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.016556739807128906 +2025-06-05 18:28:02,635 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4001-QUERY' 执行成功。 +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 通过 +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,636 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,636 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,636 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,636 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,636 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,636 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,636 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Initializing: Looking for a simple type field in request body for type mismatch test. +2025-06-05 18:28:02,636 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json +2025-06-05 18:28:02,636 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... +2025-06-05 18:28:02,636 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=isSearchCount, Type=boolean +2025-06-05 18:28:02,636 - testcase.TC-ERROR-4001-BODY - INFO - _find_simple_type_field_in_schema: Found simple type field in 'request body': Path=isSearchCount, Type=boolean +2025-06-05 18:28:02,636 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): isSearchCount, Original Type: boolean +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) +2025-06-05 18:28:02,636 - testcase.TC-ERROR-4001-BODY - DEBUG - TC-ERROR-4001-BODY is focused on request body, generate_query_params will not modify query parameters. +2025-06-05 18:28:02,636 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,636 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Preparing to modify request body for type mismatch. Target path: ['isSearchCount'], Original type: boolean +2025-06-05 18:28:02,636 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value 'not-a-boolean' for original type 'boolean' at path 'isSearchCount'. +2025-06-05 18:28:02,636 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 isSearchCount (键 'isSearchCount') 处设置值为 'not-a-boolean' +2025-06-05 18:28:02,636 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. +2025-06-05 18:28:02,636 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,637 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version +2025-06-05 18:28:02,637 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version +2025-06-05 18:28:02,637 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. +2025-06-05 18:28:02,637 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version +2025-06-05 18:28:02,637 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,637 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 477\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version' DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version @@ -414,261 +412,261 @@ DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.3 DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 477\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version' DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 477\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version' -2025-06-05 15:29:09,481 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '53'. (Field: body.isSearchCount) -2025-06-05 15:29:09,481 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.015290260314941406 -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,481 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,481 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,481 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,481 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,481 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,481 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,481 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['isSearchCount', 'query'] -2025-06-05 15:29:09,481 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 -2025-06-05 15:29:09,481 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. -2025-06-05 15:29:09,481 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string -2025-06-05 15:29:09,481 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,482 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version -2025-06-05 15:29:09,500 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,501 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,501 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,501 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,501 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,501 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,501 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldQueryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,501 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. -2025-06-05 15:29:09,501 - testcase.TC-ERROR-4003-QUERY - INFO - 测试用例 TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 初始化。Target param to remove: None -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} -2025-06-05 15:29:09,501 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version -2025-06-05 15:29:09,519 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 测试完成,最终状态: 失败 -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} (地质单元列表查询) -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 发现了 7 个适用的测试用例 (已排序): ['TC-STATUS-001', 'TC-CORE-FUNC-001', 'TC-SECURITY-001', 'TC-ERROR-4001-QUERY', 'TC-ERROR-4001-BODY', 'TC-ERROR-4003-BODY', 'TC-ERROR-4003-QUERY'] -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,519 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,520 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,520 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,520 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,520 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,520 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,520 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: StatusCode200Check 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,520 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 初始化。 -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,520 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 -2025-06-05 15:29:09,543 - testcase.TC-STATUS-001 - INFO - 状态码验证通过: 200 == 200 for http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,543 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,543 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,543 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,543 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,543 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,543 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: ResponseSchemaValidationCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,543 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 初始化。 -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,543 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,544 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,544 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,544 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,544 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,544 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,544 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,544 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,544 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] -2025-06-05 15:29:09,544 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) -2025-06-05 15:29:09,544 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,544 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 +2025-06-05 18:28:02,653 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '83'. (Field: body.isSearchCount) +2025-06-05 18:28:02,653 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.016505002975463867 +2025-06-05 18:28:02,653 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 +2025-06-05 18:28:02,653 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 +2025-06-05 18:28:02,653 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,653 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,653 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,653 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,653 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,653 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,653 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,653 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,653 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,653 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,653 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,653 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,654 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['isSearchCount', 'query'] +2025-06-05 18:28:02,654 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 +2025-06-05 18:28:02,654 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. +2025-06-05 18:28:02,654 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,654 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version +2025-06-05 18:28:02,671 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 +2025-06-05 18:28:02,671 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 +2025-06-05 18:28:02,671 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 +2025-06-05 18:28:02,671 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,671 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,671 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,671 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,671 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,672 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,672 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,672 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,672 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,672 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,672 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldQueryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,672 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. +2025-06-05 18:28:02,672 - testcase.TC-ERROR-4003-QUERY - INFO - 测试用例 TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 初始化。Target param to remove: None +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716': application/json +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.isSearchCount): True +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.fields[0]): example_string +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.key): example_string +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.logic): example_string +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.filter.symbol): example_string +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_message_push_schema_version_135716] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_message_push_schema_version_135716_body.query.sort). Properties: [] +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' (type: ) +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'schema': 'example_schema', 'version': 'example_version'} +2025-06-05 18:28:02,672 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version +2025-06-05 18:28:02,688 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 测试完成,最终状态: 失败 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} (地质单元列表查询) +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 发现了 7 个适用的测试用例 (已排序): ['TC-STATUS-001', 'TC-CORE-FUNC-001', 'TC-SECURITY-001', 'TC-ERROR-4001-QUERY', 'TC-ERROR-4001-BODY', 'TC-ERROR-4003-BODY', 'TC-ERROR-4003-QUERY'] +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,689 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,689 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,689 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,689 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,689 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,689 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: StatusCode200Check 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,689 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 初始化。 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,689 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 +2025-06-05 18:28:02,705 - testcase.TC-STATUS-001 - INFO - 状态码验证通过: 200 == 200 for http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,705 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,705 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,705 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,705 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,705 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,705 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: ResponseSchemaValidationCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,705 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 初始化。 +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,705 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,706 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 488' -d '{"isSearchCount": "not-a-boolean", "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 488\' -d \'{"isSearchCount": "not-a-boolean", "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version' DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version @@ -677,288 +675,288 @@ DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.3 DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 477\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version' DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize' DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 477\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure \'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize\'' -2025-06-05 15:29:09,560 - testcase.TC-CORE-FUNC-001 - INFO - 响应包含JSON体,但在API规范中未找到针对状态码 200 的JSON schema。跳过schema验证。 -2025-06-05 15:29:09,560 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 -2025-06-05 15:29:09,560 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 -2025-06-05 15:29:09,560 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,560 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,560 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,560 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,560 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,560 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,560 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,560 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,560 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,560 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,560 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,560 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,560 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:09,560 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-05 15:29:09,560 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-05 15:29:09,560 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: HTTPSMandatoryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,561 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 初始化。 -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,561 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 -2025-06-05 15:29:09,561 - testcase.TC-SECURITY-001 - WARNING - 原始URL 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0' 不是HTTPS。跳过此测试用例的URL修改。 -2025-06-05 15:29:09,578 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,579 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,579 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,579 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,579 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,579 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,579 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchQueryParamCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' initialized for endpoint: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - DEBUG - _find_first_simple_type_parameter: Checking query parameter 'pageNo'. -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: Found simple type query parameter 'pageNo' (type: string) via its 'schema'. -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Target for type mismatch (query): Param='pageNo', Path='pageNo', Type='string' -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - DEBUG - [TC-ERROR-4001-QUERY] Preparing to modify query params for type mismatch. Target path: ['pageNo'], Original type: string -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Generated mismatched value '12345' for original type 'string' at query path 'pageNo'. -2025-06-05 15:29:09,579 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 pageNo (键 'pageNo') 处设置值为 '12345' -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - DEBUG - [TC-ERROR-4001-QUERY] Successfully set mismatched value in query params using util_set_value_at_path. -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - DEBUG - TC-ERROR-4001-QUERY is focused on query parameters, generate_request_body will not modify the body. -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,579 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,579 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-QUERY - WARNING - TC-ERROR-4001-QUERY: Failed. 当查询参数 'pageNo' (路径: 'pageNo') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '70'. (Query param: pageNo) -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.01512289047241211 -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-QUERY' 执行失败。 -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 失败 -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,595 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,595 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,595 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,595 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,595 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,595 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' initialized for endpoint: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Initializing: Looking for a simple type field in request body for type mismatch test. -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=isSearchCount, Type=boolean -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - INFO - _find_simple_type_field_in_schema: Found simple type field in 'request body': Path=isSearchCount, Type=boolean -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): isSearchCount, Original Type: boolean -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - DEBUG - TC-ERROR-4001-BODY is focused on request body, generate_query_params will not modify query parameters. -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Preparing to modify request body for type mismatch. Target path: ['isSearchCount'], Original type: boolean -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value 'not-a-boolean' for original type 'boolean' at path 'isSearchCount'. -2025-06-05 15:29:09,595 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 isSearchCount (键 'isSearchCount') 处设置值为 'not-a-boolean' -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,595 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,595 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: -2025-06-05 15:29:09,614 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '71'. (Field: body.isSearchCount) -2025-06-05 15:29:09,614 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.01814103126525879 -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,614 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,614 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,614 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,614 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,614 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,614 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,614 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['isSearchCount', 'query'] -2025-06-05 15:29:09,614 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 -2025-06-05 15:29:09,614 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. -2025-06-05 15:29:09,614 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,614 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,615 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,615 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,615 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,615 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,615 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,615 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] -2025-06-05 15:29:09,615 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) -2025-06-05 15:29:09,615 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,615 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 +2025-06-05 18:28:02,721 - testcase.TC-CORE-FUNC-001 - INFO - 响应包含JSON体,但在API规范中未找到针对状态码 200 的JSON schema。跳过schema验证。 +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,721 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,721 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,721 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,721 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,721 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,721 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 18:28:02,721 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: HTTPSMandatoryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,722 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 初始化。 +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,722 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,723 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,723 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,723 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,723 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,723 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,723 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,723 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,723 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] +2025-06-05 18:28:02,723 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) +2025-06-05 18:28:02,723 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,723 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 +2025-06-05 18:28:02,723 - testcase.TC-SECURITY-001 - WARNING - 原始URL 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0' 不是HTTPS。跳过此测试用例的URL修改。 +2025-06-05 18:28:02,738 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,738 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,738 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,738 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,738 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,738 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,738 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,738 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchQueryParamCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,738 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' initialized for endpoint: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} +2025-06-05 18:28:02,738 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. +2025-06-05 18:28:02,738 - testcase.TC-ERROR-4001-QUERY - DEBUG - _find_first_simple_type_parameter: Checking query parameter 'pageNo'. +2025-06-05 18:28:02,738 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: Found simple type query parameter 'pageNo' (type: string) via its 'schema'. +2025-06-05 18:28:02,738 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Target for type mismatch (query): Param='pageNo', Path='pageNo', Type='string' +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) +2025-06-05 18:28:02,739 - testcase.TC-ERROR-4001-QUERY - DEBUG - [TC-ERROR-4001-QUERY] Preparing to modify query params for type mismatch. Target path: ['pageNo'], Original type: string +2025-06-05 18:28:02,739 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Generated mismatched value '12345' for original type 'string' at query path 'pageNo'. +2025-06-05 18:28:02,739 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 pageNo (键 'pageNo') 处设置值为 '12345' +2025-06-05 18:28:02,739 - testcase.TC-ERROR-4001-QUERY - DEBUG - [TC-ERROR-4001-QUERY] Successfully set mismatched value in query params using util_set_value_at_path. +2025-06-05 18:28:02,739 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,739 - testcase.TC-ERROR-4001-QUERY - DEBUG - TC-ERROR-4001-QUERY is focused on query parameters, generate_request_body will not modify the body. +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,739 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 +2025-06-05 18:28:02,739 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 +2025-06-05 18:28:02,739 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. +2025-06-05 18:28:02,739 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 +2025-06-05 18:28:02,739 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,739 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 18:28:02,754 - testcase.TC-ERROR-4001-QUERY - WARNING - TC-ERROR-4001-QUERY: Failed. 当查询参数 'pageNo' (路径: 'pageNo') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '3'. (Query param: pageNo) +2025-06-05 18:28:02,754 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.015194177627563477 +2025-06-05 18:28:02,754 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-QUERY' 执行失败。 +2025-06-05 18:28:02,754 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 失败 +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,755 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,755 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,755 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,755 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,755 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,755 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,755 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' initialized for endpoint: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} +2025-06-05 18:28:02,755 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Initializing: Looking for a simple type field in request body for type mismatch test. +2025-06-05 18:28:02,755 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json +2025-06-05 18:28:02,755 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... +2025-06-05 18:28:02,755 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=isSearchCount, Type=boolean +2025-06-05 18:28:02,755 - testcase.TC-ERROR-4001-BODY - INFO - _find_simple_type_field_in_schema: Found simple type field in 'request body': Path=isSearchCount, Type=boolean +2025-06-05 18:28:02,755 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): isSearchCount, Original Type: boolean +2025-06-05 18:28:02,755 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,756 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,757 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] +2025-06-05 18:28:02,757 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) +2025-06-05 18:28:02,757 - testcase.TC-ERROR-4001-BODY - DEBUG - TC-ERROR-4001-BODY is focused on request body, generate_query_params will not modify query parameters. +2025-06-05 18:28:02,757 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,757 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Preparing to modify request body for type mismatch. Target path: ['isSearchCount'], Original type: boolean +2025-06-05 18:28:02,757 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value 'not-a-boolean' for original type 'boolean' at path 'isSearchCount'. +2025-06-05 18:28:02,757 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 isSearchCount (键 'isSearchCount') 处设置值为 'not-a-boolean' +2025-06-05 18:28:02,757 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. +2025-06-05 18:28:02,757 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,757 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 +2025-06-05 18:28:02,757 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 +2025-06-05 18:28:02,757 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. +2025-06-05 18:28:02,757 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 +2025-06-05 18:28:02,757 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,757 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 18:28:02,774 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '55'. (Field: body.isSearchCount) +2025-06-05 18:28:02,774 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.016716957092285156 +2025-06-05 18:28:02,774 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 +2025-06-05 18:28:02,774 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 +2025-06-05 18:28:02,774 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,774 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,774 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,774 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,774 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,774 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,774 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,775 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,775 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,775 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,775 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:02,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 18:28:02,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 18:28:02,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 18:28:02,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 18:28:02,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,775 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,775 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['isSearchCount', 'query'] +2025-06-05 18:28:02,775 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 +2025-06-05 18:28:02,775 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. +2025-06-05 18:28:02,775 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 +2025-06-05 18:28:02,775 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,775 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,775 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,776 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize' DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 477\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure \'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize\'' DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize' @@ -967,252 +965,252 @@ DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.3 DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 477\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure \'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=12345&pageSize=query_val_pageSize\'' DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 488' -d '{"isSearchCount": "not-a-boolean", "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize' DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 488\' -d \'{"isSearchCount": "not-a-boolean", "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure \'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize\'' -2025-06-05 15:29:09,631 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,631 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:09,631 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:09,631 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,631 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,631 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,631 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-05 15:29:09,631 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldQueryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,632 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. -2025-06-05 15:29:09,632 - testcase.TC-ERROR-4003-QUERY - INFO - 测试用例 TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 初始化。Target param to remove: None -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:09,632 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 -2025-06-05 15:29:09,647 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 测试完成,最终状态: 失败 -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据修改) -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 发现了 7 个适用的测试用例 (已排序): ['TC-STATUS-001', 'TC-CORE-FUNC-001', 'TC-SECURITY-001', 'TC-ERROR-4001-QUERY', 'TC-ERROR-4001-BODY', 'TC-ERROR-4003-BODY', 'TC-ERROR-4003-QUERY'] -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: StatusCode200Check 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,647 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-05 15:29:09,647 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,648 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,648 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} -2025-06-05 15:29:09,648 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,648 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,648 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,648 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] -2025-06-05 15:29:09,648 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string -2025-06-05 15:29:09,648 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string -2025-06-05 15:29:09,648 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) -2025-06-05 15:29:09,648 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,648 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,663 - testcase.TC-STATUS-001 - INFO - 状态码验证通过: 200 == 200 for http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: ResponseSchemaValidationCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,663 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,663 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,678 - testcase.TC-CORE-FUNC-001 - INFO - 将根据路径 'responses.200.content.application/json.schema' 的schema验证响应体。 -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: HTTPSMandatoryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,680 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,680 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,680 - testcase.TC-SECURITY-001 - WARNING - 原始URL 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit' 不是HTTPS。跳过此测试用例的URL修改。 -2025-06-05 15:29:09,699 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchQueryParamCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' initialized for endpoint: PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - DEBUG - _find_first_simple_type_parameter: Checking query parameter 'id'. -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: Found simple type query parameter 'id' (type: string) via its 'schema'. -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Target for type mismatch (query): Param='id', Path='id', Type='string' -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - DEBUG - [TC-ERROR-4001-QUERY] Preparing to modify query params for type mismatch. Target path: ['id'], Original type: string -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Generated mismatched value '12345' for original type 'string' at query path 'id'. -2025-06-05 15:29:09,699 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 id (键 'id') 处设置值为 '12345' -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - DEBUG - [TC-ERROR-4001-QUERY] Successfully set mismatched value in query params using util_set_value_at_path. -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - DEBUG - TC-ERROR-4001-QUERY is focused on query parameters, generate_request_body will not modify the body. -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,699 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,699 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: -2025-06-05 15:29:09,713 - testcase.TC-ERROR-4001-QUERY - WARNING - TC-ERROR-4001-QUERY: Failed. 当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '20'. (Query param: id) -2025-06-05 15:29:09,713 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.013532876968383789 -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-QUERY' 执行失败。 -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 失败 -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,713 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' initialized for endpoint: PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit -2025-06-05 15:29:09,713 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Initializing: Looking for a simple type field in request body for type mismatch test. -2025-06-05 15:29:09,713 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json -2025-06-05 15:29:09,713 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... -2025-06-05 15:29:09,713 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=id, Type=string -2025-06-05 15:29:09,713 - testcase.TC-ERROR-4001-BODY - INFO - _find_simple_type_field_in_schema: Found simple type field in 'request body': Path=id, Type=string -2025-06-05 15:29:09,713 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): id, Original Type: string -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string -2025-06-05 15:29:09,713 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) -2025-06-05 15:29:09,713 - testcase.TC-ERROR-4001-BODY - DEBUG - TC-ERROR-4001-BODY is focused on request body, generate_query_params will not modify query parameters. -2025-06-05 15:29:09,713 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,714 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Preparing to modify request body for type mismatch. Target path: ['id'], Original type: string -2025-06-05 15:29:09,714 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value '12345' for original type 'string' at path 'id'. -2025-06-05 15:29:09,714 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 id (键 'id') 处设置值为 '12345' -2025-06-05 15:29:09,714 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. -2025-06-05 15:29:09,714 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,714 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,714 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,714 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. -2025-06-05 15:29:09,714 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,714 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,714 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 18:28:02,796 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,796 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:02,796 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:02,796 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,796 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,796 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,796 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldQueryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,796 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. +2025-06-05 18:28:02,796 - testcase.TC-ERROR-4003-QUERY - INFO - 测试用例 TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 初始化。Target param to remove: None +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:02,796 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0 +2025-06-05 18:28:02,829 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 测试完成,最终状态: 失败 +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据修改) +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 发现了 7 个适用的测试用例 (已排序): ['TC-STATUS-001', 'TC-CORE-FUNC-001', 'TC-SECURITY-001', 'TC-ERROR-4001-QUERY', 'TC-ERROR-4001-BODY', 'TC-ERROR-4003-BODY', 'TC-ERROR-4003-QUERY'] +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: StatusCode200Check 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,829 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,829 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,843 - testcase.TC-STATUS-001 - INFO - 状态码验证通过: 200 == 200 for http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: ResponseSchemaValidationCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,843 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,843 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,844 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] +2025-06-05 18:28:02,844 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string +2025-06-05 18:28:02,844 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string +2025-06-05 18:28:02,844 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) +2025-06-05 18:28:02,844 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,844 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,859 - testcase.TC-CORE-FUNC-001 - INFO - 将根据路径 'responses.200.content.application/json.schema' 的schema验证响应体。 +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: HTTPSMandatoryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,863 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) +2025-06-05 18:28:02,863 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,864 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,864 - testcase.TC-SECURITY-001 - WARNING - 原始URL 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit' 不是HTTPS。跳过此测试用例的URL修改。 +2025-06-05 18:28:02,880 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchQueryParamCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,880 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' initialized for endpoint: PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit +2025-06-05 18:28:02,880 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. +2025-06-05 18:28:02,880 - testcase.TC-ERROR-4001-QUERY - DEBUG - _find_first_simple_type_parameter: Checking query parameter 'id'. +2025-06-05 18:28:02,880 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: Found simple type query parameter 'id' (type: string) via its 'schema'. +2025-06-05 18:28:02,880 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Target for type mismatch (query): Param='id', Path='id', Type='string' +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,880 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} +2025-06-05 18:28:02,881 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,881 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,881 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,881 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] +2025-06-05 18:28:02,881 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string +2025-06-05 18:28:02,881 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string +2025-06-05 18:28:02,881 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) +2025-06-05 18:28:02,881 - testcase.TC-ERROR-4001-QUERY - DEBUG - [TC-ERROR-4001-QUERY] Preparing to modify query params for type mismatch. Target path: ['id'], Original type: string +2025-06-05 18:28:02,881 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Generated mismatched value '12345' for original type 'string' at query path 'id'. +2025-06-05 18:28:02,881 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 id (键 'id') 处设置值为 '12345' +2025-06-05 18:28:02,881 - testcase.TC-ERROR-4001-QUERY - DEBUG - [TC-ERROR-4001-QUERY] Successfully set mismatched value in query params using util_set_value_at_path. +2025-06-05 18:28:02,881 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,881 - testcase.TC-ERROR-4001-QUERY - DEBUG - TC-ERROR-4001-QUERY is focused on query parameters, generate_request_body will not modify the body. +2025-06-05 18:28:02,881 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,881 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,881 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,881 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. +2025-06-05 18:28:02,881 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,881 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,881 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 18:28:02,894 - testcase.TC-ERROR-4001-QUERY - WARNING - TC-ERROR-4001-QUERY: Failed. 当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '15'. (Query param: id) +2025-06-05 18:28:02,895 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.013543844223022461 +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-QUERY' 执行失败。 +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 失败 +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,895 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' initialized for endpoint: PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit +2025-06-05 18:28:02,895 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Initializing: Looking for a simple type field in request body for type mismatch test. +2025-06-05 18:28:02,895 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json +2025-06-05 18:28:02,895 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... +2025-06-05 18:28:02,895 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=id, Type=string +2025-06-05 18:28:02,895 - testcase.TC-ERROR-4001-BODY - INFO - _find_simple_type_field_in_schema: Found simple type field in 'request body': Path=id, Type=string +2025-06-05 18:28:02,895 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): id, Original Type: string +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,895 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} +2025-06-05 18:28:02,896 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,896 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,896 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,896 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] +2025-06-05 18:28:02,896 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string +2025-06-05 18:28:02,896 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string +2025-06-05 18:28:02,896 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) +2025-06-05 18:28:02,896 - testcase.TC-ERROR-4001-BODY - DEBUG - TC-ERROR-4001-BODY is focused on request body, generate_query_params will not modify query parameters. +2025-06-05 18:28:02,896 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,896 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Preparing to modify request body for type mismatch. Target path: ['id'], Original type: string +2025-06-05 18:28:02,896 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value '12345' for original type 'string' at path 'id'. +2025-06-05 18:28:02,896 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 id (键 'id') 处设置值为 '12345' +2025-06-05 18:28:02,896 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. +2025-06-05 18:28:02,896 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,896 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,896 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,896 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. +2025-06-05 18:28:02,896 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,896 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,896 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize' DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 477\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure \'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize\'' DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize' @@ -1226,322 +1224,322 @@ DEBUG: curlify generated command (repr): 'curl -X PUT -H \'User-Agent: python-re DEBUG: curlify generated command (raw): curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 53' -d '{"id": "example_string", "version": "example_string"}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=12345' DEBUG: curlify generated command (repr): 'curl -X PUT -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 53\' -d \'{"id": "example_string", "version": "example_string"}\' --insecure \'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=12345\'' DEBUG: curlify generated command (raw): curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 42' -d '{"id": 12345, "version": "example_string"}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid' -2025-06-05 15:29:09,728 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'id' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '51'. (Field: body.id) -2025-06-05 15:29:09,728 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.014723777770996094 -2025-06-05 15:29:09,728 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 -2025-06-05 15:29:09,728 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 -2025-06-05 15:29:09,728 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,729 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: ['id', 'version'], 属性: ['id', 'version'] -2025-06-05 15:29:09,729 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 策略1: 在路径 root 找到可直接移除的必填字段: 'id' -2025-06-05 15:29:09,729 - testcase.TC-ERROR-4003-BODY - INFO - Found a removable field path in 'request body' schema: 'id' -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) -2025-06-05 15:29:09,729 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 从路径 'id' 成功移除字段 'id' (原值: 'example_string')。 -2025-06-05 15:29:09,729 - testcase.TC-ERROR-4003-BODY - INFO - 为进行必填字段缺失测试,已通过工具方法从请求体中移除字段路径 'id'。 -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,729 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,742 - testcase.TC-ERROR-4003-BODY - INFO - TC-ERROR-4003-BODY: Passed (Fallback). HTTP status 200 (4xx) with matching business code '4003'. (Removed field: body.id) -2025-06-05 15:29:09,742 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 -2025-06-05 15:29:09,742 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 -2025-06-05 15:29:09,742 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,742 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,742 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,742 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,742 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,742 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,742 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,742 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,742 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,742 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldQueryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,743 - testcase.TC-ERROR-4003-QUERY - INFO - Found required 'query' parameter: 'id'. -2025-06-05 15:29:09,743 - testcase.TC-ERROR-4003-QUERY - INFO - 测试用例 TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) 已针对端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。Target param to remove: id -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) -2025-06-05 15:29:09,743 - testcase.TC-ERROR-4003-QUERY - INFO - 为进行必填查询参数缺失测试,已从查询参数中移除 'id' (原值: 'dsid')。 -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,743 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,760 - testcase.TC-ERROR-4003-QUERY - WARNING - TC-ERROR-4003-QUERY: Failed. 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '82'. (Removed query param: id) -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4003-QUERY' 执行失败。 -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 失败 -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 测试完成,最终状态: 失败 -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据删除) -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 发现了 7 个适用的测试用例 (已排序): ['TC-STATUS-001', 'TC-CORE-FUNC-001', 'TC-SECURITY-001', 'TC-ERROR-4001-QUERY', 'TC-ERROR-4001-BODY', 'TC-ERROR-4003-BODY', 'TC-ERROR-4003-QUERY'] -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: StatusCode200Check 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,760 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,760 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,775 - testcase.TC-STATUS-001 - INFO - 状态码验证通过: 200 == 200 for http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: ResponseSchemaValidationCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,775 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,775 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,803 - testcase.TC-CORE-FUNC-001 - INFO - 将根据路径 'responses.200.content.application/json.schema' 的schema验证响应体。 -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: HTTPSMandatoryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,803 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,803 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} -2025-06-05 15:29:09,804 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,804 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,804 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,804 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,804 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string -2025-06-05 15:29:09,804 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,804 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string -2025-06-05 15:29:09,804 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) -2025-06-05 15:29:09,804 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,804 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,804 - testcase.TC-SECURITY-001 - WARNING - 原始URL 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit' 不是HTTPS。跳过此测试用例的URL修改。 -2025-06-05 15:29:09,831 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchQueryParamCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' initialized for endpoint: DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - DEBUG - _find_first_simple_type_parameter: Checking query parameter 'id'. -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: Found simple type query parameter 'id' (type: string) via its 'schema'. -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Target for type mismatch (query): Param='id', Path='id', Type='string' -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - DEBUG - [TC-ERROR-4001-QUERY] Preparing to modify query params for type mismatch. Target path: ['id'], Original type: string -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Generated mismatched value '12345' for original type 'string' at query path 'id'. -2025-06-05 15:29:09,831 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 id (键 'id') 处设置值为 '12345' -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - DEBUG - [TC-ERROR-4001-QUERY] Successfully set mismatched value in query params using util_set_value_at_path. -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - DEBUG - TC-ERROR-4001-QUERY is focused on query parameters, generate_request_body will not modify the body. -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,831 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-QUERY - WARNING - TC-ERROR-4001-QUERY: Failed. 当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '78'. (Query param: id) -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.015445947647094727 -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-QUERY' 执行失败。 -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 失败 -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' initialized for endpoint: DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Initializing: Looking for a simple type field in request body for type mismatch test. -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=version, Type=string -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - INFO - _find_simple_type_field_in_schema: Found simple type field in 'request body': Path=version, Type=string -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): version, Original Type: string -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - DEBUG - TC-ERROR-4001-BODY is focused on request body, generate_query_params will not modify query parameters. -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Preparing to modify request body for type mismatch. Target path: ['version'], Original type: string -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value '12345' for original type 'string' at path 'version'. -2025-06-05 15:29:09,847 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 version (键 'version') 处设置值为 '12345' -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,847 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,847 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: -2025-06-05 15:29:09,868 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '51'. (Field: body.version) -2025-06-05 15:29:09,868 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.02050924301147461 -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,868 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['version', 'data'] -2025-06-05 15:29:09,868 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 -2025-06-05 15:29:09,868 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. -2025-06-05 15:29:09,868 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,868 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,883 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldQueryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,883 - testcase.TC-ERROR-4003-QUERY - INFO - Found required 'query' parameter: 'id'. -2025-06-05 15:29:09,883 - testcase.TC-ERROR-4003-QUERY - INFO - 测试用例 TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) 已针对端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。Target param to remove: id -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) -2025-06-05 15:29:09,883 - testcase.TC-ERROR-4003-QUERY - INFO - 为进行必填查询参数缺失测试,已从查询参数中移除 'id' (原值: 'dsid')。 -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,883 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,910 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'id' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '9'. (Field: body.id) +2025-06-05 18:28:02,910 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.013818025588989258 +2025-06-05 18:28:02,910 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 +2025-06-05 18:28:02,910 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 +2025-06-05 18:28:02,910 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,910 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,910 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,910 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,911 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: ['id', 'version'], 属性: ['id', 'version'] +2025-06-05 18:28:02,911 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 策略1: 在路径 root 找到可直接移除的必填字段: 'id' +2025-06-05 18:28:02,911 - testcase.TC-ERROR-4003-BODY - INFO - Found a removable field path in 'request body' schema: 'id' +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string +2025-06-05 18:28:02,911 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string +2025-06-05 18:28:02,912 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) +2025-06-05 18:28:02,912 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 从路径 'id' 成功移除字段 'id' (原值: 'example_string')。 +2025-06-05 18:28:02,912 - testcase.TC-ERROR-4003-BODY - INFO - 为进行必填字段缺失测试,已通过工具方法从请求体中移除字段路径 'id'。 +2025-06-05 18:28:02,912 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,912 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,935 - testcase.TC-ERROR-4003-BODY - INFO - TC-ERROR-4003-BODY: Passed (Fallback). HTTP status 200 (4xx) with matching business code '4003'. (Removed field: body.id) +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldQueryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,935 - testcase.TC-ERROR-4003-QUERY - INFO - Found required 'query' parameter: 'id'. +2025-06-05 18:28:02,935 - testcase.TC-ERROR-4003-QUERY - INFO - 测试用例 TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) 已针对端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。Target param to remove: id +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'id': 'dsid'} +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749': application/json +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 object 类型数据 for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body). Properties: ['id', 'version'] +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.id): example_string +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - [put__api_dms_dms_instance_code_v1_cd_geo_unit_135749] 生成 string 类型数据 ('') for (context: put__api_dms_dms_instance_code_v1_cd_geo_unit_135749_body.version): example_string +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' (type: ) +2025-06-05 18:28:02,935 - testcase.TC-ERROR-4003-QUERY - INFO - 为进行必填查询参数缺失测试,已从查询参数中移除 'id' (原值: 'dsid')。 +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,935 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,949 - testcase.TC-ERROR-4003-QUERY - WARNING - TC-ERROR-4003-QUERY: Failed. 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '76'. (Removed query param: id) +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4003-QUERY' 执行失败。 +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 失败 +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 测试完成,最终状态: 失败 +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据删除) +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 发现了 7 个适用的测试用例 (已排序): ['TC-STATUS-001', 'TC-CORE-FUNC-001', 'TC-SECURITY-001', 'TC-ERROR-4001-QUERY', 'TC-ERROR-4001-BODY', 'TC-ERROR-4003-BODY', 'TC-ERROR-4003-QUERY'] +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: StatusCode200Check 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,949 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,949 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,964 - testcase.TC-STATUS-001 - INFO - 状态码验证通过: 200 == 200 for http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: ResponseSchemaValidationCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,964 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:02,964 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] +2025-06-05 18:28:02,965 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string +2025-06-05 18:28:02,965 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,965 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string +2025-06-05 18:28:02,965 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) +2025-06-05 18:28:02,965 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,965 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,979 - testcase.TC-CORE-FUNC-001 - INFO - 将根据路径 'responses.200.content.application/json.schema' 的schema验证响应体。 +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: HTTPSMandatoryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,980 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,980 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,981 - testcase.TC-SECURITY-001 - WARNING - 原始URL 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit' 不是HTTPS。跳过此测试用例的URL修改。 +2025-06-05 18:28:02,998 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchQueryParamCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' initialized for endpoint: DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - DEBUG - _find_first_simple_type_parameter: Checking query parameter 'id'. +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: Found simple type query parameter 'id' (type: string) via its 'schema'. +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Target for type mismatch (query): Param='id', Path='id', Type='string' +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - DEBUG - [TC-ERROR-4001-QUERY] Preparing to modify query params for type mismatch. Target path: ['id'], Original type: string +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Generated mismatched value '12345' for original type 'string' at query path 'id'. +2025-06-05 18:28:02,998 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 id (键 'id') 处设置值为 '12345' +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - DEBUG - [TC-ERROR-4001-QUERY] Successfully set mismatched value in query params using util_set_value_at_path. +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - DEBUG - TC-ERROR-4001-QUERY is focused on query parameters, generate_request_body will not modify the body. +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:02,998 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:02,998 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-QUERY - WARNING - TC-ERROR-4001-QUERY: Failed. 当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '72'. (Query param: id) +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.015112161636352539 +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-QUERY' 执行失败。 +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 失败 +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' initialized for endpoint: DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Initializing: Looking for a simple type field in request body for type mismatch test. +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=version, Type=string +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - INFO - _find_simple_type_field_in_schema: Found simple type field in 'request body': Path=version, Type=string +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): version, Original Type: string +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - DEBUG - TC-ERROR-4001-BODY is focused on request body, generate_query_params will not modify query parameters. +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Preparing to modify request body for type mismatch. Target path: ['version'], Original type: string +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value '12345' for original type 'string' at path 'version'. +2025-06-05 18:28:03,014 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 version (键 'version') 处设置值为 '12345' +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,014 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:03,014 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 18:28:03,031 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '54'. (Field: body.version) +2025-06-05 18:28:03,031 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.01698923110961914 +2025-06-05 18:28:03,031 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 +2025-06-05 18:28:03,031 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 +2025-06-05 18:28:03,031 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,031 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,031 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,031 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,031 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,031 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,031 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:03,031 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:03,031 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:03,031 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,032 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['version', 'data'] +2025-06-05 18:28:03,032 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 +2025-06-05 18:28:03,032 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. +2025-06-05 18:28:03,032 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,032 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,047 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldQueryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,047 - testcase.TC-ERROR-4003-QUERY - INFO - Found required 'query' parameter: 'id'. +2025-06-05 18:28:03,047 - testcase.TC-ERROR-4003-QUERY - INFO - 测试用例 TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) 已针对端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。Target param to remove: id +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'id': 'dsid'} +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750': application/json +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 object 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body). Properties: ['version', 'data'] +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.version): example_string +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 array 类型数据 for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - [delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750] 生成 string 类型数据 ('') for (context: delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750_body.data[0]): example_string +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' (type: ) +2025-06-05 18:28:03,047 - testcase.TC-ERROR-4003-QUERY - INFO - 为进行必填查询参数缺失测试,已从查询参数中移除 'id' (原值: 'dsid')。 +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,047 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit DEBUG: curlify generated command (repr): 'curl -X PUT -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 42\' -d \'{"id": 12345, "version": "example_string"}\' --insecure \'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid\'' DEBUG: curlify generated command (raw): curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 29' -d '{"version": "example_string"}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid' DEBUG: curlify generated command (repr): 'curl -X PUT -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 29\' -d \'{"version": "example_string"}\' --insecure \'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid\'' @@ -1559,269 +1557,269 @@ DEBUG: curlify generated command (raw): curl -X DELETE -H 'User-Agent: python-re DEBUG: curlify generated command (repr): 'curl -X DELETE -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 46\' -d \'{"version": 12345, "data": ["example_string"]}\' --insecure \'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid\'' DEBUG: curlify generated command (raw): curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 57' -d '{"version": "example_string", "data": ["example_string"]}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid' DEBUG: curlify generated command (repr): 'curl -X DELETE -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 57\' -d \'{"version": "example_string", "data": ["example_string"]}\' --insecure \'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid\'' -2025-06-05 15:29:09,897 - testcase.TC-ERROR-4003-QUERY - WARNING - TC-ERROR-4003-QUERY: Failed. 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '22'. (Removed query param: id) -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4003-QUERY' 执行失败。 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 失败 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 测试完成,最终状态: 失败 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据添加) -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 发现了 7 个适用的测试用例 (已排序): ['TC-STATUS-001', 'TC-CORE-FUNC-001', 'TC-SECURITY-001', 'TC-ERROR-4001-QUERY', 'TC-ERROR-4001-BODY', 'TC-ERROR-4003-BODY', 'TC-ERROR-4003-QUERY'] -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: StatusCode200Check 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,897 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,897 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,912 - testcase.TC-STATUS-001 - INFO - 状态码验证通过: 200 == 200 for http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: ResponseSchemaValidationCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,912 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,912 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,926 - testcase.TC-CORE-FUNC-001 - INFO - 响应包含JSON体,但在API规范中未找到针对状态码 200 的JSON schema。跳过schema验证。 -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: HTTPSMandatoryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,926 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,926 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,926 - testcase.TC-SECURITY-001 - WARNING - 原始URL 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit' 不是HTTPS。跳过此测试用例的URL修改。 -2025-06-05 15:29:09,943 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchQueryParamCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,943 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' initialized for endpoint: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit -2025-06-05 15:29:09,943 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. -2025-06-05 15:29:09,943 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: No suitable simple type field found for query parameters. -2025-06-05 15:29:09,943 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No suitable simple type query parameter found for type mismatch test. -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string -2025-06-05 15:29:09,943 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) -2025-06-05 15:29:09,943 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No target field or original type identified for query param type mismatch. Skipping query param modification. -2025-06-05 15:29:09,943 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,943 - testcase.TC-ERROR-4001-QUERY - DEBUG - TC-ERROR-4001-QUERY is focused on query parameters, generate_request_body will not modify the body. -2025-06-05 15:29:09,944 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,944 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,944 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,944 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. -2025-06-05 15:29:09,944 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,944 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,944 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: -2025-06-05 15:29:09,957 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Skipped type mismatch (query) validation: No target query parameter was identified. -2025-06-05 15:29:09,957 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.01344919204711914 -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4001-QUERY' 执行成功。 -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 通过 -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,957 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' initialized for endpoint: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit -2025-06-05 15:29:09,957 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Initializing: Looking for a simple type field in request body for type mismatch test. -2025-06-05 15:29:09,957 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json -2025-06-05 15:29:09,957 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... -2025-06-05 15:29:09,957 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=version, Type=string -2025-06-05 15:29:09,957 - testcase.TC-ERROR-4001-BODY - INFO - _find_simple_type_field_in_schema: Found simple type field in 'request body': Path=version, Type=string -2025-06-05 15:29:09,957 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): version, Original Type: string -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] -2025-06-05 15:29:09,957 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 -2025-06-05 15:29:09,958 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string -2025-06-05 15:29:09,958 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string -2025-06-05 15:29:09,958 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string -2025-06-05 15:29:09,958 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) -2025-06-05 15:29:09,958 - testcase.TC-ERROR-4001-BODY - DEBUG - TC-ERROR-4001-BODY is focused on request body, generate_query_params will not modify query parameters. -2025-06-05 15:29:09,958 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,958 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Preparing to modify request body for type mismatch. Target path: ['version'], Original type: string -2025-06-05 15:29:09,958 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value '12345' for original type 'string' at path 'version'. -2025-06-05 15:29:09,958 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 version (键 'version') 处设置值为 '12345' -2025-06-05 15:29:09,958 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. -2025-06-05 15:29:09,958 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,958 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,958 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,958 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. -2025-06-05 15:29:09,958 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,958 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:09,958 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: -2025-06-05 15:29:09,976 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '56'. (Field: body.version) -2025-06-05 15:29:09,976 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.018712997436523438 -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,977 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['version', 'data'] -2025-06-05 15:29:09,977 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 策略2: 在数组属性 'data' (路径 root) 的元素内找到必填字段: 'bsflag'. 路径: ['data', 0, 'bsflag'] -2025-06-05 15:29:09,977 - testcase.TC-ERROR-4003-BODY - INFO - Found a removable field path in 'request body' schema: 'data.0.bsflag' -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) -2025-06-05 15:29:09,977 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 从路径 'data.0.bsflag' 成功移除字段 'bsflag' (原值: '0.0')。 -2025-06-05 15:29:09,977 - testcase.TC-ERROR-4003-BODY - INFO - 为进行必填字段缺失测试,已通过工具方法从请求体中移除字段路径 'data.0.bsflag'。 -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,977 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:09,993 - testcase.TC-ERROR-4003-BODY - WARNING - TC-ERROR-4003-BODY: Failed. 当移除必填请求体字段 'data.0.bsflag' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '49'. (Removed field: body.data.0.bsflag) -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4003-BODY' 执行失败。 -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 失败 -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldQueryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:09,993 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. -2025-06-05 15:29:09,993 - testcase.TC-ERROR-4003-QUERY - INFO - 测试用例 TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。Target param to remove: None -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,993 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:09,994 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,994 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:09,994 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] -2025-06-05 15:29:09,994 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string -2025-06-05 15:29:09,994 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 -2025-06-05 15:29:09,994 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] -2025-06-05 15:29:09,994 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 -2025-06-05 15:29:09,994 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string -2025-06-05 15:29:09,994 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string -2025-06-05 15:29:09,994 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string -2025-06-05 15:29:09,994 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) -2025-06-05 15:29:09,994 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:09,994 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,061 - testcase.TC-ERROR-4003-QUERY - WARNING - TC-ERROR-4003-QUERY: Failed. 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '52'. (Removed query param: id) +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4003-QUERY' 执行失败。 +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 失败 +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 测试完成,最终状态: 失败 +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据添加) +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 发现了 7 个适用的测试用例 (已排序): ['TC-STATUS-001', 'TC-CORE-FUNC-001', 'TC-SECURITY-001', 'TC-ERROR-4001-QUERY', 'TC-ERROR-4001-BODY', 'TC-ERROR-4003-BODY', 'TC-ERROR-4003-QUERY'] +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,061 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: StatusCode200Check 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,062 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,062 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,081 - testcase.TC-STATUS-001 - INFO - 状态码验证通过: 200 == 200 for http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: ResponseSchemaValidationCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,081 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) +2025-06-05 18:28:03,081 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,082 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,096 - testcase.TC-CORE-FUNC-001 - INFO - 响应包含JSON体,但在API规范中未找到针对状态码 200 的JSON schema。跳过schema验证。 +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: HTTPSMandatoryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,096 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] +2025-06-05 18:28:03,096 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string +2025-06-05 18:28:03,097 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 +2025-06-05 18:28:03,097 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] +2025-06-05 18:28:03,097 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 +2025-06-05 18:28:03,097 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string +2025-06-05 18:28:03,097 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string +2025-06-05 18:28:03,097 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string +2025-06-05 18:28:03,097 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) +2025-06-05 18:28:03,097 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,097 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,097 - testcase.TC-SECURITY-001 - WARNING - 原始URL 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit' 不是HTTPS。跳过此测试用例的URL修改。 +2025-06-05 18:28:03,110 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchQueryParamCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,110 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' initialized for endpoint: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit +2025-06-05 18:28:03,110 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. +2025-06-05 18:28:03,110 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: No suitable simple type field found for query parameters. +2025-06-05 18:28:03,110 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No suitable simple type query parameter found for type mismatch test. +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string +2025-06-05 18:28:03,110 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string +2025-06-05 18:28:03,111 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string +2025-06-05 18:28:03,111 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) +2025-06-05 18:28:03,111 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No target field or original type identified for query param type mismatch. Skipping query param modification. +2025-06-05 18:28:03,111 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:03,111 - testcase.TC-ERROR-4001-QUERY - DEBUG - TC-ERROR-4001-QUERY is focused on query parameters, generate_request_body will not modify the body. +2025-06-05 18:28:03,111 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,111 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,111 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,111 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. +2025-06-05 18:28:03,111 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,111 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:03,111 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 18:28:03,124 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Skipped type mismatch (query) validation: No target query parameter was identified. +2025-06-05 18:28:03,124 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.013585090637207031 +2025-06-05 18:28:03,124 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4001-QUERY' 执行成功。 +2025-06-05 18:28:03,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 通过 +2025-06-05 18:28:03,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,124 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,124 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 18:28:03,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 18:28:03,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:03,124 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,124 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' initialized for endpoint: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Initializing: Looking for a simple type field in request body for type mismatch test. +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=version, Type=string +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - INFO - _find_simple_type_field_in_schema: Found simple type field in 'request body': Path=version, Type=string +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): version, Original Type: string +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - DEBUG - TC-ERROR-4001-BODY is focused on request body, generate_query_params will not modify query parameters. +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Preparing to modify request body for type mismatch. Target path: ['version'], Original type: string +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value '12345' for original type 'string' at path 'version'. +2025-06-05 18:28:03,125 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 version (键 'version') 处设置值为 '12345' +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,125 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:03,125 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 18:28:03,139 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '92'. (Field: body.version) +2025-06-05 18:28:03,139 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.01363515853881836 +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,139 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['version', 'data'] +2025-06-05 18:28:03,139 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 策略2: 在数组属性 'data' (路径 root) 的元素内找到必填字段: 'bsflag'. 路径: ['data', 0, 'bsflag'] +2025-06-05 18:28:03,139 - testcase.TC-ERROR-4003-BODY - INFO - Found a removable field path in 'request body' schema: 'data.0.bsflag' +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) +2025-06-05 18:28:03,139 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 从路径 'data.0.bsflag' 成功移除字段 'bsflag' (原值: '0.0')。 +2025-06-05 18:28:03,139 - testcase.TC-ERROR-4003-BODY - INFO - 为进行必填字段缺失测试,已通过工具方法从请求体中移除字段路径 'data.0.bsflag'。 +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,139 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,156 - testcase.TC-ERROR-4003-BODY - WARNING - TC-ERROR-4003-BODY: Failed. 当移除必填请求体字段 'data.0.bsflag' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '35'. (Removed field: body.data.0.bsflag) +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4003-BODY' 执行失败。 +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 失败 +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldQueryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,157 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. +2025-06-05 18:28:03,157 - testcase.TC-ERROR-4003-QUERY - INFO - 测试用例 TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。Target param to remove: None +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,157 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit DEBUG: curlify generated command (raw): curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 57' -d '{"version": "example_string", "data": ["example_string"]}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit DEBUG: curlify generated command (repr): 'curl -X DELETE -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 57\' -d \'{"version": "example_string", "data": ["example_string"]}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit' DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 152' -d '{"version": "example_string", "data": [{"bsflag": 0.0, "wellCommonName": "example_string", "wellId": "example_string", "dataRegion": "example_string"}]}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit @@ -1836,264 +1834,264 @@ DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.3 DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 141\' -d \'{"version": 12345, "data": [{"bsflag": 0.0, "wellCommonName": "example_string", "wellId": "example_string", "dataRegion": "example_string"}]}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit' DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 137' -d '{"version": "example_string", "data": [{"wellCommonName": "example_string", "wellId": "example_string", "dataRegion": "example_string"}]}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 137\' -d \'{"version": "example_string", "data": [{"wellCommonName": "example_string", "wellId": "example_string", "dataRegion": "example_string"}]}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit' -2025-06-05 15:29:10,009 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 测试完成,最终状态: 失败 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id} (地质单元查询详情) -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 发现了 7 个适用的测试用例 (已排序): ['TC-STATUS-001', 'TC-CORE-FUNC-001', 'TC-SECURITY-001', 'TC-ERROR-4001-QUERY', 'TC-ERROR-4001-BODY', 'TC-ERROR-4003-BODY', 'TC-ERROR-4003-QUERY'] -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:10,009 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:10,009 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:10,009 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,009 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,009 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,009 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: StatusCode200Check 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:10,009 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 初始化。 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,009 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -2025-06-05 15:29:10,024 - testcase.TC-STATUS-001 - INFO - 状态码验证通过: 200 == 200 for http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:10,024 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:10,024 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:10,024 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,024 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,024 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,024 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: ResponseSchemaValidationCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:10,024 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 初始化。 -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:10,024 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,025 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -2025-06-05 15:29:10,041 - testcase.TC-CORE-FUNC-001 - INFO - 将根据路径 'responses.200.content.application/json.schema' 的schema验证响应体。 -2025-06-05 15:29:10,041 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 -2025-06-05 15:29:10,041 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 -2025-06-05 15:29:10,041 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:10,042 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:10,042 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:10,042 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,042 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,042 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,042 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: HTTPSMandatoryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:10,042 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 初始化。 -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,042 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -2025-06-05 15:29:10,042 - testcase.TC-SECURITY-001 - WARNING - 原始URL 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id' 不是HTTPS。跳过此测试用例的URL修改。 -2025-06-05 15:29:10,056 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:10,056 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:10,056 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:10,056 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,056 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,056 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,056 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchQueryParamCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:10,056 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' initialized for endpoint: GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id} -2025-06-05 15:29:10,056 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. -2025-06-05 15:29:10,056 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: No suitable simple type field found for query parameters. -2025-06-05 15:29:10,056 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No suitable simple type query parameter found for type mismatch test. -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string -2025-06-05 15:29:10,056 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) -2025-06-05 15:29:10,057 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No target field or original type identified for query param type mismatch. Skipping query param modification. -2025-06-05 15:29:10,057 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:10,057 - testcase.TC-ERROR-4001-QUERY - DEBUG - TC-ERROR-4001-QUERY is focused on query parameters, generate_request_body will not modify the body. -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,057 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -2025-06-05 15:29:10,057 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -2025-06-05 15:29:10,057 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. -2025-06-05 15:29:10,057 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -2025-06-05 15:29:10,057 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:10,057 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 18:28:03,177 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 测试完成,最终状态: 失败 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id} (地质单元查询详情) +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 发现了 7 个适用的测试用例 (已排序): ['TC-STATUS-001', 'TC-CORE-FUNC-001', 'TC-SECURITY-001', 'TC-ERROR-4001-QUERY', 'TC-ERROR-4001-BODY', 'TC-ERROR-4003-BODY', 'TC-ERROR-4003-QUERY'] +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,177 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:03,177 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:03,177 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,177 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,177 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,177 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: StatusCode200Check 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,177 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 初始化。 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string +2025-06-05 18:28:03,177 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,178 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +2025-06-05 18:28:03,192 - testcase.TC-STATUS-001 - INFO - 状态码验证通过: 200 == 200 for http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,193 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:03,193 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:03,193 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,193 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,193 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,193 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: ResponseSchemaValidationCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,193 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 初始化。 +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-CORE-FUNC-001' (Response Body JSON Schema Validation) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,193 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +2025-06-05 18:28:03,207 - testcase.TC-CORE-FUNC-001 - INFO - 将根据路径 'responses.200.content.application/json.schema' 的schema验证响应体。 +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,207 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:03,207 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:03,207 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,207 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,207 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,207 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: HTTPSMandatoryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,207 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 初始化。 +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-SECURITY-001' (HTTPS Protocol Mandatory Verification) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:03,207 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,208 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +2025-06-05 18:28:03,208 - testcase.TC-SECURITY-001 - WARNING - 原始URL 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id' 不是HTTPS。跳过此测试用例的URL修改。 +2025-06-05 18:28:03,221 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,221 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:03,221 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:03,221 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,221 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,221 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,221 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchQueryParamCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,221 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' initialized for endpoint: GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id} +2025-06-05 18:28:03,221 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. +2025-06-05 18:28:03,221 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: No suitable simple type field found for query parameters. +2025-06-05 18:28:03,221 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No suitable simple type query parameter found for type mismatch test. +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-QUERY' (Error Code 4001 - Query Parameter Type Mismatch Validation) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string +2025-06-05 18:28:03,221 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) +2025-06-05 18:28:03,222 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No target field or original type identified for query param type mismatch. Skipping query param modification. +2025-06-05 18:28:03,222 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:03,222 - testcase.TC-ERROR-4001-QUERY - DEBUG - TC-ERROR-4001-QUERY is focused on query parameters, generate_request_body will not modify the body. +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,222 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +2025-06-05 18:28:03,222 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +2025-06-05 18:28:03,222 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. +2025-06-05 18:28:03,222 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +2025-06-05 18:28:03,222 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:03,222 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 152' -d '{"version": "example_string", "data": [{"bsflag": 0.0, "wellCommonName": "example_string", "wellId": "example_string", "dataRegion": "example_string"}]}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 152\' -d \'{"version": "example_string", "data": [{"bsflag": 0.0, "wellCommonName": "example_string", "wellId": "example_string", "dataRegion": "example_string"}]}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit' DEBUG: curlify generated command (raw): curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id @@ -2103,326 +2101,524 @@ DEBUG: curlify generated command (repr): 'curl -X GET -H \'User-Agent: python-re DEBUG: curlify generated command (raw): curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id DEBUG: curlify generated command (repr): 'curl -X GET -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 477\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id' DEBUG: curlify generated command (raw): curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -2025-06-05 15:29:10,075 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Skipped type mismatch (query) validation: No target query parameter was identified. -2025-06-05 15:29:10,075 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.018019914627075195 -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4001-QUERY' 执行成功。 -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 通过 -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:10,075 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:10,075 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:10,075 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,075 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,075 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,075 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:10,075 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' initialized for endpoint: GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id} -2025-06-05 15:29:10,075 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Initializing: Looking for a simple type field in request body for type mismatch test. -2025-06-05 15:29:10,075 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json -2025-06-05 15:29:10,075 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... -2025-06-05 15:29:10,075 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=isSearchCount, Type=boolean -2025-06-05 15:29:10,075 - testcase.TC-ERROR-4001-BODY - INFO - _find_simple_type_field_in_schema: Found simple type field in 'request body': Path=isSearchCount, Type=boolean -2025-06-05 15:29:10,075 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): isSearchCount, Original Type: boolean -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,075 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string -2025-06-05 15:29:10,076 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string -2025-06-05 15:29:10,076 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,076 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:10,076 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:10,076 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,076 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:10,076 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:10,076 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] -2025-06-05 15:29:10,076 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) -2025-06-05 15:29:10,076 - testcase.TC-ERROR-4001-BODY - DEBUG - TC-ERROR-4001-BODY is focused on request body, generate_query_params will not modify query parameters. -2025-06-05 15:29:10,076 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:10,076 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Preparing to modify request body for type mismatch. Target path: ['isSearchCount'], Original type: boolean -2025-06-05 15:29:10,076 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value 'not-a-boolean' for original type 'boolean' at path 'isSearchCount'. -2025-06-05 15:29:10,076 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 isSearchCount (键 'isSearchCount') 处设置值为 'not-a-boolean' -2025-06-05 15:29:10,076 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. -2025-06-05 15:29:10,076 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,076 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -2025-06-05 15:29:10,076 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -2025-06-05 15:29:10,076 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. -2025-06-05 15:29:10,076 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -2025-06-05 15:29:10,076 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-05 15:29:10,076 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: -2025-06-05 15:29:10,097 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '6'. (Field: body.isSearchCount) -2025-06-05 15:29:10,097 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.021120071411132812 -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:10,097 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:10,097 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:10,097 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,097 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,097 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,097 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:10,097 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['isSearchCount', 'query'] -2025-06-05 15:29:10,097 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 -2025-06-05 15:29:10,097 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. -2025-06-05 15:29:10,097 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,097 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,098 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -2025-06-05 15:29:10,115 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 -2025-06-05 15:29:10,115 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 -2025-06-05 15:29:10,115 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 -2025-06-05 15:29:10,115 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-05 15:29:10,116 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-05 15:29:10,116 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-05 15:29:10,116 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,116 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,116 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,116 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldQueryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) -2025-06-05 15:29:10,116 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. -2025-06-05 15:29:10,116 - testcase.TC-ERROR-4003-QUERY - INFO - 测试用例 TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) 已针对端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 初始化。Target param to remove: None -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} -2025-06-05 15:29:10,116 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -2025-06-05 15:29:10,138 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 测试完成,最终状态: 失败 -2025-06-05 15:29:10,139 - __main__ - INFO - 开始执行API测试阶段 (Stages),目录: ./custom_stages -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - INFO - Starting API Test Stage execution... -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - INFO - Evaluating test stages against 2 API group(s): ['公共分类', '地质单元'] -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - 'keyword_driven_crud_example': Starting API endpoint matching within group 'Template Group'. Found 0 APIs in group. -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - WARNING - 'keyword_driven_crud_example': No APIs found in the current group 'Template Group' to match against. -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - INFO - Processing Test Stage definition: ID='keyword_driven_crud_example', Name='Keyword-Driven Generic CRUD Stage Example' -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - WARNING - API group '公共分类' provided, but cannot determine group details or filter APIs for spec type . -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - 'keyword_driven_crud_example': Starting API endpoint matching within group '公共分类'. Found 6 APIs in group. -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': Matched API (Method: POST, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}, Title: '地质单元列表查询') to operation type 'list_query' based on keyword '列表'. -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': Matched API (Method: PUT, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit, Title: '地质单元数据修改') to operation type 'update' based on keyword '修改'. -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': Matched API (Method: DELETE, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit, Title: '地质单元数据删除') to operation type 'delete' based on keyword '删除'. -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': Matched API (Method: POST, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit, Title: '地质单元数据添加') to operation type 'add' based on keyword '添加'. -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': Matched API (Method: GET, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}, Title: '地质单元查询详情') to operation type 'detail_query' based on keyword '详情'. -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - 'keyword_driven_crud_example': Finished API endpoint matching. Matched operations: ['list_query', 'update', 'delete', 'add', 'detail_query'] -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Checking applicability of stage 'keyword_driven_crud_example' for API group '公共分类'... -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Checking applicability of 'Keyword-Driven Generic CRUD Stage Example' (RESOURCE_KEYWORD: '地质单元') for API group '公共分类'. -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['添加', '新建', '创建']', method='POST' -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元数据添加', MatchedText='地质单元数据添加' (for resource='地质单元', action='['添加', '新建', '创建']', method='POST') -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['列表查询', '查询列表', '获取列表', '分页查询']', method='POST' -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元列表查询', MatchedText='地质单元列表查询' (for resource='地质单元', action='['列表查询', '查询列表', '获取列表', '分页查询']', method='POST') -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['查询详情', '获取详情', '根据ID获取']', method='GET' -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元查询详情', MatchedText='地质单元查询详情' (for resource='地质单元', action='['查询详情', '获取详情', '根据ID获取']', method='GET') -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['修改', '更新']', method='PUT' -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元数据修改', MatchedText='地质单元数据修改' (for resource='地质单元', action='['修改', '更新']', method='PUT') -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['删除']', method='DELETE' -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元数据删除', MatchedText='地质单元数据删除' (for resource='地质单元', action='['删除']', method='DELETE') -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'Keyword-Driven Generic CRUD Stage Example' is APPLICABLE for group '公共分类'. All CRUD operations found for '地质单元'. Discovered keys: {'create': '地质单元数据添加', 'list': '地质单元列表查询', 'detail': '地质单元查询详情', 'update': '地质单元数据修改', 'delete': '地质单元数据删除'} -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - INFO - Test Stage 'keyword_driven_crud_example' is APPLICABLE to API group '公共分类'. Executing... -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling before_stage for stage 'keyword_driven_crud_example'. Context: {} -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Starting stage 'Keyword-Driven Generic CRUD Stage Example' for API group '公共分类'. Discovered op keys: {'create': '地质单元数据添加', 'list': '地质单元列表查询', 'detail': '地质单元查询详情', 'update': '地质单元数据修改', 'delete': '地质单元数据删除'} -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Initial stage context: {'unique_resource_name': 'Test_地质单元_1749108550_93ddd2', 'updated_resource_name': 'Test_地质单元_1749108550_93ddd2_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling before_step for stage 'keyword_driven_crud_example', step 'Add New 地质单元'. Context: {'unique_resource_name': 'Test_地质单元_1749108550_93ddd2', 'updated_resource_name': 'Test_地质单元_1749108550_93ddd2_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Executing before_step for step 'Add New 地质单元' in stage 'keyword_driven_crud_example' -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Looking up endpoint key='地质单元数据添加', group='公共分类' -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': 正在从 global_api_spec 中查找操作,键: '地质单元数据添加', API组: '公共分类' -2025-06-05 15:29:10,139 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': 找到匹配操作 '地质单元数据添加' -> Method: POST, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Preparing request data for resolved endpoint: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 '1.0.0' (路径: 'api_version') -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' -2025-06-05 15:29:10,139 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 'Test_地质单元_1749108550_93ddd2' (路径: 'unique_resource_name') -2025-06-05 15:29:10,140 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'dms_instance_code' 来自模板 '{{stage_context.dms_instance_code}}' -2025-06-05 15:29:10,140 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 'your_dms_instance_code' (路径: 'dms_instance_code') -2025-06-05 15:29:10,140 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' -2025-06-05 15:29:10,140 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 '1.0.0' (路径: 'api_version') -2025-06-05 15:29:10,140 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' -2025-06-05 15:29:10,140 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 'Test_地质单元_1749108550_93ddd2' (路径: 'unique_resource_name') -2025-06-05 15:29:10,140 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Constructed full_request_url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:10,140 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Executing API call POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:10,155 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Validating response. Status: 200 -2025-06-05 15:29:10,155 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Extracting outputs. Map: {} -2025-06-05 15:29:10,155 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling after_step for stage 'keyword_driven_crud_example', step 'Add New 地质单元'. -2025-06-05 15:29:10,155 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Executing after_step for step 'Add New 地质单元' in stage 'keyword_driven_crud_example' -2025-06-05 15:29:10,155 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling before_step for stage 'keyword_driven_crud_example', step 'List and Find Created 地质单元'. Context: {'unique_resource_name': 'Test_地质单元_1749108550_93ddd2', 'updated_resource_name': 'Test_地质单元_1749108550_93ddd2_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} -2025-06-05 15:29:10,155 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Executing before_step for step 'List and Find Created 地质单元' in stage 'keyword_driven_crud_example' -2025-06-05 15:29:10,155 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Looking up endpoint key='地质单元列表查询', group='公共分类' -2025-06-05 15:29:10,155 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': 正在从 global_api_spec 中查找操作,键: '地质单元列表查询', API组: '公共分类' -2025-06-05 15:29:10,155 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': 找到匹配操作 '地质单元列表查询' -> Method: POST, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} -2025-06-05 15:29:10,155 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Preparing request data for resolved endpoint: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} -2025-06-05 15:29:10,155 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:10,155 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} -2025-06-05 15:29:10,155 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:10,155 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 'Test_地质单元_1749108550_93ddd2' (路径: 'unique_resource_name') -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'dms_instance_code' 来自模板 '{{stage_context.dms_instance_code}}' -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 'your_dms_instance_code' (路径: 'dms_instance_code') -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 '1.0.0' (路径: 'api_version') -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 'Test_地质单元_1749108550_93ddd2' (路径: 'unique_resource_name') -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Constructed full_request_url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0 -2025-06-05 15:29:10,156 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Executing API call POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0 +2025-06-05 18:28:03,235 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Skipped type mismatch (query) validation: No target query parameter was identified. +2025-06-05 18:28:03,235 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.012937068939208984 +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4001-QUERY' 执行成功。 +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 通过 +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,235 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:03,235 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:03,235 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,235 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,235 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,235 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: TypeMismatchBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,235 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' initialized for endpoint: GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id} +2025-06-05 18:28:03,235 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Initializing: Looking for a simple type field in request body for type mismatch test. +2025-06-05 18:28:03,235 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json +2025-06-05 18:28:03,235 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... +2025-06-05 18:28:03,235 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=isSearchCount, Type=boolean +2025-06-05 18:28:03,235 - testcase.TC-ERROR-4001-BODY - INFO - _find_simple_type_field_in_schema: Found simple type field in 'request body': Path=isSearchCount, Type=boolean +2025-06-05 18:28:03,235 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): isSearchCount, Original Type: boolean +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4001-BODY' (Error Code 4001 - Request Body Type Mismatch Validation) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,235 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string +2025-06-05 18:28:03,236 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,236 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string +2025-06-05 18:28:03,236 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string +2025-06-05 18:28:03,236 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,236 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:03,236 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:03,236 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,236 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:03,236 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:03,236 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] +2025-06-05 18:28:03,236 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) +2025-06-05 18:28:03,236 - testcase.TC-ERROR-4001-BODY - DEBUG - TC-ERROR-4001-BODY is focused on request body, generate_query_params will not modify query parameters. +2025-06-05 18:28:03,236 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:03,236 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Preparing to modify request body for type mismatch. Target path: ['isSearchCount'], Original type: boolean +2025-06-05 18:28:03,236 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value 'not-a-boolean' for original type 'boolean' at path 'isSearchCount'. +2025-06-05 18:28:03,236 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 isSearchCount (键 'isSearchCount') 处设置值为 'not-a-boolean' +2025-06-05 18:28:03,236 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. +2025-06-05 18:28:03,236 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,236 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +2025-06-05 18:28:03,236 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: modify_request_url, original URL: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +2025-06-05 18:28:03,236 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. +2025-06-05 18:28:03,236 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_url, url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +2025-06-05 18:28:03,236 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 18:28:03,236 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 18:28:03,251 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '62'. (Field: body.isSearchCount) +2025-06-05 18:28:03,251 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.015334129333496094 +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,251 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:03,251 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:03,251 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,251 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,251 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,251 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,251 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldBodyCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,252 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['isSearchCount', 'query'] +2025-06-05 18:28:03,252 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 +2025-06-05 18:28:03,252 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. +2025-06-05 18:28:03,252 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-BODY' (Error Code 4003 - Missing Required Request Body Field Validation) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,252 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +2025-06-05 18:28:03,269 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 +2025-06-05 18:28:03,269 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 +2025-06-05 18:28:03,269 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 +2025-06-05 18:28:03,269 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,269 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 18:28:03,269 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 18:28:03,269 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 18:28:03,269 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 18:28:03,269 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 18:28:03,269 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 18:28:03,269 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,269 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,269 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,269 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 18:28:03,269 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 18:28:03,269 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 18:28:03,269 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 18:28:03,269 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 18:28:03,269 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 18:28:03,269 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备实例化测试用例类: MissingRequiredFieldQueryCase 使用 endpoint_spec (keys: ['method', 'path', 'title', 'summary', 'description', 'operationId', 'tags', 'parameters', 'requestBody', 'responses', '_source_format', '_yapi_id', '_yapi_raw_data', '_global_api_spec_for_resolution']) 和 global_api_spec (keys: ['yapi_categories']) +2025-06-05 18:28:03,270 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. +2025-06-05 18:28:03,270 - testcase.TC-ERROR-4003-QUERY - INFO - 测试用例 TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) 已针对端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 初始化。Target param to remove: None +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-ERROR-4003-QUERY' (Error Code 4003 - Missing Required Query Parameter Validation) for endpoint 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752': application/json +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 使用 schema 中的 'default' 值 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.isSearchCount): True +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.dataRegions[0]): example_string +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.fields[0]): example_string +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.key): example_string +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.logic): example_string +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.filter.symbol): example_string +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFields[0]): example_string +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.key): example_string +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.logic): example_string +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 array 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter). Items schema: {'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 string 类型数据 ('') for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - [get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752] 生成 object 类型数据 for (context: get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752_body.query.sort). Properties: [] +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' (type: ) +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0', 'id': 'example_id'} +2025-06-05 18:28:03,270 - ddms_compliance_suite.test_orchestrator - DEBUG - URL after path parameter substitution (before TC modify_request_url hook): http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +2025-06-05 18:28:03,284 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 +2025-06-05 18:28:03,284 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 +2025-06-05 18:28:03,284 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 +2025-06-05 18:28:03,284 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 测试完成,最终状态: 失败 +2025-06-05 18:28:03,284 - __main__ - INFO - 开始执行API测试阶段 (Stages),目录: ./custom_stages +2025-06-05 18:28:03,284 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行API测试阶段 (Stages)... +2025-06-05 18:28:03,284 - ddms_compliance_suite.test_orchestrator - INFO - 发现了 1 个已定义的测试阶段: ['generic_crud_validation_stage'] +2025-06-05 18:28:03,284 - ddms_compliance_suite.test_orchestrator - INFO - 将针对 2 个API分组评估测试阶段: ['公共分类', '地质单元'] +2025-06-05 18:28:03,284 - ddms_compliance_suite.test_orchestrator - INFO - 处理测试阶段定义: ID='generic_crud_validation_stage', Name='Generic CRUD Validation Stage' +2025-06-05 18:28:03,284 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备阶段 'generic_crud_validation_stage' 的上下文,针对API分组: '公共分类' +2025-06-05 18:28:03,284 - ddms_compliance_suite.test_orchestrator - DEBUG - For YAPI group '公共分类' (resolved ID: 17672), selected 1 endpoint objects. +2025-06-05 18:28:03,284 - ddms_compliance_suite.test_orchestrator - DEBUG - 为阶段 'generic_crud_validation_stage' 和分组 '公共分类' 实例化。API对象数量: 1. 元数据: {'name': '公共分类', 'description': '公共分类', 'id': 17672} +2025-06-05 18:28:03,284 - ddms_compliance_suite.test_orchestrator - DEBUG - 检查阶段 'generic_crud_validation_stage' 是否适用于API分组 '公共分类'... +2025-06-05 18:28:03,284 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - Checking applicability of 'Generic CRUD Validation Stage' for API group '公共分类'. +2025-06-05 18:28:03,284 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - Using default field/path configurations for group '公共分类'. Customize by overriding _determine_resource_config or cfg_* attributes. +2025-06-05 18:28:03,284 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Attempting to find operation: target_actions='['add', 'create', 'new', '添加', '新建', '创建']', target_method='POST', path_id_required=False, path_id_forbidden=True +2025-06-05 18:28:03,284 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='数据推送接口', Method='POST', Path='/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', Type='YAPIEndpoint' +2025-06-05 18:28:03,284 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '数据推送接口': {'method': 'POST', 'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135716, 'method': 'POST', 'title': '数据推送接口', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', 'req_params': [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '67ff3dc5335acf11b4926aba', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '67ff3dc5335acfae3f926ab9', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '67ff3dc5335acfad4f926ab8', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'project_id': 1193, 'catid': 17672, 'markdown': '', 'uid': 808, 'add_time': 1744780583, 'up_time': 1744780741, '__v': 0}, 'title': '数据推送接口', 'desc': '', '_id': 135716, 'project_id': 1193, 'catid': 17672, 'req_params': [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}], 'req_query': [], 'req_headers': [{'required': '1', '_id': '67ff3dc5335acf11b4926aba', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '67ff3dc5335acfae3f926ab9', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '67ff3dc5335acfad4f926ab8', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'status': 'undone', 'api_opened': False, 'uid': 808, 'category_name': '公共分类', 'category_id': 17672, '_parsed_req_body_schema': {'properties': {'isSearchCount': {'default': True, 'description': '是否统计总条数', 'type': 'boolean'}, 'query': {'description': '查询条件', 'properties': {'dataRegions': {'description': '数据域,如:JD、DG、TL', 'items': {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, 'type': 'array'}, 'fields': {'description': '查询的字段', 'items': {'description': '查询的字段', 'type': 'string'}, 'type': 'array'}, 'filter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'groupFields': {'description': '分组字段group by', 'items': {'description': '分组字段group by', 'type': 'string'}, 'type': 'array'}, 'groupFilter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'sort': {'additionalProperties': {'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'string'}, 'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'object', 'properties': {}}}, 'type': 'object', '$$ref': '#/components/schemas/QueryVO'}}, 'type': 'object', '$$ref': '#/components/schemas/RdbQueryPageInput'}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'object', 'properties': {'total': {'type': 'number'}, 'list': {'type': 'array', 'items': {'type': 'object', 'properties': {'dsid': {'type': 'string'}, 'dataRegion': {'type': 'string'}, 'gasReleaseMon': {'type': 'null'}, 'gasReleaseYear': {'type': 'null'}, 'releaseGasCum': {'type': 'null'}}}}}}}}} +2025-06-05 18:28:03,284 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Action match with '['add', 'create', 'new', '添加', '新建', '创建']'? False +2025-06-05 18:28:03,284 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Method match with 'POST'? True (Endpoint method: POST) +2025-06-05 18:28:03,284 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '数据推送接口': Checking req_params for path ID: [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}] +2025-06-05 18:28:03,284 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,284 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Calculated path_condition_met=True (required=False, forbidden=True) +2025-06-05 18:28:03,284 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '数据推送接口' (Action: False, Method: True, PathCond: True). Continuing search. +2025-06-05 18:28:03,284 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - WARNING - FAILURE: No operation found after checking all endpoints for: actions='['add', 'create', 'new', '添加', '新建', '创建']', method='POST', path_id_required=False, path_id_forbidden=True +2025-06-05 18:28:03,284 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Attempting to find operation: target_actions='['list', 'query', 'search', 'getall', 'getlist', '列表查询', '查询列表', '获取列表', '分页查询']', target_method='None', path_id_required=False, path_id_forbidden=True +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='数据推送接口', Method='POST', Path='/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', Type='YAPIEndpoint' +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '数据推送接口': {'method': 'POST', 'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135716, 'method': 'POST', 'title': '数据推送接口', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', 'req_params': [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '67ff3dc5335acf11b4926aba', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '67ff3dc5335acfae3f926ab9', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '67ff3dc5335acfad4f926ab8', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'project_id': 1193, 'catid': 17672, 'markdown': '', 'uid': 808, 'add_time': 1744780583, 'up_time': 1744780741, '__v': 0}, 'title': '数据推送接口', 'desc': '', '_id': 135716, 'project_id': 1193, 'catid': 17672, 'req_params': [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}], 'req_query': [], 'req_headers': [{'required': '1', '_id': '67ff3dc5335acf11b4926aba', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '67ff3dc5335acfae3f926ab9', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '67ff3dc5335acfad4f926ab8', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'status': 'undone', 'api_opened': False, 'uid': 808, 'category_name': '公共分类', 'category_id': 17672, '_parsed_req_body_schema': {'properties': {'isSearchCount': {'default': True, 'description': '是否统计总条数', 'type': 'boolean'}, 'query': {'description': '查询条件', 'properties': {'dataRegions': {'description': '数据域,如:JD、DG、TL', 'items': {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, 'type': 'array'}, 'fields': {'description': '查询的字段', 'items': {'description': '查询的字段', 'type': 'string'}, 'type': 'array'}, 'filter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'groupFields': {'description': '分组字段group by', 'items': {'description': '分组字段group by', 'type': 'string'}, 'type': 'array'}, 'groupFilter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'sort': {'additionalProperties': {'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'string'}, 'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'object', 'properties': {}}}, 'type': 'object', '$$ref': '#/components/schemas/QueryVO'}}, 'type': 'object', '$$ref': '#/components/schemas/RdbQueryPageInput'}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'object', 'properties': {'total': {'type': 'number'}, 'list': {'type': 'array', 'items': {'type': 'object', 'properties': {'dsid': {'type': 'string'}, 'dataRegion': {'type': 'string'}, 'gasReleaseMon': {'type': 'null'}, 'gasReleaseYear': {'type': 'null'}, 'releaseGasCum': {'type': 'null'}}}}}}}}} +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Action match with '['list', 'query', 'search', 'getall', 'getlist', '列表查询', '查询列表', '获取列表', '分页查询']'? False +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Method match with 'None'? True (Endpoint method: POST) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '数据推送接口': Checking req_params for path ID: [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}] +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Calculated path_condition_met=True (required=False, forbidden=True) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '数据推送接口' (Action: False, Method: True, PathCond: True). Continuing search. +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - WARNING - FAILURE: No operation found after checking all endpoints for: actions='['list', 'query', 'search', 'getall', 'getlist', '列表查询', '查询列表', '获取列表', '分页查询']', method='None', path_id_required=False, path_id_forbidden=True +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Attempting to find operation: target_actions='['detail', 'getbyid', 'getone', '查询详情', '获取详情', '根据ID获取']', target_method='GET', path_id_required=True, path_id_forbidden=False +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='数据推送接口', Method='POST', Path='/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', Type='YAPIEndpoint' +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '数据推送接口': {'method': 'POST', 'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135716, 'method': 'POST', 'title': '数据推送接口', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', 'req_params': [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '67ff3dc5335acf11b4926aba', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '67ff3dc5335acfae3f926ab9', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '67ff3dc5335acfad4f926ab8', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'project_id': 1193, 'catid': 17672, 'markdown': '', 'uid': 808, 'add_time': 1744780583, 'up_time': 1744780741, '__v': 0}, 'title': '数据推送接口', 'desc': '', '_id': 135716, 'project_id': 1193, 'catid': 17672, 'req_params': [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}], 'req_query': [], 'req_headers': [{'required': '1', '_id': '67ff3dc5335acf11b4926aba', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '67ff3dc5335acfae3f926ab9', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '67ff3dc5335acfad4f926ab8', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'status': 'undone', 'api_opened': False, 'uid': 808, 'category_name': '公共分类', 'category_id': 17672, '_parsed_req_body_schema': {'properties': {'isSearchCount': {'default': True, 'description': '是否统计总条数', 'type': 'boolean'}, 'query': {'description': '查询条件', 'properties': {'dataRegions': {'description': '数据域,如:JD、DG、TL', 'items': {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, 'type': 'array'}, 'fields': {'description': '查询的字段', 'items': {'description': '查询的字段', 'type': 'string'}, 'type': 'array'}, 'filter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'groupFields': {'description': '分组字段group by', 'items': {'description': '分组字段group by', 'type': 'string'}, 'type': 'array'}, 'groupFilter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'sort': {'additionalProperties': {'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'string'}, 'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'object', 'properties': {}}}, 'type': 'object', '$$ref': '#/components/schemas/QueryVO'}}, 'type': 'object', '$$ref': '#/components/schemas/RdbQueryPageInput'}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'object', 'properties': {'total': {'type': 'number'}, 'list': {'type': 'array', 'items': {'type': 'object', 'properties': {'dsid': {'type': 'string'}, 'dataRegion': {'type': 'string'}, 'gasReleaseMon': {'type': 'null'}, 'gasReleaseYear': {'type': 'null'}, 'releaseGasCum': {'type': 'null'}}}}}}}}} +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Action match with '['detail', 'getbyid', 'getone', '查询详情', '获取详情', '根据ID获取']'? False +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Method match with 'GET'? False (Endpoint method: POST) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '数据推送接口': Checking req_params for path ID: [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}] +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Calculated path_condition_met=False (required=True, forbidden=False) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '数据推送接口' (Action: False, Method: False, PathCond: False). Continuing search. +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - WARNING - FAILURE: No operation found after checking all endpoints for: actions='['detail', 'getbyid', 'getone', '查询详情', '获取详情', '根据ID获取']', method='GET', path_id_required=True, path_id_forbidden=False +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Attempting to find operation: target_actions='['update', 'edit', 'put', '修改', '更新']', target_method='PUT', path_id_required=True, path_id_forbidden=False +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='数据推送接口', Method='POST', Path='/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', Type='YAPIEndpoint' +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '数据推送接口': {'method': 'POST', 'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135716, 'method': 'POST', 'title': '数据推送接口', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', 'req_params': [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '67ff3dc5335acf11b4926aba', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '67ff3dc5335acfae3f926ab9', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '67ff3dc5335acfad4f926ab8', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'project_id': 1193, 'catid': 17672, 'markdown': '', 'uid': 808, 'add_time': 1744780583, 'up_time': 1744780741, '__v': 0}, 'title': '数据推送接口', 'desc': '', '_id': 135716, 'project_id': 1193, 'catid': 17672, 'req_params': [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}], 'req_query': [], 'req_headers': [{'required': '1', '_id': '67ff3dc5335acf11b4926aba', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '67ff3dc5335acfae3f926ab9', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '67ff3dc5335acfad4f926ab8', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'status': 'undone', 'api_opened': False, 'uid': 808, 'category_name': '公共分类', 'category_id': 17672, '_parsed_req_body_schema': {'properties': {'isSearchCount': {'default': True, 'description': '是否统计总条数', 'type': 'boolean'}, 'query': {'description': '查询条件', 'properties': {'dataRegions': {'description': '数据域,如:JD、DG、TL', 'items': {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, 'type': 'array'}, 'fields': {'description': '查询的字段', 'items': {'description': '查询的字段', 'type': 'string'}, 'type': 'array'}, 'filter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'groupFields': {'description': '分组字段group by', 'items': {'description': '分组字段group by', 'type': 'string'}, 'type': 'array'}, 'groupFilter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'sort': {'additionalProperties': {'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'string'}, 'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'object', 'properties': {}}}, 'type': 'object', '$$ref': '#/components/schemas/QueryVO'}}, 'type': 'object', '$$ref': '#/components/schemas/RdbQueryPageInput'}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'object', 'properties': {'total': {'type': 'number'}, 'list': {'type': 'array', 'items': {'type': 'object', 'properties': {'dsid': {'type': 'string'}, 'dataRegion': {'type': 'string'}, 'gasReleaseMon': {'type': 'null'}, 'gasReleaseYear': {'type': 'null'}, 'releaseGasCum': {'type': 'null'}}}}}}}}} +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Action match with '['update', 'edit', 'put', '修改', '更新']'? False +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Method match with 'PUT'? False (Endpoint method: POST) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '数据推送接口': Checking req_params for path ID: [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}] +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Calculated path_condition_met=False (required=True, forbidden=False) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '数据推送接口' (Action: False, Method: False, PathCond: False). Continuing search. +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - WARNING - FAILURE: No operation found after checking all endpoints for: actions='['update', 'edit', 'put', '修改', '更新']', method='PUT', path_id_required=True, path_id_forbidden=False +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Attempting to find operation: target_actions='['delete', 'remove', '删除']', target_method='DELETE', path_id_required=False, path_id_forbidden=False +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='数据推送接口', Method='POST', Path='/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', Type='YAPIEndpoint' +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '数据推送接口': {'method': 'POST', 'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135716, 'method': 'POST', 'title': '数据推送接口', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}', 'req_params': [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '67ff3dc5335acf11b4926aba', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '67ff3dc5335acfae3f926ab9', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '67ff3dc5335acfad4f926ab8', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'project_id': 1193, 'catid': 17672, 'markdown': '', 'uid': 808, 'add_time': 1744780583, 'up_time': 1744780741, '__v': 0}, 'title': '数据推送接口', 'desc': '', '_id': 135716, 'project_id': 1193, 'catid': 17672, 'req_params': [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}], 'req_query': [], 'req_headers': [{'required': '1', '_id': '67ff3dc5335acf11b4926aba', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '67ff3dc5335acfae3f926ab9', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '67ff3dc5335acfad4f926ab8', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'status': 'undone', 'api_opened': False, 'uid': 808, 'category_name': '公共分类', 'category_id': 17672, '_parsed_req_body_schema': {'properties': {'isSearchCount': {'default': True, 'description': '是否统计总条数', 'type': 'boolean'}, 'query': {'description': '查询条件', 'properties': {'dataRegions': {'description': '数据域,如:JD、DG、TL', 'items': {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, 'type': 'array'}, 'fields': {'description': '查询的字段', 'items': {'description': '查询的字段', 'type': 'string'}, 'type': 'array'}, 'filter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'groupFields': {'description': '分组字段group by', 'items': {'description': '分组字段group by', 'type': 'string'}, 'type': 'array'}, 'groupFilter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'sort': {'additionalProperties': {'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'string'}, 'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'object', 'properties': {}}}, 'type': 'object', '$$ref': '#/components/schemas/QueryVO'}}, 'type': 'object', '$$ref': '#/components/schemas/RdbQueryPageInput'}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'object', 'properties': {'total': {'type': 'number'}, 'list': {'type': 'array', 'items': {'type': 'object', 'properties': {'dsid': {'type': 'string'}, 'dataRegion': {'type': 'string'}, 'gasReleaseMon': {'type': 'null'}, 'gasReleaseYear': {'type': 'null'}, 'releaseGasCum': {'type': 'null'}}}}}}}}} +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Action match with '['delete', 'remove', '删除']'? False +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Method match with 'DELETE'? False (Endpoint method: POST) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '数据推送接口': Checking req_params for path ID: [{'_id': '67ff3dc5335acf6754926ab7', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '67ff3dc5335acf0829926ab6', 'name': 'schema', 'desc': ''}, {'_id': '67ff3dc5335acf485f926ab5', 'name': 'version', 'desc': ''}] +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '数据推送接口': Calculated path_condition_met=True (required=False, forbidden=False) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '数据推送接口' (Action: False, Method: False, PathCond: True). Continuing search. +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - WARNING - FAILURE: No operation found after checking all endpoints for: actions='['delete', 'remove', '删除']', method='DELETE', path_id_required=False, path_id_forbidden=False +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - WARNING - 'Generic CRUD Validation Stage' is NOT APPLICABLE for group '公共分类'. Missing required operations: ['create', 'detail', 'delete']. Discovered keys: {'create': None, 'list': None, 'detail': None, 'update': None, 'delete': None} +2025-06-05 18:28:03,285 - ddms_compliance_suite.test_orchestrator - INFO - 测试阶段 'generic_crud_validation_stage' 不适用于API分组 '公共分类'。跳过此分组。 +2025-06-05 18:28:03,285 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备阶段 'generic_crud_validation_stage' 的上下文,针对API分组: '地质单元' +2025-06-05 18:28:03,285 - ddms_compliance_suite.test_orchestrator - DEBUG - For YAPI group '地质单元' (resolved ID: 18705), selected 5 endpoint objects. +2025-06-05 18:28:03,285 - ddms_compliance_suite.test_orchestrator - DEBUG - 为阶段 'generic_crud_validation_stage' 和分组 '地质单元' 实例化。API对象数量: 5. 元数据: {'name': '地质单元', 'description': None, 'id': 18705} +2025-06-05 18:28:03,285 - ddms_compliance_suite.test_orchestrator - DEBUG - 检查阶段 'generic_crud_validation_stage' 是否适用于API分组 '地质单元'... +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - Checking applicability of 'Generic CRUD Validation Stage' for API group '地质单元'. +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - Using default field/path configurations for group '地质单元'. Customize by overriding _determine_resource_config or cfg_* attributes. +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Attempting to find operation: target_actions='['add', 'create', 'new', '添加', '新建', '创建']', target_method='POST', path_id_required=False, path_id_forbidden=True +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元列表查询', Method='POST', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', Type='YAPIEndpoint' +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元列表查询': {'method': 'POST', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135751, 'method': 'POST', 'title': '地质单元列表查询', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', 'req_params': [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd55a335acfb51b926d1d', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd55a335acf6226926d1c', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd55a335acf39a0926d1b', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [{'required': '0', '_id': '680dd55a335acfabfa926d1a', 'name': 'pageNo', 'desc': '页码(从1开始)'}, {'required': '0', '_id': '680dd55a335acf831b926d19', 'name': 'pageSize', 'desc': '分页大小(最大值200)'}], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736910, 'up_time': 1745737050, '__v': 0}, 'title': '地质单元列表查询', 'desc': '', '_id': 135751, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}], 'req_query': [{'required': '0', '_id': '680dd55a335acfabfa926d1a', 'name': 'pageNo', 'desc': '页码(从1开始)'}, {'required': '0', '_id': '680dd55a335acf831b926d19', 'name': 'pageSize', 'desc': '分页大小(最大值200)'}], 'req_headers': [{'required': '1', '_id': '680dd55a335acfb51b926d1d', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd55a335acf6226926d1c', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd55a335acf39a0926d1b', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'status': 'undone', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'properties': {'isSearchCount': {'default': True, 'description': '是否统计总条数', 'type': 'boolean'}, 'query': {'description': '查询条件', 'properties': {'dataRegions': {'description': '数据域,如:JD、DG、TL', 'items': {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, 'type': 'array'}, 'fields': {'description': '查询的字段', 'items': {'description': '查询的字段', 'type': 'string'}, 'type': 'array'}, 'filter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'groupFields': {'description': '分组字段group by', 'items': {'description': '分组字段group by', 'type': 'string'}, 'type': 'array'}, 'groupFilter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'sort': {'additionalProperties': {'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'string'}, 'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'object', 'properties': {}}}, 'type': 'object', '$$ref': '#/components/schemas/QueryVO'}}, 'type': 'object', '$$ref': '#/components/schemas/RdbQueryPageInput'}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'object', 'properties': {'total': {'type': 'number'}, 'list': {'type': 'array', 'items': {'type': 'object', 'properties': {'dsid': {'type': 'string'}, 'dataRegion': {'type': 'string'}, 'gasReleaseMon': {'type': 'null'}, 'gasReleaseYear': {'type': 'null'}, 'releaseGasCum': {'type': 'null'}}}}}}}}} +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Action match with '['add', 'create', 'new', '添加', '新建', '创建']'? False +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Method match with 'POST'? True (Endpoint method: POST) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元列表查询': Checking req_params for path ID: [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}] +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Calculated path_condition_met=True (required=False, forbidden=True) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元列表查询' (Action: False, Method: True, PathCond: True). Continuing search. +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元数据修改', Method='PUT', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit', Type='YAPIEndpoint' +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元数据修改': {'method': 'PUT', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135749, 'method': 'PUT', 'title': '地质单元数据修改', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'req_params': [{'_id': '680dd510335acf19c3926cec', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd510335acf7bb3926cf0', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd510335acf6953926cef', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd510335acfd86b926cee', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [{'required': '1', '_id': '680dd510335acf1ed1926ced', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"id":{"type":"string","required":true},"version":{"type":"string"}},"required":["id","version"]}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736907, 'up_time': 1745736976, '__v': 0}, 'title': '地质单元数据修改', 'desc': '', '_id': 135749, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd510335acf19c3926cec', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_query': [{'required': '1', '_id': '680dd510335acf1ed1926ced', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_headers': [{'required': '1', '_id': '680dd510335acf7bb3926cf0', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd510335acf6953926cef', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd510335acfd86b926cee', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"id":{"type":"string","required":true},"version":{"type":"string"}},"required":["id","version"]}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'status': 'undone', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'id': {'type': 'string', 'required': True}, 'version': {'type': 'string'}}, 'required': ['id', 'version']}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'boolean'}}}} +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Action match with '['add', 'create', 'new', '添加', '新建', '创建']'? False +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Method match with 'POST'? False (Endpoint method: PUT) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元数据修改': Checking req_params for path ID: [{'_id': '680dd510335acf19c3926cec', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}] +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Calculated path_condition_met=True (required=False, forbidden=True) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元数据修改' (Action: False, Method: False, PathCond: True). Continuing search. +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元数据删除', Method='DELETE', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit', Type='YAPIEndpoint' +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元数据删除': {'method': 'DELETE', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135750, 'method': 'DELETE', 'title': '地质单元数据删除', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'req_params': [{'_id': '680dd51b335acfe93a926cf1', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd51b335acfb316926cf5', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd51b335acf45f4926cf4', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd51b335acf0cfa926cf3', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [{'required': '1', '_id': '680dd51b335acf7441926cf2', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"版本号"},"data":{"type":"array","items":{"type":"string"},"title":"主键id数据集"}}}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736908, 'up_time': 1745736987, '__v': 0}, 'title': '地质单元数据删除', 'desc': '', '_id': 135750, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd51b335acfe93a926cf1', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_query': [{'required': '1', '_id': '680dd51b335acf7441926cf2', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_headers': [{'required': '1', '_id': '680dd51b335acfb316926cf5', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd51b335acf45f4926cf4', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd51b335acf0cfa926cf3', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"版本号"},"data":{"type":"array","items":{"type":"string"},"title":"主键id数据集"}}}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'status': 'undone', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'version': {'type': 'string', 'title': '版本号'}, 'data': {'type': 'array', 'items': {'type': 'string'}, 'title': '主键id数据集'}}}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'boolean'}}}} +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Action match with '['add', 'create', 'new', '添加', '新建', '创建']'? False +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Method match with 'POST'? False (Endpoint method: DELETE) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元数据删除': Checking req_params for path ID: [{'_id': '680dd51b335acfe93a926cf1', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}] +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Calculated path_condition_met=True (required=False, forbidden=True) +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元数据删除' (Action: False, Method: False, PathCond: True). Continuing search. +2025-06-05 18:28:03,285 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元数据添加', Method='POST', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit', Type='YAPIEndpoint' +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元数据添加': {'method': 'POST', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'params': []}, 'edit_uid': 0, 'status': 'done', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135748, 'method': 'POST', 'title': '地质单元数据添加', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'req_params': [{'_id': '680dd4ff335acf81b3926ce8', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd4ff335acfc5c7926ceb', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd4ff335acff16f926cea', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd4ff335acf1a5c926ce9', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"交换模型版本号"},"data":{"type":"array","items":{"type":"object","properties":{"bsflag":{"type":"number","title":"必填字段删除标记"},"wellCommonName":{"type":"string"},"wellId":{"type":"string"},"dataRegion":{"type":"string"}},"required":["bsflag","wellCommonName","wellId","dataRegion"]},"title":"交换模型数据集"}}}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736907, 'up_time': 1745736959, '__v': 0}, 'title': '地质单元数据添加', 'desc': '', '_id': 135748, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd4ff335acf81b3926ce8', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_query': [], 'req_headers': [{'required': '1', '_id': '680dd4ff335acfc5c7926ceb', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd4ff335acff16f926cea', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd4ff335acf1a5c926ce9', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"交换模型版本号"},"data":{"type":"array","items":{"type":"object","properties":{"bsflag":{"type":"number","title":"必填字段删除标记"},"wellCommonName":{"type":"string"},"wellId":{"type":"string"},"dataRegion":{"type":"string"}},"required":["bsflag","wellCommonName","wellId","dataRegion"]},"title":"交换模型数据集"}}}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'status': 'done', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'version': {'type': 'string', 'title': '交换模型版本号'}, 'data': {'type': 'array', 'items': {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, 'title': '交换模型数据集'}}}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'boolean'}}}} +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据添加': Action match with '['add', 'create', 'new', '添加', '新建', '创建']'? True +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据添加': Method match with 'POST'? True (Endpoint method: POST) +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元数据添加': Checking req_params for path ID: [{'_id': '680dd4ff335acf81b3926ce8', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}] +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据添加': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据添加': Calculated path_condition_met=True (required=False, forbidden=True) +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - SUCCESS: Op match for actions '['add', 'create', 'new', '添加', '新建', '创建']': Key='地质单元数据添加', MatchedText='地质单元数据添加', Method='POST', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Attempting to find operation: target_actions='['list', 'query', 'search', 'getall', 'getlist', '列表查询', '查询列表', '获取列表', '分页查询']', target_method='None', path_id_required=False, path_id_forbidden=True +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元列表查询', Method='POST', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', Type='YAPIEndpoint' +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元列表查询': {'method': 'POST', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135751, 'method': 'POST', 'title': '地质单元列表查询', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', 'req_params': [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd55a335acfb51b926d1d', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd55a335acf6226926d1c', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd55a335acf39a0926d1b', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [{'required': '0', '_id': '680dd55a335acfabfa926d1a', 'name': 'pageNo', 'desc': '页码(从1开始)'}, {'required': '0', '_id': '680dd55a335acf831b926d19', 'name': 'pageSize', 'desc': '分页大小(最大值200)'}], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736910, 'up_time': 1745737050, '__v': 0}, 'title': '地质单元列表查询', 'desc': '', '_id': 135751, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}], 'req_query': [{'required': '0', '_id': '680dd55a335acfabfa926d1a', 'name': 'pageNo', 'desc': '页码(从1开始)'}, {'required': '0', '_id': '680dd55a335acf831b926d19', 'name': 'pageSize', 'desc': '分页大小(最大值200)'}], 'req_headers': [{'required': '1', '_id': '680dd55a335acfb51b926d1d', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd55a335acf6226926d1c', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd55a335acf39a0926d1b', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'status': 'undone', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'properties': {'isSearchCount': {'default': True, 'description': '是否统计总条数', 'type': 'boolean'}, 'query': {'description': '查询条件', 'properties': {'dataRegions': {'description': '数据域,如:JD、DG、TL', 'items': {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, 'type': 'array'}, 'fields': {'description': '查询的字段', 'items': {'description': '查询的字段', 'type': 'string'}, 'type': 'array'}, 'filter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'groupFields': {'description': '分组字段group by', 'items': {'description': '分组字段group by', 'type': 'string'}, 'type': 'array'}, 'groupFilter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'sort': {'additionalProperties': {'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'string'}, 'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'object', 'properties': {}}}, 'type': 'object', '$$ref': '#/components/schemas/QueryVO'}}, 'type': 'object', '$$ref': '#/components/schemas/RdbQueryPageInput'}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'object', 'properties': {'total': {'type': 'number'}, 'list': {'type': 'array', 'items': {'type': 'object', 'properties': {'dsid': {'type': 'string'}, 'dataRegion': {'type': 'string'}, 'gasReleaseMon': {'type': 'null'}, 'gasReleaseYear': {'type': 'null'}, 'releaseGasCum': {'type': 'null'}}}}}}}}} +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Action match with '['list', 'query', 'search', 'getall', 'getlist', '列表查询', '查询列表', '获取列表', '分页查询']'? True +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Method match with 'None'? True (Endpoint method: POST) +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元列表查询': Checking req_params for path ID: [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}] +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Calculated path_condition_met=True (required=False, forbidden=True) +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - SUCCESS: Op match for actions '['list', 'query', 'search', 'getall', 'getlist', '列表查询', '查询列表', '获取列表', '分页查询']': Key='地质单元列表查询', MatchedText='地质单元列表查询', Method='POST', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Attempting to find operation: target_actions='['detail', 'getbyid', 'getone', '查询详情', '获取详情', '根据ID获取']', target_method='GET', path_id_required=True, path_id_forbidden=False +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元列表查询', Method='POST', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', Type='YAPIEndpoint' +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元列表查询': {'method': 'POST', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135751, 'method': 'POST', 'title': '地质单元列表查询', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', 'req_params': [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd55a335acfb51b926d1d', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd55a335acf6226926d1c', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd55a335acf39a0926d1b', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [{'required': '0', '_id': '680dd55a335acfabfa926d1a', 'name': 'pageNo', 'desc': '页码(从1开始)'}, {'required': '0', '_id': '680dd55a335acf831b926d19', 'name': 'pageSize', 'desc': '分页大小(最大值200)'}], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736910, 'up_time': 1745737050, '__v': 0}, 'title': '地质单元列表查询', 'desc': '', '_id': 135751, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}], 'req_query': [{'required': '0', '_id': '680dd55a335acfabfa926d1a', 'name': 'pageNo', 'desc': '页码(从1开始)'}, {'required': '0', '_id': '680dd55a335acf831b926d19', 'name': 'pageSize', 'desc': '分页大小(最大值200)'}], 'req_headers': [{'required': '1', '_id': '680dd55a335acfb51b926d1d', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd55a335acf6226926d1c', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd55a335acf39a0926d1b', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'status': 'undone', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'properties': {'isSearchCount': {'default': True, 'description': '是否统计总条数', 'type': 'boolean'}, 'query': {'description': '查询条件', 'properties': {'dataRegions': {'description': '数据域,如:JD、DG、TL', 'items': {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, 'type': 'array'}, 'fields': {'description': '查询的字段', 'items': {'description': '查询的字段', 'type': 'string'}, 'type': 'array'}, 'filter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'groupFields': {'description': '分组字段group by', 'items': {'description': '分组字段group by', 'type': 'string'}, 'type': 'array'}, 'groupFilter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'sort': {'additionalProperties': {'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'string'}, 'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'object', 'properties': {}}}, 'type': 'object', '$$ref': '#/components/schemas/QueryVO'}}, 'type': 'object', '$$ref': '#/components/schemas/RdbQueryPageInput'}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'object', 'properties': {'total': {'type': 'number'}, 'list': {'type': 'array', 'items': {'type': 'object', 'properties': {'dsid': {'type': 'string'}, 'dataRegion': {'type': 'string'}, 'gasReleaseMon': {'type': 'null'}, 'gasReleaseYear': {'type': 'null'}, 'releaseGasCum': {'type': 'null'}}}}}}}}} +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Action match with '['detail', 'getbyid', 'getone', '查询详情', '获取详情', '根据ID获取']'? False +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Method match with 'GET'? False (Endpoint method: POST) +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元列表查询': Checking req_params for path ID: [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}] +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Calculated path_condition_met=False (required=True, forbidden=False) +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元列表查询' (Action: False, Method: False, PathCond: False). Continuing search. +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元数据修改', Method='PUT', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit', Type='YAPIEndpoint' +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元数据修改': {'method': 'PUT', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135749, 'method': 'PUT', 'title': '地质单元数据修改', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'req_params': [{'_id': '680dd510335acf19c3926cec', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd510335acf7bb3926cf0', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd510335acf6953926cef', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd510335acfd86b926cee', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [{'required': '1', '_id': '680dd510335acf1ed1926ced', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"id":{"type":"string","required":true},"version":{"type":"string"}},"required":["id","version"]}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736907, 'up_time': 1745736976, '__v': 0}, 'title': '地质单元数据修改', 'desc': '', '_id': 135749, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd510335acf19c3926cec', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_query': [{'required': '1', '_id': '680dd510335acf1ed1926ced', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_headers': [{'required': '1', '_id': '680dd510335acf7bb3926cf0', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd510335acf6953926cef', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd510335acfd86b926cee', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"id":{"type":"string","required":true},"version":{"type":"string"}},"required":["id","version"]}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'status': 'undone', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'id': {'type': 'string', 'required': True}, 'version': {'type': 'string'}}, 'required': ['id', 'version']}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'boolean'}}}} +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Action match with '['detail', 'getbyid', 'getone', '查询详情', '获取详情', '根据ID获取']'? False +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Method match with 'GET'? False (Endpoint method: PUT) +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元数据修改': Checking req_params for path ID: [{'_id': '680dd510335acf19c3926cec', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}] +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Calculated path_condition_met=False (required=True, forbidden=False) +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元数据修改' (Action: False, Method: False, PathCond: False). Continuing search. +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元数据删除', Method='DELETE', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit', Type='YAPIEndpoint' +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元数据删除': {'method': 'DELETE', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135750, 'method': 'DELETE', 'title': '地质单元数据删除', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'req_params': [{'_id': '680dd51b335acfe93a926cf1', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd51b335acfb316926cf5', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd51b335acf45f4926cf4', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd51b335acf0cfa926cf3', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [{'required': '1', '_id': '680dd51b335acf7441926cf2', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"版本号"},"data":{"type":"array","items":{"type":"string"},"title":"主键id数据集"}}}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736908, 'up_time': 1745736987, '__v': 0}, 'title': '地质单元数据删除', 'desc': '', '_id': 135750, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd51b335acfe93a926cf1', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_query': [{'required': '1', '_id': '680dd51b335acf7441926cf2', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_headers': [{'required': '1', '_id': '680dd51b335acfb316926cf5', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd51b335acf45f4926cf4', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd51b335acf0cfa926cf3', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"版本号"},"data":{"type":"array","items":{"type":"string"},"title":"主键id数据集"}}}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'status': 'undone', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'version': {'type': 'string', 'title': '版本号'}, 'data': {'type': 'array', 'items': {'type': 'string'}, 'title': '主键id数据集'}}}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'boolean'}}}} +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Action match with '['detail', 'getbyid', 'getone', '查询详情', '获取详情', '根据ID获取']'? False +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Method match with 'GET'? False (Endpoint method: DELETE) +2025-06-05 18:28:03,286 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元数据删除': Checking req_params for path ID: [{'_id': '680dd51b335acfe93a926cf1', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}] +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Calculated path_condition_met=False (required=True, forbidden=False) +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元数据删除' (Action: False, Method: False, PathCond: False). Continuing search. +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元数据添加', Method='POST', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit', Type='YAPIEndpoint' +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元数据添加': {'method': 'POST', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'params': []}, 'edit_uid': 0, 'status': 'done', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135748, 'method': 'POST', 'title': '地质单元数据添加', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'req_params': [{'_id': '680dd4ff335acf81b3926ce8', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd4ff335acfc5c7926ceb', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd4ff335acff16f926cea', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd4ff335acf1a5c926ce9', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"交换模型版本号"},"data":{"type":"array","items":{"type":"object","properties":{"bsflag":{"type":"number","title":"必填字段删除标记"},"wellCommonName":{"type":"string"},"wellId":{"type":"string"},"dataRegion":{"type":"string"}},"required":["bsflag","wellCommonName","wellId","dataRegion"]},"title":"交换模型数据集"}}}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736907, 'up_time': 1745736959, '__v': 0}, 'title': '地质单元数据添加', 'desc': '', '_id': 135748, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd4ff335acf81b3926ce8', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_query': [], 'req_headers': [{'required': '1', '_id': '680dd4ff335acfc5c7926ceb', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd4ff335acff16f926cea', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd4ff335acf1a5c926ce9', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"交换模型版本号"},"data":{"type":"array","items":{"type":"object","properties":{"bsflag":{"type":"number","title":"必填字段删除标记"},"wellCommonName":{"type":"string"},"wellId":{"type":"string"},"dataRegion":{"type":"string"}},"required":["bsflag","wellCommonName","wellId","dataRegion"]},"title":"交换模型数据集"}}}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'status': 'done', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'version': {'type': 'string', 'title': '交换模型版本号'}, 'data': {'type': 'array', 'items': {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, 'title': '交换模型数据集'}}}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'boolean'}}}} +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据添加': Action match with '['detail', 'getbyid', 'getone', '查询详情', '获取详情', '根据ID获取']'? False +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据添加': Method match with 'GET'? False (Endpoint method: POST) +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元数据添加': Checking req_params for path ID: [{'_id': '680dd4ff335acf81b3926ce8', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}] +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据添加': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据添加': Calculated path_condition_met=False (required=True, forbidden=False) +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元数据添加' (Action: False, Method: False, PathCond: False). Continuing search. +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元查询详情', Method='GET', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}', Type='YAPIEndpoint' +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元查询详情': {'method': 'GET', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}', 'params': []}, 'edit_uid': 0, 'status': 'done', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135752, 'method': 'GET', 'title': '地质单元查询详情', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}', 'req_params': [{'_id': '680dd53d335acf42db926d05', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd53d335acf2105926d04', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}, {'_id': '680dd53d335acf7970926d03', 'name': 'id', 'desc': ''}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd53d335acf68e4926d08', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd53d335acf9fb4926d07', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd53d335acf7a8d926d06', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736911, 'up_time': 1745737021, '__v': 0}, 'title': '地质单元查询详情', 'desc': '', '_id': 135752, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd53d335acf42db926d05', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd53d335acf2105926d04', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}, {'_id': '680dd53d335acf7970926d03', 'name': 'id', 'desc': ''}], 'req_query': [], 'req_headers': [{'required': '1', '_id': '680dd53d335acf68e4926d08', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd53d335acf9fb4926d07', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd53d335acf7a8d926d06', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'status': 'done', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'properties': {'isSearchCount': {'default': True, 'description': '是否统计总条数', 'type': 'boolean'}, 'query': {'description': '查询条件', 'properties': {'dataRegions': {'description': '数据域,如:JD、DG、TL', 'items': {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, 'type': 'array'}, 'fields': {'description': '查询的字段', 'items': {'description': '查询的字段', 'type': 'string'}, 'type': 'array'}, 'filter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'groupFields': {'description': '分组字段group by', 'items': {'description': '分组字段group by', 'type': 'string'}, 'type': 'array'}, 'groupFilter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'sort': {'additionalProperties': {'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'string'}, 'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'object', 'properties': {}}}, 'type': 'object', '$$ref': '#/components/schemas/QueryVO'}}, 'type': 'object', '$$ref': '#/components/schemas/RdbQueryPageInput'}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'object', 'properties': {'total': {'type': 'number'}, 'list': {'type': 'array', 'items': {'type': 'object', 'properties': {'dsid': {'type': 'string'}, 'dataRegion': {'type': 'string'}, 'gasReleaseMon': {'type': 'null'}, 'gasReleaseYear': {'type': 'null'}, 'releaseGasCum': {'type': 'null'}}}}}}}}} +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元查询详情': Action match with '['detail', 'getbyid', 'getone', '查询详情', '获取详情', '根据ID获取']'? True +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元查询详情': Method match with 'GET'? True (Endpoint method: GET) +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元查询详情': Checking req_params for path ID: [{'_id': '680dd53d335acf42db926d05', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd53d335acf2105926d04', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}, {'_id': '680dd53d335acf7970926d03', 'name': 'id', 'desc': ''}] +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Found ID path parameter in YAPI req_params: 'id' +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元查询详情': Calculated path_contains_id_param=True (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元查询详情': Calculated path_condition_met=True (required=True, forbidden=False) +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - SUCCESS: Op match for actions '['detail', 'getbyid', 'getone', '查询详情', '获取详情', '根据ID获取']': Key='地质单元查询详情', MatchedText='地质单元查询详情', Method='GET', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Attempting to find operation: target_actions='['update', 'edit', 'put', '修改', '更新']', target_method='PUT', path_id_required=True, path_id_forbidden=False +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元列表查询', Method='POST', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', Type='YAPIEndpoint' +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元列表查询': {'method': 'POST', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135751, 'method': 'POST', 'title': '地质单元列表查询', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', 'req_params': [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd55a335acfb51b926d1d', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd55a335acf6226926d1c', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd55a335acf39a0926d1b', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [{'required': '0', '_id': '680dd55a335acfabfa926d1a', 'name': 'pageNo', 'desc': '页码(从1开始)'}, {'required': '0', '_id': '680dd55a335acf831b926d19', 'name': 'pageSize', 'desc': '分页大小(最大值200)'}], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736910, 'up_time': 1745737050, '__v': 0}, 'title': '地质单元列表查询', 'desc': '', '_id': 135751, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}], 'req_query': [{'required': '0', '_id': '680dd55a335acfabfa926d1a', 'name': 'pageNo', 'desc': '页码(从1开始)'}, {'required': '0', '_id': '680dd55a335acf831b926d19', 'name': 'pageSize', 'desc': '分页大小(最大值200)'}], 'req_headers': [{'required': '1', '_id': '680dd55a335acfb51b926d1d', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd55a335acf6226926d1c', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd55a335acf39a0926d1b', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'status': 'undone', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'properties': {'isSearchCount': {'default': True, 'description': '是否统计总条数', 'type': 'boolean'}, 'query': {'description': '查询条件', 'properties': {'dataRegions': {'description': '数据域,如:JD、DG、TL', 'items': {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, 'type': 'array'}, 'fields': {'description': '查询的字段', 'items': {'description': '查询的字段', 'type': 'string'}, 'type': 'array'}, 'filter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'groupFields': {'description': '分组字段group by', 'items': {'description': '分组字段group by', 'type': 'string'}, 'type': 'array'}, 'groupFilter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'sort': {'additionalProperties': {'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'string'}, 'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'object', 'properties': {}}}, 'type': 'object', '$$ref': '#/components/schemas/QueryVO'}}, 'type': 'object', '$$ref': '#/components/schemas/RdbQueryPageInput'}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'object', 'properties': {'total': {'type': 'number'}, 'list': {'type': 'array', 'items': {'type': 'object', 'properties': {'dsid': {'type': 'string'}, 'dataRegion': {'type': 'string'}, 'gasReleaseMon': {'type': 'null'}, 'gasReleaseYear': {'type': 'null'}, 'releaseGasCum': {'type': 'null'}}}}}}}}} +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Action match with '['update', 'edit', 'put', '修改', '更新']'? False +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Method match with 'PUT'? False (Endpoint method: POST) +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元列表查询': Checking req_params for path ID: [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}] +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Calculated path_condition_met=False (required=True, forbidden=False) +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元列表查询' (Action: False, Method: False, PathCond: False). Continuing search. +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元数据修改', Method='PUT', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit', Type='YAPIEndpoint' +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元数据修改': {'method': 'PUT', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135749, 'method': 'PUT', 'title': '地质单元数据修改', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'req_params': [{'_id': '680dd510335acf19c3926cec', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd510335acf7bb3926cf0', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd510335acf6953926cef', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd510335acfd86b926cee', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [{'required': '1', '_id': '680dd510335acf1ed1926ced', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"id":{"type":"string","required":true},"version":{"type":"string"}},"required":["id","version"]}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736907, 'up_time': 1745736976, '__v': 0}, 'title': '地质单元数据修改', 'desc': '', '_id': 135749, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd510335acf19c3926cec', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_query': [{'required': '1', '_id': '680dd510335acf1ed1926ced', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_headers': [{'required': '1', '_id': '680dd510335acf7bb3926cf0', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd510335acf6953926cef', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd510335acfd86b926cee', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"id":{"type":"string","required":true},"version":{"type":"string"}},"required":["id","version"]}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'status': 'undone', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'id': {'type': 'string', 'required': True}, 'version': {'type': 'string'}}, 'required': ['id', 'version']}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'boolean'}}}} +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Action match with '['update', 'edit', 'put', '修改', '更新']'? True +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Method match with 'PUT'? True (Endpoint method: PUT) +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元数据修改': Checking req_params for path ID: [{'_id': '680dd510335acf19c3926cec', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}] +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Calculated path_condition_met=False (required=True, forbidden=False) +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元数据修改' (Action: True, Method: True, PathCond: False). Continuing search. +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元数据删除', Method='DELETE', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit', Type='YAPIEndpoint' +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元数据删除': {'method': 'DELETE', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135750, 'method': 'DELETE', 'title': '地质单元数据删除', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'req_params': [{'_id': '680dd51b335acfe93a926cf1', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd51b335acfb316926cf5', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd51b335acf45f4926cf4', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd51b335acf0cfa926cf3', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [{'required': '1', '_id': '680dd51b335acf7441926cf2', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"版本号"},"data":{"type":"array","items":{"type":"string"},"title":"主键id数据集"}}}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736908, 'up_time': 1745736987, '__v': 0}, 'title': '地质单元数据删除', 'desc': '', '_id': 135750, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd51b335acfe93a926cf1', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_query': [{'required': '1', '_id': '680dd51b335acf7441926cf2', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_headers': [{'required': '1', '_id': '680dd51b335acfb316926cf5', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd51b335acf45f4926cf4', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd51b335acf0cfa926cf3', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"版本号"},"data":{"type":"array","items":{"type":"string"},"title":"主键id数据集"}}}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'status': 'undone', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'version': {'type': 'string', 'title': '版本号'}, 'data': {'type': 'array', 'items': {'type': 'string'}, 'title': '主键id数据集'}}}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'boolean'}}}} +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Action match with '['update', 'edit', 'put', '修改', '更新']'? False +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Method match with 'PUT'? False (Endpoint method: DELETE) +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元数据删除': Checking req_params for path ID: [{'_id': '680dd51b335acfe93a926cf1', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}] +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Calculated path_condition_met=False (required=True, forbidden=False) +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元数据删除' (Action: False, Method: False, PathCond: False). Continuing search. +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元数据添加', Method='POST', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit', Type='YAPIEndpoint' +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元数据添加': {'method': 'POST', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'params': []}, 'edit_uid': 0, 'status': 'done', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135748, 'method': 'POST', 'title': '地质单元数据添加', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'req_params': [{'_id': '680dd4ff335acf81b3926ce8', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd4ff335acfc5c7926ceb', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd4ff335acff16f926cea', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd4ff335acf1a5c926ce9', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"交换模型版本号"},"data":{"type":"array","items":{"type":"object","properties":{"bsflag":{"type":"number","title":"必填字段删除标记"},"wellCommonName":{"type":"string"},"wellId":{"type":"string"},"dataRegion":{"type":"string"}},"required":["bsflag","wellCommonName","wellId","dataRegion"]},"title":"交换模型数据集"}}}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736907, 'up_time': 1745736959, '__v': 0}, 'title': '地质单元数据添加', 'desc': '', '_id': 135748, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd4ff335acf81b3926ce8', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_query': [], 'req_headers': [{'required': '1', '_id': '680dd4ff335acfc5c7926ceb', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd4ff335acff16f926cea', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd4ff335acf1a5c926ce9', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"交换模型版本号"},"data":{"type":"array","items":{"type":"object","properties":{"bsflag":{"type":"number","title":"必填字段删除标记"},"wellCommonName":{"type":"string"},"wellId":{"type":"string"},"dataRegion":{"type":"string"}},"required":["bsflag","wellCommonName","wellId","dataRegion"]},"title":"交换模型数据集"}}}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'status': 'done', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'version': {'type': 'string', 'title': '交换模型版本号'}, 'data': {'type': 'array', 'items': {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, 'title': '交换模型数据集'}}}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'boolean'}}}} +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据添加': Action match with '['update', 'edit', 'put', '修改', '更新']'? False +2025-06-05 18:28:03,287 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据添加': Method match with 'PUT'? False (Endpoint method: POST) +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元数据添加': Checking req_params for path ID: [{'_id': '680dd4ff335acf81b3926ce8', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}] +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据添加': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据添加': Calculated path_condition_met=False (required=True, forbidden=False) +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元数据添加' (Action: False, Method: False, PathCond: False). Continuing search. +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元查询详情', Method='GET', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}', Type='YAPIEndpoint' +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元查询详情': {'method': 'GET', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}', 'params': []}, 'edit_uid': 0, 'status': 'done', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135752, 'method': 'GET', 'title': '地质单元查询详情', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}', 'req_params': [{'_id': '680dd53d335acf42db926d05', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd53d335acf2105926d04', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}, {'_id': '680dd53d335acf7970926d03', 'name': 'id', 'desc': ''}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd53d335acf68e4926d08', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd53d335acf9fb4926d07', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd53d335acf7a8d926d06', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736911, 'up_time': 1745737021, '__v': 0}, 'title': '地质单元查询详情', 'desc': '', '_id': 135752, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd53d335acf42db926d05', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd53d335acf2105926d04', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}, {'_id': '680dd53d335acf7970926d03', 'name': 'id', 'desc': ''}], 'req_query': [], 'req_headers': [{'required': '1', '_id': '680dd53d335acf68e4926d08', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd53d335acf9fb4926d07', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd53d335acf7a8d926d06', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'status': 'done', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'properties': {'isSearchCount': {'default': True, 'description': '是否统计总条数', 'type': 'boolean'}, 'query': {'description': '查询条件', 'properties': {'dataRegions': {'description': '数据域,如:JD、DG、TL', 'items': {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, 'type': 'array'}, 'fields': {'description': '查询的字段', 'items': {'description': '查询的字段', 'type': 'string'}, 'type': 'array'}, 'filter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'groupFields': {'description': '分组字段group by', 'items': {'description': '分组字段group by', 'type': 'string'}, 'type': 'array'}, 'groupFilter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'sort': {'additionalProperties': {'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'string'}, 'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'object', 'properties': {}}}, 'type': 'object', '$$ref': '#/components/schemas/QueryVO'}}, 'type': 'object', '$$ref': '#/components/schemas/RdbQueryPageInput'}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'object', 'properties': {'total': {'type': 'number'}, 'list': {'type': 'array', 'items': {'type': 'object', 'properties': {'dsid': {'type': 'string'}, 'dataRegion': {'type': 'string'}, 'gasReleaseMon': {'type': 'null'}, 'gasReleaseYear': {'type': 'null'}, 'releaseGasCum': {'type': 'null'}}}}}}}}} +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元查询详情': Action match with '['update', 'edit', 'put', '修改', '更新']'? False +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元查询详情': Method match with 'PUT'? False (Endpoint method: GET) +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元查询详情': Checking req_params for path ID: [{'_id': '680dd53d335acf42db926d05', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd53d335acf2105926d04', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}, {'_id': '680dd53d335acf7970926d03', 'name': 'id', 'desc': ''}] +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Found ID path parameter in YAPI req_params: 'id' +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元查询详情': Calculated path_contains_id_param=True (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元查询详情': Calculated path_condition_met=True (required=True, forbidden=False) +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元查询详情' (Action: False, Method: False, PathCond: True). Continuing search. +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - WARNING - FAILURE: No operation found after checking all endpoints for: actions='['update', 'edit', 'put', '修改', '更新']', method='PUT', path_id_required=True, path_id_forbidden=False +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Attempting to find operation: target_actions='['delete', 'remove', '删除']', target_method='DELETE', path_id_required=False, path_id_forbidden=False +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元列表查询', Method='POST', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', Type='YAPIEndpoint' +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元列表查询': {'method': 'POST', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135751, 'method': 'POST', 'title': '地质单元列表查询', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}', 'req_params': [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd55a335acfb51b926d1d', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd55a335acf6226926d1c', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd55a335acf39a0926d1b', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [{'required': '0', '_id': '680dd55a335acfabfa926d1a', 'name': 'pageNo', 'desc': '页码(从1开始)'}, {'required': '0', '_id': '680dd55a335acf831b926d19', 'name': 'pageSize', 'desc': '分页大小(最大值200)'}], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736910, 'up_time': 1745737050, '__v': 0}, 'title': '地质单元列表查询', 'desc': '', '_id': 135751, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}], 'req_query': [{'required': '0', '_id': '680dd55a335acfabfa926d1a', 'name': 'pageNo', 'desc': '页码(从1开始)'}, {'required': '0', '_id': '680dd55a335acf831b926d19', 'name': 'pageSize', 'desc': '分页大小(最大值200)'}], 'req_headers': [{'required': '1', '_id': '680dd55a335acfb51b926d1d', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd55a335acf6226926d1c', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd55a335acf39a0926d1b', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"properties":{"isSearchCount":{"default":true,"description":"是否统计总条数","type":"boolean"},"query":{"description":"查询条件","properties":{"dataRegions":{"description":"数据域,如:JD、DG、TL","items":{"description":"数据域,如:JD、DG、TL","type":"string"},"type":"array"},"fields":{"description":"查询的字段","items":{"description":"查询的字段","type":"string"},"type":"array"},"filter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"groupFields":{"description":"分组字段group by","items":{"description":"分组字段group by","type":"string"},"type":"array"},"groupFilter":{"description":"筛选器","properties":{"key":{"description":"条件项","type":"string"},"logic":{"description":"逻辑操作符,可选值为:AND、OR","type":"string"},"realValue":{"description":"条件值","items":{"description":"条件值","type":"object","properties":{}},"type":"array"},"singleValue":{"type":"object","writeOnly":true,"properties":{}},"subFilter":{"description":"子条件","items":{"$ref":"#/components/schemas/FilterVO","type":"string"},"type":"array"},"symbol":{"description":"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL","type":"string"}},"type":"object","$$ref":"#/components/schemas/FilterVO"},"sort":{"additionalProperties":{"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"string"},"description":"排序字段,key=字段名,value=排序方式(ASC、DESC)","type":"object","properties":{}}},"type":"object","$$ref":"#/components/schemas/QueryVO"}},"type":"object","$$ref":"#/components/schemas/RdbQueryPageInput"}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"total":{"type":"number"},"list":{"type":"array","items":{"type":"object","properties":{"dsid":{"type":"string"},"dataRegion":{"type":"string"},"gasReleaseMon":{"type":"null"},"gasReleaseYear":{"type":"null"},"releaseGasCum":{"type":"null"}}}}}}}}', 'status': 'undone', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'properties': {'isSearchCount': {'default': True, 'description': '是否统计总条数', 'type': 'boolean'}, 'query': {'description': '查询条件', 'properties': {'dataRegions': {'description': '数据域,如:JD、DG、TL', 'items': {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, 'type': 'array'}, 'fields': {'description': '查询的字段', 'items': {'description': '查询的字段', 'type': 'string'}, 'type': 'array'}, 'filter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'groupFields': {'description': '分组字段group by', 'items': {'description': '分组字段group by', 'type': 'string'}, 'type': 'array'}, 'groupFilter': {'description': '筛选器', 'properties': {'key': {'description': '条件项', 'type': 'string'}, 'logic': {'description': '逻辑操作符,可选值为:AND、OR', 'type': 'string'}, 'realValue': {'description': '条件值', 'items': {'description': '条件值', 'type': 'object', 'properties': {}}, 'type': 'array'}, 'singleValue': {'type': 'object', 'writeOnly': True, 'properties': {}}, 'subFilter': {'description': '子条件', 'items': {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, 'type': 'array'}, 'symbol': {'description': '运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL', 'type': 'string'}}, 'type': 'object', '$$ref': '#/components/schemas/FilterVO'}, 'sort': {'additionalProperties': {'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'string'}, 'description': '排序字段,key=字段名,value=排序方式(ASC、DESC)', 'type': 'object', 'properties': {}}}, 'type': 'object', '$$ref': '#/components/schemas/QueryVO'}}, 'type': 'object', '$$ref': '#/components/schemas/RdbQueryPageInput'}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'object', 'properties': {'total': {'type': 'number'}, 'list': {'type': 'array', 'items': {'type': 'object', 'properties': {'dsid': {'type': 'string'}, 'dataRegion': {'type': 'string'}, 'gasReleaseMon': {'type': 'null'}, 'gasReleaseYear': {'type': 'null'}, 'releaseGasCum': {'type': 'null'}}}}}}}}} +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Action match with '['delete', 'remove', '删除']'? False +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Method match with 'DELETE'? False (Endpoint method: POST) +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元列表查询': Checking req_params for path ID: [{'_id': '680dd55a335acff12e926d18', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}, {'_id': '680dd55a335acfc43d926d17', 'name': 'version', 'example': '1.0.0', 'desc': '交换模型版本'}] +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元列表查询': Calculated path_condition_met=True (required=False, forbidden=False) +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元列表查询' (Action: False, Method: False, PathCond: True). Continuing search. +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元数据修改', Method='PUT', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit', Type='YAPIEndpoint' +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元数据修改': {'method': 'PUT', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135749, 'method': 'PUT', 'title': '地质单元数据修改', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'req_params': [{'_id': '680dd510335acf19c3926cec', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd510335acf7bb3926cf0', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd510335acf6953926cef', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd510335acfd86b926cee', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [{'required': '1', '_id': '680dd510335acf1ed1926ced', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"id":{"type":"string","required":true},"version":{"type":"string"}},"required":["id","version"]}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736907, 'up_time': 1745736976, '__v': 0}, 'title': '地质单元数据修改', 'desc': '', '_id': 135749, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd510335acf19c3926cec', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_query': [{'required': '1', '_id': '680dd510335acf1ed1926ced', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_headers': [{'required': '1', '_id': '680dd510335acf7bb3926cf0', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd510335acf6953926cef', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd510335acfd86b926cee', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"id":{"type":"string","required":true},"version":{"type":"string"}},"required":["id","version"]}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'status': 'undone', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'id': {'type': 'string', 'required': True}, 'version': {'type': 'string'}}, 'required': ['id', 'version']}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'boolean'}}}} +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Action match with '['delete', 'remove', '删除']'? False +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Method match with 'DELETE'? False (Endpoint method: PUT) +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元数据修改': Checking req_params for path ID: [{'_id': '680dd510335acf19c3926cec', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}] +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据修改': Calculated path_condition_met=True (required=False, forbidden=False) +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Criteria NOT met for '地质单元数据修改' (Action: False, Method: False, PathCond: True). Continuing search. +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Checking endpoint: Title='地质单元数据删除', Method='DELETE', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit', Type='YAPIEndpoint' +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Raw YAPIEndpoint object attributes for '地质单元数据删除': {'method': 'DELETE', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', '_raw_data': {'query_path': {'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'params': []}, 'edit_uid': 0, 'status': 'undone', 'type': 'var', 'req_body_is_json_schema': True, 'res_body_is_json_schema': True, 'api_opened': False, 'index': 0, 'tag': [], '_id': 135750, 'method': 'DELETE', 'title': '地质单元数据删除', 'desc': '', 'path': '/api/dms/{dms_instance_code}/v1/cd_geo_unit', 'req_params': [{'_id': '680dd51b335acfe93a926cf1', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_body_form': [], 'req_headers': [{'required': '1', '_id': '680dd51b335acfb316926cf5', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd51b335acf45f4926cf4', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd51b335acf0cfa926cf3', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_query': [{'required': '1', '_id': '680dd51b335acf7441926cf2', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_body_type': 'json', 'res_body_type': 'json', 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"版本号"},"data":{"type":"array","items":{"type":"string"},"title":"主键id数据集"}}}', 'project_id': 1193, 'catid': 18705, 'markdown': '', 'uid': 1103, 'add_time': 1745736908, 'up_time': 1745736987, '__v': 0}, 'title': '地质单元数据删除', 'desc': '', '_id': 135750, 'project_id': 1193, 'catid': 18705, 'req_params': [{'_id': '680dd51b335acfe93a926cf1', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}], 'req_query': [{'required': '1', '_id': '680dd51b335acf7441926cf2', 'name': 'id', 'example': 'dsid', 'desc': '主键id的key'}], 'req_headers': [{'required': '1', '_id': '680dd51b335acfb316926cf5', 'name': 'Content-Type', 'value': 'application/json'}, {'required': '1', '_id': '680dd51b335acf45f4926cf4', 'name': 'tenant-id', 'desc': 'tenant-id (Only:undefined)'}, {'required': '1', '_id': '680dd51b335acf0cfa926cf3', 'name': 'Authorization', 'desc': 'Authorization (Only:undefined)'}], 'req_body_form': [], 'req_body_type': 'json', 'req_body_is_json_schema': True, 'req_body_other': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"version":{"type":"string","title":"版本号"},"data":{"type":"array","items":{"type":"string"},"title":"主键id数据集"}}}', 'res_body_type': 'json', 'res_body_is_json_schema': True, 'res_body': '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"},"data":{"type":"boolean"}}}', 'status': 'undone', 'api_opened': False, 'uid': 1103, 'category_name': '地质单元', 'category_id': 18705, '_parsed_req_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'version': {'type': 'string', 'title': '版本号'}, 'data': {'type': 'array', 'items': {'type': 'string'}, 'title': '主键id数据集'}}}, '_parsed_res_body_schema': {'$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'code': {'type': 'number'}, 'message': {'type': 'string'}, 'data': {'type': 'boolean'}}}} +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Action match with '['delete', 'remove', '删除']'? True +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Method match with 'DELETE'? True (Endpoint method: DELETE) +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For YAPI Endpoint '地质单元数据删除': Checking req_params for path ID: [{'_id': '680dd51b335acfe93a926cf1', 'name': 'dms_instance_code', 'desc': '注册实例code\n井筒中心 well_kd_wellbore_ideas01'}] +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Calculated path_contains_id_param=False (cfg_path_param_name_for_id='id') +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - For '地质单元数据删除': Calculated path_condition_met=True (required=False, forbidden=False) +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - SUCCESS: Op match for actions '['delete', 'remove', '删除']': Key='地质单元数据删除', MatchedText='地质单元数据删除', Method='DELETE', Path='/api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - 'Generic CRUD Validation Stage' is APPLICABLE for group '地质单元'. Required CRUD operations found. Discovered keys: {'create': '地质单元数据添加', 'list': '地质单元列表查询', 'detail': '地质单元查询详情', 'update': None, 'delete': '地质单元数据删除'} +2025-06-05 18:28:03,288 - ddms_compliance_suite.test_orchestrator - INFO - 测试阶段 'generic_crud_validation_stage' 适用于API分组 '地质单元'。开始执行... +2025-06-05 18:28:03,288 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试阶段: ID='generic_crud_validation_stage', Name='Generic CRUD Validation Stage', API分组='地质单元' +2025-06-05 18:28:03,288 - ddms_compliance_suite.test_orchestrator - DEBUG - 调用 stage 'generic_crud_validation_stage' 的 before_stage 钩子。初始上下文: {} +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - Using default field/path configurations for group '地质单元'. Customize by overriding _determine_resource_config or cfg_* attributes. +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - Starting stage 'Generic CRUD Validation Stage' for API group '地质单元'. Discovered op keys: {'create': '地质单元数据添加', 'list': '地质单元列表查询', 'detail': '地质单元查询详情', 'update': None, 'delete': '地质单元数据删除'} +2025-06-05 18:28:03,288 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - Initial stage context (with cfg): {'unique_resource_name': 'TestResource_1749119283_3c0f3c', 'updated_resource_name': 'TestResource_1749119283_3c0f3c_UPDATED', 'unique_feature_value': 'Feature_1749119283', 'updated_feature_value': 'Feature_1749119283_UPDATED', 'cfg_list_path_in_listresponse': 'data.list', 'cfg_name_field_in_listitem': 'wellCommonName', 'cfg_id_field_in_listitem': 'dsid', 'cfg_resource_object_path_in_detailresponse': 'data.list.0', 'cfg_name_field_in_detailresponse': 'wellCommonName', 'cfg_id_field_in_detailresponse': 'dsid', 'cfg_resource_object_path_in_updateresponse': 'data.list.0', 'cfg_feature_field_name_for_validation': 'dataRegion', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} +2025-06-05 18:28:03,288 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'generic_crud_validation_stage', Step 'Create New Resource': 开始执行. +2025-06-05 18:28:03,288 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'generic_crud_validation_stage', Step 'Create New Resource': 调用 before_step 钩子. 上下文: {'unique_resource_name': 'TestResource_1749119283_3c0f3c', 'updated_resource_name': 'TestResource_1749119283_3c0f3c_UPDATED', 'unique_feature_value': 'Feature_1749119283', 'updated_feature_value': 'Feature_1749119283_UPDATED', 'cfg_list_path_in_listresponse': 'data.list', 'cfg_name_field_in_listitem': 'wellCommonName', 'cfg_id_field_in_listitem': 'dsid', 'cfg_resource_object_path_in_detailresponse': 'data.list.0', 'cfg_name_field_in_detailresponse': 'wellCommonName', 'cfg_id_field_in_detailresponse': 'dsid', 'cfg_resource_object_path_in_updateresponse': 'data.list.0', 'cfg_feature_field_name_for_validation': 'dataRegion', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} +2025-06-05 18:28:03,289 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Executing before_step for step 'Create New Resource' in stage 'generic_crud_validation_stage' +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'generic_crud_validation_stage', Step 'Create New Resource': 查找端点定义. Key='地质单元数据添加', Group='地质单元' +2025-06-05 18:28:03,289 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - 'generic_crud_validation_stage': 正在从 global_api_spec 中查找操作,键: '地质单元数据添加', API组: '地质单元' +2025-06-05 18:28:03,289 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - 'generic_crud_validation_stage': 找到匹配操作 '地质单元数据添加' -> Method: POST, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'generic_crud_validation_stage', Step 'Create New Resource': 已解析端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'. 准备请求数据. +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'generic_crud_validation_stage', Step 'Create New Resource': 应用请求覆盖: {'path_params': {'dms_instance_code': '{{stage_context.dms_instance_code}}'}, 'headers': {'tenant-id': 'your-tenant-id', 'Authorization': 'Bearer your-test-token'}, 'body': {'version': '{{stage_context.api_version}}', 'data': [{'wellCommonName': '{{stage_context.unique_resource_name}}', 'dataRegion': '{{stage_context.unique_feature_value}}'}]}} +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Create New Resource'] 解析上下文路径: 'dms_instance_code' 来自模板 '{{stage_context.dms_instance_code}}' +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Create New Resource'] 从上下文解析到值 'your_dms_instance_code...' (路径: 'dms_instance_code') +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Create New Resource'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Create New Resource'] 从上下文解析到值 '1.0.0...' (路径: 'api_version') +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Create New Resource'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Create New Resource'] 从上下文解析到值 'TestResource_1749119283_3c0f3c...' (路径: 'unique_resource_name') +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Create New Resource'] 解析上下文路径: 'unique_feature_value' 来自模板 '{{stage_context.unique_feature_value}}' +2025-06-05 18:28:03,289 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Create New Resource'] 从上下文解析到值 'Feature_1749119283...' (路径: 'unique_feature_value') +2025-06-05 18:28:03,290 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'generic_crud_validation_stage', Step 'Create New Resource': 发送API请求: POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'generic_crud_validation_stage', Step 'Create New Resource': 收到响应. Status: 200. 验证中... +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'generic_crud_validation_stage', Step 'Create New Resource': 提取输出到上下文. Map: {'created_resource_id': 'data.0.dsid'} +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [Create New Resource] 尝试提取 'data.0.dsid' 到上下文变量 'created_resource_id' +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - WARNING - [Create New Resource] 未知的提取源类型 'data' in path 'data.0.dsid' +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'generic_crud_validation_stage', Step 'Create New Resource': 调用 after_step 钩子. +2025-06-05 18:28:03,303 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Executing after_step for step 'Create New Resource' in stage 'generic_crud_validation_stage' +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'generic_crud_validation_stage', Step 'Create New Resource': 执行完毕. 状态: 通过, 耗时: 0.01s +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'generic_crud_validation_stage', Step 'List and Find Created Resource': 开始执行. +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'generic_crud_validation_stage', Step 'List and Find Created Resource': 调用 before_step 钩子. 上下文: {'unique_resource_name': 'TestResource_1749119283_3c0f3c', 'updated_resource_name': 'TestResource_1749119283_3c0f3c_UPDATED', 'unique_feature_value': 'Feature_1749119283', 'updated_feature_value': 'Feature_1749119283_UPDATED', 'cfg_list_path_in_listresponse': 'data.list', 'cfg_name_field_in_listitem': 'wellCommonName', 'cfg_id_field_in_listitem': 'dsid', 'cfg_resource_object_path_in_detailresponse': 'data.list.0', 'cfg_name_field_in_detailresponse': 'wellCommonName', 'cfg_id_field_in_detailresponse': 'dsid', 'cfg_resource_object_path_in_updateresponse': 'data.list.0', 'cfg_feature_field_name_for_validation': 'dataRegion', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} +2025-06-05 18:28:03,303 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Executing before_step for step 'List and Find Created Resource' in stage 'generic_crud_validation_stage' +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'generic_crud_validation_stage', Step 'List and Find Created Resource': 查找端点定义. Key='地质单元列表查询', Group='地质单元' +2025-06-05 18:28:03,303 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - 'generic_crud_validation_stage': 正在从 global_api_spec 中查找操作,键: '地质单元列表查询', API组: '地质单元' +2025-06-05 18:28:03,303 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - 'generic_crud_validation_stage': 找到匹配操作 '地质单元列表查询' -> Method: POST, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'generic_crud_validation_stage', Step 'List and Find Created Resource': 已解析端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'. 准备请求数据. +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, minItems: 1 +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'generic_crud_validation_stage', Step 'List and Find Created Resource': 应用请求覆盖: {'path_params': {'dms_instance_code': '{{stage_context.dms_instance_code}}', 'version': '{{stage_context.api_version}}'}, 'headers': {'tenant-id': 'your-tenant-id', 'Authorization': 'Bearer your-test-token'}, 'query_params': {'pageNo': 1, 'pageSize': 10}, 'body': {'isSearchCount': True, 'query': {'fields': ['dsid', 'wellCommonName', 'dataRegion'], 'filter': {'key': 'wellCommonName', 'symbol': '=', 'realValue': ['{{stage_context.unique_resource_name}}']}}}} +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created Resource'] 解析上下文路径: 'dms_instance_code' 来自模板 '{{stage_context.dms_instance_code}}' +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created Resource'] 从上下文解析到值 'your_dms_instance_code...' (路径: 'dms_instance_code') +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created Resource'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created Resource'] 从上下文解析到值 '1.0.0...' (路径: 'api_version') +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created Resource'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created Resource'] 从上下文解析到值 'TestResource_1749119283_3c0f3c...' (路径: 'unique_resource_name') +2025-06-05 18:28:03,303 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'generic_crud_validation_stage', Step 'List and Find Created Resource': 发送API请求: POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0 DEBUG: curlify generated command (repr): 'curl -X GET -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 477\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id' DEBUG: curlify generated command (raw): curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 488' -d '{"isSearchCount": "not-a-boolean", "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id DEBUG: curlify generated command (repr): 'curl -X GET -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 488\' -d \'{"isSearchCount": "not-a-boolean", "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id' @@ -2430,233 +2626,56 @@ DEBUG: curlify generated command (raw): curl -X GET -H 'User-Agent: python-reque DEBUG: curlify generated command (repr): 'curl -X GET -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 477\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id' DEBUG: curlify generated command (raw): curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id DEBUG: curlify generated command (repr): 'curl -X GET -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: header_val_tenant-id\' -H \'Content-Type: application/json\' -H \'Content-Length: 477\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id' -DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: your-tenant-id' -H 'Content-Type: application/json' -H 'Authorization: Bearer your-test-token' -H 'Content-Length: 181' -d '{"version": "1.0.0", "data": [{"bsflag": 0, "wellCommonName": "Test_\u5730\u8d28\u5355\u5143_1749108550_93ddd2", "wellId": "ExampleWellID_1749108550", "dataRegion": "TEST_REGION"}]}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit -DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: your-tenant-id\' -H \'Content-Type: application/json\' -H \'Authorization: Bearer your-test-token\' -H \'Content-Length: 181\' -d \'{"version": "1.0.0", "data": [{"bsflag": 0, "wellCommonName": "Test_\\u5730\\u8d28\\u5355\\u5143_1749108550_93ddd2", "wellId": "ExampleWellID_1749108550", "dataRegion": "TEST_REGION"}]}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit' -2025-06-05 15:29:10,170 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Validating response. Status: 200 -2025-06-05 15:29:10,170 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Running assertion 'find_and_extract_id_by_name' -2025-06-05 15:29:10,170 - ddms_compliance_suite.test_orchestrator - WARNING - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Assertion 'find_and_extract_id_by_name' failed: 在列表响应中未找到名称为 'Test_地质单元_1749108550_93ddd2' (字段: wellCommonName) 的资源。 -2025-06-05 15:29:10,170 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Extracting outputs. Map: {'created_resource_id': 'body.data.list[0].dsid'} -2025-06-05 15:29:10,170 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元''] 尝试提取 'body.data.list[0].dsid' 到上下文变量 'created_resource_id' -2025-06-05 15:29:10,170 - ddms_compliance_suite.test_orchestrator - WARNING - [阶段步骤 'Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元''] 未能从路径 'body.data.list[0].dsid' 提取到值。 -2025-06-05 15:29:10,170 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling after_step for stage 'keyword_driven_crud_example', step 'List and Find Created 地质单元'. -2025-06-05 15:29:10,170 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Executing after_step for step 'List and Find Created 地质单元' in stage 'keyword_driven_crud_example' -2025-06-05 15:29:10,170 - ddms_compliance_suite.test_orchestrator - WARNING - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元' status 失败, continue_on_failure=False. Aborting stage. -2025-06-05 15:29:10,170 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling after_stage for stage 'keyword_driven_crud_example'. -2025-06-05 15:29:10,170 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 结束阶段 'Keyword-Driven Generic CRUD Stage Example' (资源关键字: '地质单元'). API分组: '公共分类'. 最终状态: Status.FAILED. 最终上下文: {'unique_resource_name': 'Test_地质单元_1749108550_93ddd2', 'updated_resource_name': 'Test_地质单元_1749108550_93ddd2_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} -2025-06-05 15:29:10,170 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example' execution finished. API Group: '公共分类', Final Status: 失败, Duration: 0.03s -2025-06-05 15:29:10,170 - ddms_compliance_suite.test_orchestrator - WARNING - API group '地质单元' provided, but cannot determine group details or filter APIs for spec type . -2025-06-05 15:29:10,170 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - 'keyword_driven_crud_example': Starting API endpoint matching within group '地质单元'. Found 6 APIs in group. -2025-06-05 15:29:10,170 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': Matched API (Method: POST, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}, Title: '地质单元列表查询') to operation type 'list_query' based on keyword '列表'. -2025-06-05 15:29:10,170 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': Matched API (Method: PUT, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit, Title: '地质单元数据修改') to operation type 'update' based on keyword '修改'. -2025-06-05 15:29:10,170 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': Matched API (Method: DELETE, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit, Title: '地质单元数据删除') to operation type 'delete' based on keyword '删除'. -2025-06-05 15:29:10,170 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': Matched API (Method: POST, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit, Title: '地质单元数据添加') to operation type 'add' based on keyword '添加'. -2025-06-05 15:29:10,170 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': Matched API (Method: GET, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}, Title: '地质单元查询详情') to operation type 'detail_query' based on keyword '详情'. -2025-06-05 15:29:10,170 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - 'keyword_driven_crud_example': Finished API endpoint matching. Matched operations: ['list_query', 'update', 'delete', 'add', 'detail_query'] -2025-06-05 15:29:10,170 - ddms_compliance_suite.test_orchestrator - DEBUG - Checking applicability of stage 'keyword_driven_crud_example' for API group '地质单元'... -2025-06-05 15:29:10,170 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Checking applicability of 'Keyword-Driven Generic CRUD Stage Example' (RESOURCE_KEYWORD: '地质单元') for API group '地质单元'. -2025-06-05 15:29:10,170 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['添加', '新建', '创建']', method='POST' -2025-06-05 15:29:10,170 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元数据添加', MatchedText='地质单元数据添加' (for resource='地质单元', action='['添加', '新建', '创建']', method='POST') -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['列表查询', '查询列表', '获取列表', '分页查询']', method='POST' -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元列表查询', MatchedText='地质单元列表查询' (for resource='地质单元', action='['列表查询', '查询列表', '获取列表', '分页查询']', method='POST') -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['查询详情', '获取详情', '根据ID获取']', method='GET' -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元查询详情', MatchedText='地质单元查询详情' (for resource='地质单元', action='['查询详情', '获取详情', '根据ID获取']', method='GET') -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['修改', '更新']', method='PUT' -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元数据修改', MatchedText='地质单元数据修改' (for resource='地质单元', action='['修改', '更新']', method='PUT') -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['删除']', method='DELETE' -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元数据删除', MatchedText='地质单元数据删除' (for resource='地质单元', action='['删除']', method='DELETE') -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'Keyword-Driven Generic CRUD Stage Example' is APPLICABLE for group '地质单元'. All CRUD operations found for '地质单元'. Discovered keys: {'create': '地质单元数据添加', 'list': '地质单元列表查询', 'detail': '地质单元查询详情', 'update': '地质单元数据修改', 'delete': '地质单元数据删除'} -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - INFO - Test Stage 'keyword_driven_crud_example' is APPLICABLE to API group '地质单元'. Executing... -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling before_stage for stage 'keyword_driven_crud_example'. Context: {} -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Starting stage 'Keyword-Driven Generic CRUD Stage Example' for API group '地质单元'. Discovered op keys: {'create': '地质单元数据添加', 'list': '地质单元列表查询', 'detail': '地质单元查询详情', 'update': '地质单元数据修改', 'delete': '地质单元数据删除'} -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Initial stage context: {'unique_resource_name': 'Test_地质单元_1749108550_4a265e', 'updated_resource_name': 'Test_地质单元_1749108550_4a265e_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling before_step for stage 'keyword_driven_crud_example', step 'Add New 地质单元'. Context: {'unique_resource_name': 'Test_地质单元_1749108550_4a265e', 'updated_resource_name': 'Test_地质单元_1749108550_4a265e_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Executing before_step for step 'Add New 地质单元' in stage 'keyword_driven_crud_example' -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Looking up endpoint key='地质单元数据添加', group='地质单元' -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': 正在从 global_api_spec 中查找操作,键: '地质单元数据添加', API组: '地质单元' -2025-06-05 15:29:10,171 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': 找到匹配操作 '地质单元数据添加' -> Method: POST, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Preparing request data for resolved endpoint: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'dms_instance_code': 'example_dms_instance_code'} -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748': application/json -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body). Properties: ['version', 'data'] -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.version): example_string -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data). Items schema: {'type': 'object', 'properties': {'bsflag': {'type': 'number', 'title': '必填字段删除标记'}, 'wellCommonName': {'type': 'string'}, 'wellId': {'type': 'string'}, 'dataRegion': {'type': 'string'}}, 'required': ['bsflag', 'wellCommonName', 'wellId', 'dataRegion']}, minItems: 1 -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0]). Properties: ['bsflag', 'wellCommonName', 'wellId', 'dataRegion'] -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 number/integer 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].bsflag): 0.0 -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellCommonName): example_string -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].wellId): example_string -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_135748] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_135748_body.data[0].dataRegion): example_string -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' (type: ) -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 '1.0.0' (路径: 'api_version') -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 'Test_地质单元_1749108550_4a265e' (路径: 'unique_resource_name') -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'dms_instance_code' 来自模板 '{{stage_context.dms_instance_code}}' -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 'your_dms_instance_code' (路径: 'dms_instance_code') -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 '1.0.0' (路径: 'api_version') -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 'Test_地质单元_1749108550_4a265e' (路径: 'unique_resource_name') -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Constructed full_request_url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:10,171 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Executing API call POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Validating response. Status: 200 -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Extracting outputs. Map: {} -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling after_step for stage 'keyword_driven_crud_example', step 'Add New 地质单元'. -2025-06-05 15:29:10,188 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Executing after_step for step 'Add New 地质单元' in stage 'keyword_driven_crud_example' -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling before_step for stage 'keyword_driven_crud_example', step 'List and Find Created 地质单元'. Context: {'unique_resource_name': 'Test_地质单元_1749108550_4a265e', 'updated_resource_name': 'Test_地质单元_1749108550_4a265e_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} -2025-06-05 15:29:10,188 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Executing before_step for step 'List and Find Created 地质单元' in stage 'keyword_driven_crud_example' -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Looking up endpoint key='地质单元列表查询', group='地质单元' -2025-06-05 15:29:10,188 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': 正在从 global_api_spec 中查找操作,键: '地质单元列表查询', API组: '地质单元' -2025-06-05 15:29:10,188 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': 找到匹配操作 '地质单元列表查询' -> Method: POST, Path: /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Preparing request data for resolved endpoint: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial path param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial query param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'pageNo': 'query_val_pageNo', 'pageSize': 'query_val_pageSize'} -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial custom header param for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': {'tenant-id': 'header_val_tenant-id'} -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Content-Type for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial Accept header for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751': application/json -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body). Properties: ['isSearchCount', 'query'] -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 使用 schema 中的 'default' 值 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.isSearchCount): True -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query). Properties: ['dataRegions', 'fields', 'filter', 'groupFields', 'groupFilter', 'sort'] -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions). Items schema: {'description': '数据域,如:JD、DG、TL', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.dataRegions[0]): example_string -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields). Items schema: {'description': '查询的字段', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.fields[0]): example_string -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.key): example_string -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.logic): example_string -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.realValue[0]). Properties: [] -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.singleValue). Properties: [] -2025-06-05 15:29:10,188 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter). Items schema: {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.subFilter[0]): example_string -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.filter.symbol): example_string -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields). Items schema: {'description': '分组字段group by', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFields[0]): example_string -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter). Properties: ['key', 'logic', 'realValue', 'singleValue', 'subFilter', 'symbol'] -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.key): example_string -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.logic): example_string -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue). Items schema: {'description': '条件值', 'type': 'object', 'properties': {}}, minItems: 1 -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.realValue[0]). Properties: [] -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.singleValue). Properties: [] -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 array 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter). Items schema: {'$ref': '#/components/schemas/FilterVO', 'type': 'string'}, minItems: 1 -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.subFilter[0]): example_string -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 string 类型数据 ('') for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.groupFilter.symbol): example_string -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751] 生成 object 类型数据 for (context: post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751_body.query.sort). Properties: [] -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - Initial request body generated for 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' (type: ) -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 'Test_地质单元_1749108550_4a265e' (路径: 'unique_resource_name') -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'dms_instance_code' 来自模板 '{{stage_context.dms_instance_code}}' -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 'your_dms_instance_code' (路径: 'dms_instance_code') -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 '1.0.0' (路径: 'api_version') -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 'Test_地质单元_1749108550_4a265e' (路径: 'unique_resource_name') -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Constructed full_request_url: http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0 -2025-06-05 15:29:10,189 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Executing API call POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0 -2025-06-05 15:29:10,206 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Validating response. Status: 200 -2025-06-05 15:29:10,206 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Running assertion 'find_and_extract_id_by_name' -2025-06-05 15:29:10,206 - ddms_compliance_suite.test_orchestrator - WARNING - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Assertion 'find_and_extract_id_by_name' failed: 在列表响应中未找到名称为 'Test_地质单元_1749108550_4a265e' (字段: wellCommonName) 的资源。 -2025-06-05 15:29:10,206 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Extracting outputs. Map: {'created_resource_id': 'body.data.list[0].dsid'} -2025-06-05 15:29:10,206 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元''] 尝试提取 'body.data.list[0].dsid' 到上下文变量 'created_resource_id' -2025-06-05 15:29:10,206 - ddms_compliance_suite.test_orchestrator - WARNING - [阶段步骤 'Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元''] 未能从路径 'body.data.list[0].dsid' 提取到值。 -2025-06-05 15:29:10,206 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling after_step for stage 'keyword_driven_crud_example', step 'List and Find Created 地质单元'. -2025-06-05 15:29:10,206 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Executing after_step for step 'List and Find Created 地质单元' in stage 'keyword_driven_crud_example' -2025-06-05 15:29:10,206 - ddms_compliance_suite.test_orchestrator - WARNING - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元' status 失败, continue_on_failure=False. Aborting stage. -2025-06-05 15:29:10,206 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling after_stage for stage 'keyword_driven_crud_example'. -2025-06-05 15:29:10,206 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 结束阶段 'Keyword-Driven Generic CRUD Stage Example' (资源关键字: '地质单元'). API分组: '地质单元'. 最终状态: Status.FAILED. 最终上下文: {'unique_resource_name': 'Test_地质单元_1749108550_4a265e', 'updated_resource_name': 'Test_地质单元_1749108550_4a265e_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} -2025-06-05 15:29:10,206 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example' execution finished. API Group: '地质单元', Final Status: 失败, Duration: 0.04s -2025-06-05 15:29:10,206 - ddms_compliance_suite.test_orchestrator - INFO - API Test Stage execution processed. Considered 2 (stage_definition x api_group) combinations. -2025-06-05 15:29:10,206 - __main__ - INFO - API测试阶段 (Stages) 执行完毕。 -DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: your-tenant-id' -H 'Content-Type: application/json' -H 'Authorization: Bearer your-test-token' -H 'Content-Length: 190' -d '{"isSearchCount": true, "query": {"fields": ["dsid", "wellCommonName"], "filter": {"key": "wellCommonName", "symbol": "=", "realValue": ["Test_\u5730\u8d28\u5355\u5143_1749108550_93ddd2"]}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=1&pageSize=10' -DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: your-tenant-id\' -H \'Content-Type: application/json\' -H \'Authorization: Bearer your-test-token\' -H \'Content-Length: 190\' -d \'{"isSearchCount": true, "query": {"fields": ["dsid", "wellCommonName"], "filter": {"key": "wellCommonName", "symbol": "=", "realValue": ["Test_\\u5730\\u8d28\\u5355\\u5143_1749108550_93ddd2"]}}}\' --insecure \'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=1&pageSize=10\'' -DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: your-tenant-id' -H 'Content-Type: application/json' -H 'Authorization: Bearer your-test-token' -H 'Content-Length: 181' -d '{"version": "1.0.0", "data": [{"bsflag": 0, "wellCommonName": "Test_\u5730\u8d28\u5355\u5143_1749108550_4a265e", "wellId": "ExampleWellID_1749108550", "dataRegion": "TEST_REGION"}]}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit -DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: your-tenant-id\' -H \'Content-Type: application/json\' -H \'Authorization: Bearer your-test-token\' -H \'Content-Length: 181\' -d \'{"version": "1.0.0", "data": [{"bsflag": 0, "wellCommonName": "Test_\\u5730\\u8d28\\u5355\\u5143_1749108550_4a265e", "wellId": "ExampleWellID_1749108550", "dataRegion": "TEST_REGION"}]}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit' -DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: your-tenant-id' -H 'Content-Type: application/json' -H 'Authorization: Bearer your-test-token' -H 'Content-Length: 190' -d '{"isSearchCount": true, "query": {"fields": ["dsid", "wellCommonName"], "filter": {"key": "wellCommonName", "symbol": "=", "realValue": ["Test_\u5730\u8d28\u5355\u5143_1749108550_4a265e"]}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=1&pageSize=10' -DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: your-tenant-id\' -H \'Content-Type: application/json\' -H \'Authorization: Bearer your-test-token\' -H \'Content-Length: 190\' -d \'{"isSearchCount": true, "query": {"fields": ["dsid", "wellCommonName"], "filter": {"key": "wellCommonName", "symbol": "=", "realValue": ["Test_\\u5730\\u8d28\\u5355\\u5143_1749108550_4a265e"]}}}\' --insecure \'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=1&pageSize=10\'' - -===== 测试运行摘要 ===== -开始时间: 2025-06-05T15:29:09.342664 -结束时间: 2025-06-05T15:29:10.206388 -总耗时: 0.86 秒 - ---- 端点统计 --- -定义的端点总数: 6 -实际测试的端点数: 6 - 通过: 0 - 失败: 6 - 部分成功: 0 - 执行错误: 0 - 跳过执行: 0 - 端点通过率: 0.00% - ---- 测试用例统计 --- -适用的测试用例总数 (计划执行): 42 -实际执行的测试用例总数: 42 - 通过: 24 - 失败: 18 - 执行错误 (测试用例代码问题): 0 - 跳过 (在端点内被跳过): 0 - 测试用例通过率: 57.14% - ---- 失败的端点摘要 --- - 端点: POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version} (数据推送接口) - 状态: 失败 - - 测试用例失败: TC-SECURITY-001 (HTTPS Protocol Mandatory Verification) - - 验证点: API通过HTTP (http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version) 响应了成功的状态码 200,这违反了HTTPS强制策略。 - - 测试用例失败: TC-ERROR-4001-BODY (Error Code 4001 - Request Body Type Mismatch Validation) - - 验证点: 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '53'. - 端点: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} (地质单元列表查询) - 状态: 失败 - - 测试用例失败: TC-SECURITY-001 (HTTPS Protocol Mandatory Verification) - - 验证点: API通过HTTP (http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0) 响应了成功的状态码 200,这违反了HTTPS强制策略。 - - 测试用例失败: TC-ERROR-4001-QUERY (Error Code 4001 - Query Parameter Type Mismatch Validation) - - 验证点: 当查询参数 'pageNo' (路径: 'pageNo') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '70'. - - 测试用例失败: TC-ERROR-4001-BODY (Error Code 4001 - Request Body Type Mismatch Validation) - - 验证点: 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '71'. - 端点: PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据修改) - 状态: 失败 - - 测试用例失败: TC-SECURITY-001 (HTTPS Protocol Mandatory Verification) - - 验证点: API通过HTTP (http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit) 响应了成功的状态码 200,这违反了HTTPS强制策略。 - - 测试用例失败: TC-ERROR-4001-QUERY (Error Code 4001 - Query Parameter Type Mismatch Validation) - - 验证点: 当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '20'. - - 测试用例失败: TC-ERROR-4001-BODY (Error Code 4001 - Request Body Type Mismatch Validation) - - 验证点: 当请求体字段 'id' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '51'. - - 测试用例失败: TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) - - 验证点: 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '82'. - 端点: DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据删除) - 状态: 失败 - - 测试用例失败: TC-SECURITY-001 (HTTPS Protocol Mandatory Verification) -2025-06-05 15:29:10,208 - __main__ - INFO - 测试结果已保存为JSON: test_reports/summary.json -2025-06-05 15:29:10,208 - __main__ - INFO - API调用详情将以 Markdown 格式保存到目录 'test_reports' (使用默认文件名 'api_call_details.md') -2025-06-05 15:29:10,210 - __main__ - INFO - API调用详情已保存为 Markdown: test_reports/api_call_details.md -2025-06-05 15:29:10,210 - __main__ - INFO - 部分测试失败或出错,请检查报告。 - - 验证点: API通过HTTP (http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit) 响应了成功的状态码 200,这违反了HTTPS强制策略。 - - 测试用例失败: TC-ERROR-4001-QUERY (Error Code 4001 - Query Parameter Type Mismatch Validation) - - 验证点: 当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '78'. - - 测试用例失败: TC-ERROR-4001-BODY (Error Code 4001 - Request Body Type Mismatch Validation) - - 验证点: 当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '51'. - - 测试用例失败: TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) - - 验证点: 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '22'. - 端点: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据添加) - 状态: 失败 - - 测试用例失败: TC-SECURITY-001 (HTTPS Protocol Mandatory Verification) - - 验证点: API通过HTTP (http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit) 响应了成功的状态码 200,这违反了HTTPS强制策略。 - - 测试用例失败: TC-ERROR-4001-BODY (Error Code 4001 - Request Body Type Mismatch Validation) - - 验证点: 当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '56'. - - 测试用例失败: TC-ERROR-4003-BODY (Error Code 4003 - Missing Required Request Body Field Validation) - - 验证点: 当移除必填请求体字段 'data.0.bsflag' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '49'. - 端点: GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id} (地质单元查询详情) - 状态: 失败 - - 测试用例失败: TC-SECURITY-001 (HTTPS Protocol Mandatory Verification) - - 验证点: API通过HTTP (http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id) 响应了成功的状态码 200,这违反了HTTPS强制策略。 - - 测试用例失败: TC-ERROR-4001-BODY (Error Code 4001 - Request Body Type Mismatch Validation) - - 验证点: 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '6'. - ---- API测试阶段 (Stage) 统计 --- -定义的API阶段总数: 1 -实际执行的API阶段数: 2 - 通过: 0 - 失败: 2 - 跳过: 0 - 阶段通过率: 0.00% - ---- 失败的API阶段摘要 --- - 阶段: keyword_driven_crud_example (Keyword-Driven Generic CRUD Stage Example) - 应用于分组: '公共分类' - 状态: 失败 - - 步骤失败: List and Find Created 地质单元 - 消息: Assertion 'find_and_extract_id_by_name' failed: 在列表响应中未找到名称为 'Test_地质单元_1749108550_93ddd2' (字段: wellCommonName) 的资源。. - 阶段: keyword_driven_crud_example (Keyword-Driven Generic CRUD Stage Example) - 应用于分组: '地质单元' - 状态: 失败 - - 步骤失败: List and Find Created 地质单元 - 消息: Assertion 'find_and_extract_id_by_name' failed: 在列表响应中未找到名称为 'Test_地质单元_1749108550_4a265e' (字段: wellCommonName) 的资源。. +DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: your-tenant-id' -H 'Content-Type: application/json' -H 'Authorization: Bearer your-test-token' -H 'Content-Length: 120' -d '{"version": "1.0.0", "data": [{"wellCommonName": "TestResource_1749119283_3c0f3c", "dataRegion": "Feature_1749119283"}]}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit +DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: your-tenant-id\' -H \'Content-Type: application/json\' -H \'Authorization: Bearer your-test-token\' -H \'Content-Length: 120\' -d \'{"version": "1.0.0", "data": [{"wellCommonName": "TestResource_1749119283_3c0f3c", "dataRegion": "Feature_1749119283"}]}\' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit' +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'generic_crud_validation_stage', Step 'List and Find Created Resource': 收到响应. Status: 200. 验证中... +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'generic_crud_validation_stage', Step 'List and Find Created Resource': 执行断言 'find_resource_in_list_and_extract_id' +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - WARNING - Stage 'generic_crud_validation_stage', Step 'List and Find Created Resource': 断言 'find_resource_in_list_and_extract_id' 失败: Resource not found: Name 'TestResource_1749119283_3c0f3c' (field: wellCommonName) not found in list at path 'data.list'. +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'generic_crud_validation_stage', Step 'List and Find Created Resource': 提取输出到上下文. Map: {'found_id_from_list': 'data.list.0.dsid'} +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - DEBUG - [List and Find Created Resource] 尝试提取 'data.list.0.dsid' 到上下文变量 'found_id_from_list' +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - WARNING - [List and Find Created Resource] 未知的提取源类型 'data' in path 'data.list.0.dsid' +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'generic_crud_validation_stage', Step 'List and Find Created Resource': 调用 after_step 钩子. +2025-06-05 18:28:03,317 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - DEBUG - Executing after_step for step 'List and Find Created Resource' in stage 'generic_crud_validation_stage' +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'generic_crud_validation_stage', Step 'List and Find Created Resource': 执行完毕. 状态: 失败, 耗时: 0.01s +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - WARNING - Stage 'generic_crud_validation_stage', Step 'List and Find Created Resource': 状态为 失败 且 continue_on_failure=False. 中止测试阶段 'generic_crud_validation_stage'. +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - DEBUG - 调用 stage 'generic_crud_validation_stage' 的 after_stage 钩子. 当前阶段结果状态: 失败 +2025-06-05 18:28:03,317 - ddms_compliance_suite.stage_framework.GenericCRUDValidationStage - INFO - Finished stage 'Generic CRUD Validation Stage'. API Group: '地质单元'. Final Status: Status.FAILED. Final Context Keys: ['unique_resource_name', 'updated_resource_name', 'unique_feature_value', 'updated_feature_value', 'cfg_list_path_in_listresponse', 'cfg_name_field_in_listitem', 'cfg_id_field_in_listitem', 'cfg_resource_object_path_in_detailresponse', 'cfg_name_field_in_detailresponse', 'cfg_id_field_in_detailresponse', 'cfg_resource_object_path_in_updateresponse', 'cfg_feature_field_name_for_validation', 'dms_instance_code', 'api_version'] +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - INFO - 测试阶段 'generic_crud_validation_stage' (API分组: '地质单元') 执行完毕. 最终状态: 失败, 耗时: 0.03s +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - INFO - API Test Stage execution processed. Considered 2 (stage_definition x api_group) combinations. +2025-06-05 18:28:03,317 - __main__ - INFO - API测试阶段 (Stages) 执行完毕。 +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - INFO - -------------------- API Test Summary -------------------- +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - INFO - Start Time: 2025-06-05T18:28:02.493962 +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - INFO - End Time: 2025-06-05T18:28:03.317939 +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - INFO - Total Duration: 0.82 seconds +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - INFO - --- Endpoints --- +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - INFO - Total Endpoints Defined: 6 +2025-06-05 18:28:03,317 - ddms_compliance_suite.test_orchestrator - INFO - Endpoints Tested: 6 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Passed: 0 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Failed: 6 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Error: 0 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Skipped: 0 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Partial Success: 0 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Success Rate: 0.00% +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - --- Test Cases --- +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Total Test Cases Applicable: 42 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Total Test Cases Executed: 42 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Passed: 24 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Failed: 18 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Error: 0 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Skipped (within endpoints): 0 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Success Rate: 57.14% +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - --- Stages --- +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Total Stages Defined: 1 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Total Stages Executed: 1 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Passed: 0 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Failed: 1 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Error: 0 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Skipped: 0 +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - Success Rate: 0.00% +2025-06-05 18:28:03,318 - ddms_compliance_suite.test_orchestrator - INFO - -------------------------------------------------------- +2025-06-05 18:28:03,319 - __main__ - INFO - 测试结果已保存为JSON: test_reports/summary.json +2025-06-05 18:28:03,319 - __main__ - INFO - API调用详情将以 Markdown 格式保存到目录 'test_reports' (使用默认文件名 'api_call_details.md') +2025-06-05 18:28:03,322 - __main__ - INFO - API调用详情已保存为 Markdown: test_reports/api_call_details.md +2025-06-05 18:28:03,322 - __main__ - INFO - 部分测试失败或出错,请检查报告。 +DEBUG: curlify generated command (raw): curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: your-tenant-id' -H 'Content-Type: application/json' -H 'Authorization: Bearer your-test-token' -H 'Content-Length: 187' -d '{"isSearchCount": true, "query": {"fields": ["dsid", "wellCommonName", "dataRegion"], "filter": {"key": "wellCommonName", "symbol": "=", "realValue": ["TestResource_1749119283_3c0f3c"]}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=1&pageSize=10' +DEBUG: curlify generated command (repr): 'curl -H \'User-Agent: python-requests/2.32.3\' -H \'Accept-Encoding: gzip, deflate, br, zstd\' -H \'Accept: application/json\' -H \'Connection: keep-alive\' -H \'tenant-id: your-tenant-id\' -H \'Content-Type: application/json\' -H \'Authorization: Bearer your-test-token\' -H \'Content-Length: 187\' -d \'{"isSearchCount": true, "query": {"fields": ["dsid", "wellCommonName", "dataRegion"], "filter": {"key": "wellCommonName", "symbol": "=", "realValue": ["TestResource_1749119283_3c0f3c"]}}}\' --insecure \'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=1&pageSize=10\'' diff --git a/test_reports/api_call_details.md b/test_reports/api_call_details.md index 3499ce4..a2acb6c 100644 --- a/test_reports/api_call_details.md +++ b/test_reports/api_call_details.md @@ -58,16 +58,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0421s` +- **Elapsed Time:** `0.0706s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "296", + "Content-Length": "433", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -75,21 +75,28 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 19, - "message": "ipsum laborum nisi", + "code": 21, + "message": "in enim ut voluptate dolor", "data": { - "total": 86, + "total": 97, "list": [ { - "dsid": "72", - "dataRegion": "ut ea Duis minim amet", + "dsid": "78", + "dataRegion": "enim Ut occaecat", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { - "dsid": "67", - "dataRegion": "quis ullamco sed", + "dsid": "88", + "dataRegion": "Lorem ipsum nulla exercitation laborum", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "42", + "dataRegion": "do dolor dolore ad", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -160,16 +167,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0185s` +- **Elapsed Time:** `0.0229s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "438", + "Content-Length": "287", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -177,28 +184,21 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 3, - "message": "est nostrud ex eiusmod ipsum", + "code": 89, + "message": "aliqua irure quis commodo fugiat", "data": { - "total": 96, + "total": 1, "list": [ + { + "dsid": "75", + "dataRegion": "quis qui", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, { "dsid": "89", - "dataRegion": "consectetur sit Excepteur", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "84", - "dataRegion": "reprehenderit commodo velit", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "27", - "dataRegion": "nisi id sint amet aliqua", + "dataRegion": "nostrud", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -269,16 +269,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0318s` +- **Elapsed Time:** `0.0202s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "411", + "Content-Length": "196", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -286,28 +286,14 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 31, - "message": "laboris anim eu Duis amet", + "code": 78, + "message": "reprehenderit adipisicing", "data": { - "total": 93, + "total": 22, "list": [ { - "dsid": "29", - "dataRegion": "quis est aute voluptate nostrud", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "67", - "dataRegion": "ex amet", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "44", - "dataRegion": "sed et dolore", + "dsid": "34", + "dataRegion": "cupidatat ad in aute est", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -378,16 +364,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0179s` +- **Elapsed Time:** `0.0159s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "180", + "Content-Length": "410", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -395,14 +381,28 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 16, - "message": "dolor eiusmod esse do dolore", + "code": 65, + "message": "officia", "data": { - "total": 59, + "total": 13, "list": [ { - "dsid": "90", - "dataRegion": "ex ad", + "dsid": "64", + "dataRegion": "officia nisi", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "45", + "dataRegion": "est sint in commodo Excepteur", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "87", + "dataRegion": "sit eu qui voluptate veniam", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -473,16 +473,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0147s` +- **Elapsed Time:** `0.0156s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "162", + "Content-Length": "285", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -490,14 +490,21 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 53, - "message": "do ut", + "code": 83, + "message": "enim tempor qui cupidatat Excepteur", "data": { - "total": 94, + "total": 92, "list": [ { - "dsid": "23", - "dataRegion": "esse magna", + "dsid": "47", + "dataRegion": "nisi eu", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "2", + "dataRegion": "sed", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -568,16 +575,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0182s` +- **Elapsed Time:** `0.0165s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "183", + "Content-Length": "171", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -585,14 +592,14 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 57, - "message": "Lorem eiusmod", + "code": 45, + "message": "non sit", "data": { - "total": 76, + "total": 5, "list": [ { - "dsid": "26", - "dataRegion": "incididunt sit non esse", + "dsid": "87", + "dataRegion": "reprehenderit esse", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -663,234 +670,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0174s` +- **Elapsed Time:** `0.0157s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "184", + "Content-Length": "382", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 95, - "message": "reprehenderit ad laborum", - "data": { - "total": 78, - "list": [ - { - "dsid": "76", - "dataRegion": "in est tempor", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - } - ] - } -} - ``` - ---- -## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize` -**cURL Command:** -```sh -curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize' -``` -### Request Details -- **Method:** `POST` -- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize` -- **Headers:** -```json -{ - "tenant-id": "header_val_tenant-id", - "Content-Type": "application/json", - "Accept": "application/json" -} - ``` -- **Query Parameters:** -```json -{ - "pageNo": "query_val_pageNo", - "pageSize": "query_val_pageSize" -} - ``` -- **Body:** -```json -{ - "isSearchCount": true, - "query": { - "dataRegions": [ - "example_string" - ], - "fields": [ - "example_string" - ], - "filter": { - "key": "example_string", - "logic": "example_string", - "realValue": [ - {} - ], - "singleValue": {}, - "subFilter": [ - "example_string" - ], - "symbol": "example_string" - }, - "groupFields": [ - "example_string" - ], - "groupFilter": { - "key": "example_string", - "logic": "example_string", - "realValue": [ - {} - ], - "singleValue": {}, - "subFilter": [ - "example_string" - ], - "symbol": "example_string" - }, - "sort": {} - } -} - ``` -### Response Details -- **Status Code:** `200` -- **Elapsed Time:** `0.0222s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "398", - "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 39, - "message": "aliqua voluptate", - "data": { - "total": 40, - "list": [ - { - "dsid": "40", - "dataRegion": "ut velit fugiat", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "59", - "dataRegion": "Duis voluptate quis mollit", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "63", - "dataRegion": "fugiat", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - } - ] - } -} - ``` - ---- -## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize` -**cURL Command:** -```sh -curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize' -``` -### Request Details -- **Method:** `POST` -- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize` -- **Headers:** -```json -{ - "tenant-id": "header_val_tenant-id", - "Content-Type": "application/json", - "Accept": "application/json" -} - ``` -- **Query Parameters:** -```json -{ - "pageNo": "query_val_pageNo", - "pageSize": "query_val_pageSize" -} - ``` -- **Body:** -```json -{ - "isSearchCount": true, - "query": { - "dataRegions": [ - "example_string" - ], - "fields": [ - "example_string" - ], - "filter": { - "key": "example_string", - "logic": "example_string", - "realValue": [ - {} - ], - "singleValue": {}, - "subFilter": [ - "example_string" - ], - "symbol": "example_string" - }, - "groupFields": [ - "example_string" - ], - "groupFilter": { - "key": "example_string", - "logic": "example_string", - "realValue": [ - {} - ], - "singleValue": {}, - "subFilter": [ - "example_string" - ], - "symbol": "example_string" - }, - "sort": {} - } -} - ``` -### Response Details -- **Status Code:** `200` -- **Elapsed Time:** `0.0160s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "374", - "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -899,27 +688,27 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ```json { "code": 93, - "message": "dolore nisi", + "message": "in", "data": { - "total": 82, + "total": 83, "list": [ { - "dsid": "97", - "dataRegion": "veniam", + "dsid": "51", + "dataRegion": "anim", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { - "dsid": "43", - "dataRegion": "Duis voluptate ut in", + "dsid": "23", + "dataRegion": "Excepteur laboris", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { - "dsid": "38", - "dataRegion": "ut", + "dsid": "15", + "dataRegion": "ut magna eu fugiat velit", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -997,16 +786,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0169s` +- **Elapsed Time:** `0.0149s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "266", + "Content-Length": "189", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1014,21 +803,239 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 95, - "message": "nisi", + "code": 70, + "message": "ullamco ea qui ex", "data": { - "total": 48, + "total": 10, "list": [ { - "dsid": "64", - "dataRegion": "laboris Ut ut", + "dsid": "56", + "dataRegion": "occaecat mollit est ipsum", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize` +**cURL Command:** +```sh +curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize' +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Query Parameters:** +```json +{ + "pageNo": "query_val_pageNo", + "pageSize": "query_val_pageSize" +} + ``` +- **Body:** +```json +{ + "isSearchCount": true, + "query": { + "dataRegions": [ + "example_string" + ], + "fields": [ + "example_string" + ], + "filter": { + "key": "example_string", + "logic": "example_string", + "realValue": [ + {} + ], + "singleValue": {}, + "subFilter": [ + "example_string" + ], + "symbol": "example_string" + }, + "groupFields": [ + "example_string" + ], + "groupFilter": { + "key": "example_string", + "logic": "example_string", + "realValue": [ + {} + ], + "singleValue": {}, + "subFilter": [ + "example_string" + ], + "symbol": "example_string" + }, + "sort": {} + } +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0137s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "432", + "success": "false", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 70, + "message": "ad labore commodo deserunt", + "data": { + "total": 35, + "list": [ + { + "dsid": "7", + "dataRegion": "anim laboris quis", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { - "dsid": "22", - "dataRegion": "deserunt", + "dsid": "20", + "dataRegion": "mollit cupidatat est id", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "76", + "dataRegion": "cupidatat dolore eu commodo quis", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize` +**cURL Command:** +```sh +curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize' +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=query_val_pageNo&pageSize=query_val_pageSize` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Query Parameters:** +```json +{ + "pageNo": "query_val_pageNo", + "pageSize": "query_val_pageSize" +} + ``` +- **Body:** +```json +{ + "isSearchCount": true, + "query": { + "dataRegions": [ + "example_string" + ], + "fields": [ + "example_string" + ], + "filter": { + "key": "example_string", + "logic": "example_string", + "realValue": [ + {} + ], + "singleValue": {}, + "subFilter": [ + "example_string" + ], + "symbol": "example_string" + }, + "groupFields": [ + "example_string" + ], + "groupFilter": { + "key": "example_string", + "logic": "example_string", + "realValue": [ + {} + ], + "singleValue": {}, + "subFilter": [ + "example_string" + ], + "symbol": "example_string" + }, + "sort": {} + } +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0141s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "282", + "success": "false", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 40, + "message": "quis sint", + "data": { + "total": 37, + "list": [ + { + "dsid": "69", + "dataRegion": "sit dolore", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "67", + "dataRegion": "ullamco esse consequat", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -1113,9 +1120,9 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "312", + "Content-Length": "190", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1123,21 +1130,14 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 70, - "message": "enim consectetur dolor non ut", + "code": 3, + "message": "reprehenderit Ut adipisicing anim", "data": { - "total": 59, + "total": 78, "list": [ { - "dsid": "14", - "dataRegion": "dolore consequat enim ad officia", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "83", - "dataRegion": "ut in nisi", + "dsid": "99", + "dataRegion": "ex enim sit", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -1215,16 +1215,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0176s` +- **Elapsed Time:** `0.0154s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "276", + "Content-Length": "179", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1232,21 +1232,14 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 71, - "message": "in Ut officia dolore", + "code": 55, + "message": "qui ea est", "data": { - "total": 25, + "total": 37, "list": [ { - "dsid": "5", - "dataRegion": "do", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "71", - "dataRegion": "anim sed velit", + "dsid": "27", + "dataRegion": "qui adipisicing sed in", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -1324,16 +1317,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0158s` +- **Elapsed Time:** `0.0177s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "175", + "Content-Length": "205", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1341,14 +1334,14 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 98, - "message": "enim", + "code": 50, + "message": "aliqua nisi occaecat", "data": { - "total": 31, + "total": 32, "list": [ { - "dsid": "16", - "dataRegion": "enim pariatur incididunt", + "dsid": "92", + "dataRegion": "incididunt non dolore cupidatat labore", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -1426,16 +1419,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0145s` +- **Elapsed Time:** `0.0318s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "306", + "Content-Length": "297", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1443,21 +1436,21 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 24, - "message": "nisi magna ea sit", + "code": 10, + "message": "fugiat ex", "data": { - "total": 20, + "total": 85, "list": [ { - "dsid": "31", - "dataRegion": "magna irure laboris exercitation", + "dsid": "94", + "dataRegion": "reprehenderit enim velit esse", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { - "dsid": "39", - "dataRegion": "consequat non Ut", + "dsid": "51", + "dataRegion": "sit amet Excepteur", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -1499,16 +1492,16 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0144s` +- **Elapsed Time:** `0.0131s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "46", + "Content-Length": "69", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1516,8 +1509,63 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 13, - "message": "consequat", + "code": 59, + "message": "officia ea eiusmod nisi cupidatat", + "data": true +} + ``` + +--- +## `PUT http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid` +**cURL Command:** +```sh +curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 53' -d '{"id": "example_string", "version": "example_string"}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid' +``` +### Request Details +- **Method:** `PUT` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Query Parameters:** +```json +{ + "id": "dsid" +} + ``` +- **Body:** +```json +{ + "id": "example_string", + "version": "example_string" +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0136s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "50", + "success": "false", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 91, + "message": "minim elit in", "data": false } ``` @@ -1554,16 +1602,16 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0149s` +- **Elapsed Time:** `0.0157s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "39", + "Content-Length": "72", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1571,64 +1619,9 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 13, - "message": "ex", - "data": false -} - ``` - ---- -## `PUT http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid` -**cURL Command:** -```sh -curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 53' -d '{"id": "example_string", "version": "example_string"}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid' -``` -### Request Details -- **Method:** `PUT` -- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid` -- **Headers:** -```json -{ - "tenant-id": "header_val_tenant-id", - "Content-Type": "application/json", - "Accept": "application/json" -} - ``` -- **Query Parameters:** -```json -{ - "id": "dsid" -} - ``` -- **Body:** -```json -{ - "id": "example_string", - "version": "example_string" -} - ``` -### Response Details -- **Status Code:** `200` -- **Elapsed Time:** `0.0179s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "42", - "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 8, - "message": "qui ex", - "data": false + "code": 15, + "message": "occaecat ullamco minim reprehenderit", + "data": true } ``` @@ -1664,16 +1657,16 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0130s` +- **Elapsed Time:** `0.0124s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "38", + "Content-Length": "49", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1681,9 +1674,9 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 20, - "message": "Ut", - "data": true + "code": 15, + "message": "dolore ex id", + "data": false } ``` @@ -1719,16 +1712,16 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0141s` +- **Elapsed Time:** `0.0123s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "38", + "Content-Length": "60", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1736,9 +1729,9 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 51, - "message": "do", - "data": true + "code": 9, + "message": "et ut aliqua aliquip est", + "data": false } ``` @@ -1773,7 +1766,7 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0128s` +- **Elapsed Time:** `0.0218s` - **Headers:** ```json { @@ -1782,7 +1775,7 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d "Content-Type": "application/json; charset=utf-8", "Content-Length": "13", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1820,16 +1813,16 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0161s` +- **Elapsed Time:** `0.0132s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "48", + "Content-Length": "54", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1837,8 +1830,122 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 82, - "message": "aliqua nulla", + "code": 76, + "message": "ut do enim dolore", + "data": false +} + ``` + +--- +## `DELETE http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid` +**cURL Command:** +```sh +curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 57' -d '{"version": "example_string", "data": ["example_string"]}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid' +``` +### Request Details +- **Method:** `DELETE` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Query Parameters:** +```json +{ + "id": "dsid" +} + ``` +- **Body:** +```json +{ + "version": "example_string", + "data": [ + "example_string" + ] +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0134s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "40", + "success": "false", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 85, + "message": "qui", + "data": false +} + ``` + +--- +## `DELETE http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid` +**cURL Command:** +```sh +curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 57' -d '{"version": "example_string", "data": ["example_string"]}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid' +``` +### Request Details +- **Method:** `DELETE` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Query Parameters:** +```json +{ + "id": "dsid" +} + ``` +- **Body:** +```json +{ + "version": "example_string", + "data": [ + "example_string" + ] +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0125s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "57", + "success": "false", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 18, + "message": "id elit dolor ullamco", "data": true } ``` @@ -1877,121 +1984,7 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0138s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "43", - "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 99, - "message": "laborum", - "data": true -} - ``` - ---- -## `DELETE http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid` -**cURL Command:** -```sh -curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 57' -d '{"version": "example_string", "data": ["example_string"]}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid' -``` -### Request Details -- **Method:** `DELETE` -- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid` -- **Headers:** -```json -{ - "tenant-id": "header_val_tenant-id", - "Content-Type": "application/json", - "Accept": "application/json" -} - ``` -- **Query Parameters:** -```json -{ - "id": "dsid" -} - ``` -- **Body:** -```json -{ - "version": "example_string", - "data": [ - "example_string" - ] -} - ``` -### Response Details -- **Status Code:** `200` -- **Elapsed Time:** `0.0272s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "70", - "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 70, - "message": "laboris tempor cillum culpa fugiat", - "data": true -} - ``` - ---- -## `DELETE http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid` -**cURL Command:** -```sh -curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 57' -d '{"version": "example_string", "data": ["example_string"]}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid' -``` -### Request Details -- **Method:** `DELETE` -- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid` -- **Headers:** -```json -{ - "tenant-id": "header_val_tenant-id", - "Content-Type": "application/json", - "Accept": "application/json" -} - ``` -- **Query Parameters:** -```json -{ - "id": "dsid" -} - ``` -- **Body:** -```json -{ - "version": "example_string", - "data": [ - "example_string" - ] -} - ``` -### Response Details -- **Status Code:** `200` -- **Elapsed Time:** `0.0250s` +- **Elapsed Time:** `0.0160s` - **Headers:** ```json { @@ -2000,7 +1993,7 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip "Content-Type": "application/json; charset=utf-8", "Content-Length": "41", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:02 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2008,9 +2001,9 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip - **Body:** ```json { - "code": 98, - "message": "amet", - "data": false + "code": 12, + "message": "dolor", + "data": true } ``` @@ -2048,16 +2041,16 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0149s` +- **Elapsed Time:** `0.0143s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "44", + "Content-Length": "41", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2065,8 +2058,8 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip - **Body:** ```json { - "code": 78, - "message": "proident", + "code": 72, + "message": "dolor", "data": true } ``` @@ -2105,16 +2098,16 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0200s` +- **Elapsed Time:** `0.0161s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "46", + "Content-Length": "69", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2122,9 +2115,9 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip - **Body:** ```json { - "code": 51, - "message": "quis dolor", - "data": true + "code": 54, + "message": "do magna labore aliquip occaecat", + "data": false } ``` @@ -2162,16 +2155,16 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0137s` +- **Elapsed Time:** `0.0144s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "61", + "Content-Length": "59", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2179,9 +2172,9 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip - **Body:** ```json { - "code": 7, - "message": "Ut esse enim cillum irure", - "data": false + "code": 36, + "message": "minim nisi fugiat velit", + "data": true } ``` @@ -2213,118 +2206,6 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0128s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "67", - "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 22, - "message": "fugiat dolor labore Duis dolore", - "data": true -} - ``` - ---- -## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit` -**cURL Command:** -```sh -curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 152' -d '{"version": "example_string", "data": [{"bsflag": 0.0, "wellCommonName": "example_string", "wellId": "example_string", "dataRegion": "example_string"}]}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -``` -### Request Details -- **Method:** `POST` -- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit` -- **Headers:** -```json -{ - "tenant-id": "header_val_tenant-id", - "Content-Type": "application/json", - "Accept": "application/json" -} - ``` -- **Body:** -```json -{ - "version": "example_string", - "data": [ - { - "bsflag": 0.0, - "wellCommonName": "example_string", - "wellId": "example_string", - "dataRegion": "example_string" - } - ] -} - ``` -### Response Details -- **Status Code:** `200` -- **Elapsed Time:** `0.0141s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "44", - "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 55, - "message": "occaecat", - "data": true -} - ``` - ---- -## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit` -**cURL Command:** -```sh -curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 152' -d '{"version": "example_string", "data": [{"bsflag": 0.0, "wellCommonName": "example_string", "wellId": "example_string", "dataRegion": "example_string"}]}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit -``` -### Request Details -- **Method:** `POST` -- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit` -- **Headers:** -```json -{ - "tenant-id": "header_val_tenant-id", - "Content-Type": "application/json", - "Accept": "application/json" -} - ``` -- **Body:** -```json -{ - "version": "example_string", - "data": [ - { - "bsflag": 0.0, - "wellCommonName": "example_string", - "wellId": "example_string", - "dataRegion": "example_string" - } - ] -} - ``` -### Response Details -- **Status Code:** `200` - **Elapsed Time:** `0.0130s` - **Headers:** ```json @@ -2332,9 +2213,9 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "61", + "Content-Length": "52", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2342,9 +2223,9 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 100, - "message": "sint labore aute officia", - "data": true + "code": 52, + "message": "proident dolore", + "data": false } ``` @@ -2381,16 +2262,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0162s` +- **Elapsed Time:** `0.0187s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "49", + "Content-Length": "39", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2398,8 +2279,120 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 44, - "message": "irure est non", + "code": 54, + "message": "ad", + "data": false +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit` +**cURL Command:** +```sh +curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 152' -d '{"version": "example_string", "data": [{"bsflag": 0.0, "wellCommonName": "example_string", "wellId": "example_string", "dataRegion": "example_string"}]}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Body:** +```json +{ + "version": "example_string", + "data": [ + { + "bsflag": 0.0, + "wellCommonName": "example_string", + "wellId": "example_string", + "dataRegion": "example_string" + } + ] +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0140s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "58", + "success": "false", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 39, + "message": "voluptate commodo est", + "data": false +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit` +**cURL Command:** +```sh +curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 152' -d '{"version": "example_string", "data": [{"bsflag": 0.0, "wellCommonName": "example_string", "wellId": "example_string", "dataRegion": "example_string"}]}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Body:** +```json +{ + "version": "example_string", + "data": [ + { + "bsflag": 0.0, + "wellCommonName": "example_string", + "wellId": "example_string", + "dataRegion": "example_string" + } + ] +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0128s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "70", + "success": "false", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 5, + "message": "deserunt labore Excepteur veniam do", "data": true } ``` @@ -2444,9 +2437,9 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "54", + "Content-Length": "51", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2454,8 +2447,8 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 83, - "message": "fugiat eu eiusmod", + "code": 45, + "message": "Lorem dolor et", "data": false } ``` @@ -2493,16 +2486,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0182s` +- **Elapsed Time:** `0.0130s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "68", + "Content-Length": "54", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2510,9 +2503,9 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 56, - "message": "consequat officia consectetur in", - "data": true + "code": 92, + "message": "tempor ut aliquip", + "data": false } ``` @@ -2548,16 +2541,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0156s` +- **Elapsed Time:** `0.0167s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "56", + "Content-Length": "49", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:09 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2565,9 +2558,9 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 49, - "message": "in voluptate laborum", - "data": true + "code": 35, + "message": "tempor culpa", + "data": false } ``` @@ -2604,16 +2597,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0143s` +- **Elapsed Time:** `0.0192s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "50", + "Content-Length": "62", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:10 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2621,8 +2614,8 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 59, - "message": "veniam commodo", + "code": 38, + "message": "nulla ad ullamco Lorem qui", "data": true } ``` @@ -2695,9 +2688,9 @@ curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "165", + "Content-Length": "415", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:10 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2705,116 +2698,28 @@ curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 85, - "message": "qui irure quis", + "code": 11, + "message": "velit ullamco nulla occaecat est", "data": { - "total": 68, + "total": 4, "list": [ { - "dsid": "68", - "dataRegion": "sunt", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - } - ] - } -} - ``` - ---- -## `GET http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id` -**cURL Command:** -```sh -curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -``` -### Request Details -- **Method:** `GET` -- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id` -- **Headers:** -```json -{ - "tenant-id": "header_val_tenant-id", - "Content-Type": "application/json", - "Accept": "application/json" -} - ``` -- **Body:** -```json -{ - "isSearchCount": true, - "query": { - "dataRegions": [ - "example_string" - ], - "fields": [ - "example_string" - ], - "filter": { - "key": "example_string", - "logic": "example_string", - "realValue": [ - {} - ], - "singleValue": {}, - "subFilter": [ - "example_string" - ], - "symbol": "example_string" - }, - "groupFields": [ - "example_string" - ], - "groupFilter": { - "key": "example_string", - "logic": "example_string", - "realValue": [ - {} - ], - "singleValue": {}, - "subFilter": [ - "example_string" - ], - "symbol": "example_string" - }, - "sort": {} - } -} - ``` -### Response Details -- **Status Code:** `200` -- **Elapsed Time:** `0.0160s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "284", - "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:10 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 50, - "message": "pariatur dolore do esse", - "data": { - "total": 62, - "list": [ - { - "dsid": "35", - "dataRegion": "dolore officia", + "dsid": "62", + "dataRegion": "sint eiusmod minim eu", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { - "dsid": "68", - "dataRegion": "cillum", + "dsid": "2", + "dataRegion": "anim Duis", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "71", + "dataRegion": "nostrud do cupidatat", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -2892,9 +2797,9 @@ curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "195", + "Content-Length": "310", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:10 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2902,14 +2807,21 @@ curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 49, - "message": "laboris eu commodo minim nisi", + "code": 38, + "message": "sit aliquip dolore pariatur", "data": { - "total": 14, + "total": 94, "list": [ { - "dsid": "100", - "dataRegion": "sint deserunt nisi", + "dsid": "69", + "dataRegion": "dolore", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "22", + "dataRegion": "aliquip dolore aliqua nisi voluptate", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -2980,16 +2892,16 @@ curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0174s` +- **Elapsed Time:** `0.0126s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "200", + "Content-Length": "432", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:10 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2997,14 +2909,137 @@ curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 60, - "message": "aliquip pariatur labore ex officia", + "code": 25, + "message": "Ut cupidatat cillum", "data": { - "total": 35, + "total": 95, "list": [ { - "dsid": "91", - "dataRegion": "in nostrud est amet", + "dsid": "34", + "dataRegion": "amet dolor voluptate dolore", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "60", + "dataRegion": "dolore commodo", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "76", + "dataRegion": "pariatur exercitation voluptate dolor", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `GET http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id` +**cURL Command:** +```sh +curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +``` +### Request Details +- **Method:** `GET` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Body:** +```json +{ + "isSearchCount": true, + "query": { + "dataRegions": [ + "example_string" + ], + "fields": [ + "example_string" + ], + "filter": { + "key": "example_string", + "logic": "example_string", + "realValue": [ + {} + ], + "singleValue": {}, + "subFilter": [ + "example_string" + ], + "symbol": "example_string" + }, + "groupFields": [ + "example_string" + ], + "groupFilter": { + "key": "example_string", + "logic": "example_string", + "realValue": [ + {} + ], + "singleValue": {}, + "subFilter": [ + "example_string" + ], + "symbol": "example_string" + }, + "sort": {} + } +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0123s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "382", + "success": "false", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 14, + "message": "proident", + "data": { + "total": 2, + "list": [ + { + "dsid": "71", + "dataRegion": "deserunt occaecat", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "75", + "dataRegion": "in voluptate ullamco", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "70", + "dataRegion": "qui", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -3075,16 +3110,16 @@ curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0206s` +- **Elapsed Time:** `0.0147s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "158", + "Content-Length": "183", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:10 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -3092,14 +3127,14 @@ curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 6, - "message": "non", + "code": 62, + "message": "eu magna culpa nisi", "data": { - "total": 19, + "total": 75, "list": [ { - "dsid": "82", - "dataRegion": "Excepteur", + "dsid": "41", + "dataRegion": "culpa mollit sunt", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -3170,16 +3205,16 @@ curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0169s` +- **Elapsed Time:** `0.0165s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "281", + "Content-Length": "162", "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:10 GMT", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -3187,130 +3222,273 @@ curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 16, - "message": "non deserunt", + "code": 75, + "message": "et", "data": { - "total": 55, + "total": 93, "list": [ { - "dsid": "20", - "dataRegion": "qui pariatur commodo aute", + "dsid": "96", + "dataRegion": "do enim nulla", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `GET http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id` +**cURL Command:** +```sh +curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id +``` +### Request Details +- **Method:** `GET` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Body:** +```json +{ + "isSearchCount": true, + "query": { + "dataRegions": [ + "example_string" + ], + "fields": [ + "example_string" + ], + "filter": { + "key": "example_string", + "logic": "example_string", + "realValue": [ + {} + ], + "singleValue": {}, + "subFilter": [ + "example_string" + ], + "symbol": "example_string" + }, + "groupFields": [ + "example_string" + ], + "groupFilter": { + "key": "example_string", + "logic": "example_string", + "realValue": [ + {} + ], + "singleValue": {}, + "subFilter": [ + "example_string" + ], + "symbol": "example_string" + }, + "sort": {} + } +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0136s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "395", + "success": "false", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 15, + "message": "sunt nisi enim", + "data": { + "total": 45, + "list": [ + { + "dsid": "37", + "dataRegion": "reprehenderit", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "97", + "dataRegion": "amet anim esse", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "30", + "dataRegion": "sunt Ut enim et sit", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit` +**cURL Command:** +```sh +curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: your-tenant-id' -H 'Content-Type: application/json' -H 'Authorization: Bearer your-test-token' -H 'Content-Length: 120' -d '{"version": "1.0.0", "data": [{"wellCommonName": "TestResource_1749119283_3c0f3c", "dataRegion": "Feature_1749119283"}]}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit` +- **Headers:** +```json +{ + "tenant-id": "your-tenant-id", + "Content-Type": "application/json", + "Accept": "application/json", + "Authorization": "Bearer your-test-token" +} + ``` +- **Body:** +```json +{ + "version": "1.0.0", + "data": [ + { + "wellCommonName": "TestResource_1749119283_3c0f3c", + "dataRegion": "Feature_1749119283" + } + ] +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0121s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "59", + "success": "false", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 32, + "message": "esse nulla adipisicing", + "data": false +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=1&pageSize=10` +**cURL Command:** +```sh +curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: your-tenant-id' -H 'Content-Type: application/json' -H 'Authorization: Bearer your-test-token' -H 'Content-Length: 187' -d '{"isSearchCount": true, "query": {"fields": ["dsid", "wellCommonName", "dataRegion"], "filter": {"key": "wellCommonName", "symbol": "=", "realValue": ["TestResource_1749119283_3c0f3c"]}}}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=1&pageSize=10' +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0?pageNo=1&pageSize=10` +- **Headers:** +```json +{ + "tenant-id": "your-tenant-id", + "Content-Type": "application/json", + "Accept": "application/json", + "Authorization": "Bearer your-test-token" +} + ``` +- **Query Parameters:** +```json +{ + "pageNo": 1, + "pageSize": 10 +} + ``` +- **Body:** +```json +{ + "isSearchCount": true, + "query": { + "fields": [ + "dsid", + "wellCommonName", + "dataRegion" + ], + "filter": { + "key": "wellCommonName", + "symbol": "=", + "realValue": [ + "TestResource_1749119283_3c0f3c" + ] + } + } +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0129s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "386", + "success": "false", + "Date": "Thu, 05 Jun 2025 10:28:03 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 98, + "message": "Duis proident magna nulla", + "data": { + "total": 61, + "list": [ + { + "dsid": "16", + "dataRegion": "pariatur dolore", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "69", + "dataRegion": "Ut", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { "dsid": "25", - "dataRegion": "sit", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - } - ] - } -} - ``` - ---- -## `GET http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id` -**cURL Command:** -```sh -curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'tenant-id: header_val_tenant-id' -H 'Content-Type: application/json' -H 'Content-Length: 477' -d '{"isSearchCount": true, "query": {"dataRegions": ["example_string"], "fields": ["example_string"], "filter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "groupFields": ["example_string"], "groupFilter": {"key": "example_string", "logic": "example_string", "realValue": [{}], "singleValue": {}, "subFilter": ["example_string"], "symbol": "example_string"}, "sort": {}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id -``` -### Request Details -- **Method:** `GET` -- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id` -- **Headers:** -```json -{ - "tenant-id": "header_val_tenant-id", - "Content-Type": "application/json", - "Accept": "application/json" -} - ``` -- **Body:** -```json -{ - "isSearchCount": true, - "query": { - "dataRegions": [ - "example_string" - ], - "fields": [ - "example_string" - ], - "filter": { - "key": "example_string", - "logic": "example_string", - "realValue": [ - {} - ], - "singleValue": {}, - "subFilter": [ - "example_string" - ], - "symbol": "example_string" - }, - "groupFields": [ - "example_string" - ], - "groupFilter": { - "key": "example_string", - "logic": "example_string", - "realValue": [ - {} - ], - "singleValue": {}, - "subFilter": [ - "example_string" - ], - "symbol": "example_string" - }, - "sort": {} - } -} - ``` -### Response Details -- **Status Code:** `200` -- **Elapsed Time:** `0.0216s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "393", - "success": "false", - "Date": "Thu, 05 Jun 2025 07:29:10 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 35, - "message": "id officia", - "data": { - "total": 6, - "list": [ - { - "dsid": "57", - "dataRegion": "ullamco amet", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "27", - "dataRegion": "anim sit sunt cupidatat ullamco", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "86", - "dataRegion": "cillum", + "dataRegion": "ut in sed", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null diff --git a/test_reports/summary.json b/test_reports/summary.json index 739f64d..d001160 100644 --- a/test_reports/summary.json +++ b/test_reports/summary.json @@ -1,36 +1,40 @@ { - "summary_metadata": { - "start_time": "2025-06-05T15:29:09.342664", - "end_time": "2025-06-05T15:29:10.206388", - "duration_seconds": "0.86" + "start_time": "2025-06-05T18:28:02.493962", + "end_time": "2025-06-05T18:28:03.317939", + "duration_seconds": "0.82", + "overall_summary": { + "total_endpoints_defined": 6, + "endpoints_tested": 6, + "endpoints_passed": 0, + "endpoints_failed": 6, + "endpoints_error": 0, + "endpoints_skipped": 0, + "endpoints_partial_success": 0, + "endpoint_success_rate": "0.00%", + "total_test_cases_applicable": 42, + "total_test_cases_executed": 42, + "test_cases_passed": 24, + "test_cases_failed": 18, + "test_cases_error": 0, + "test_cases_skipped_in_endpoint": 0, + "test_case_success_rate": "57.14%", + "total_stages_defined": 1, + "total_stages_executed": 1, + "stages_passed": 0, + "stages_failed": 1, + "stages_error": 0, + "stages_skipped": 0, + "stage_success_rate": "0.00%" }, - "endpoint_stats": { - "total_defined": 6, - "total_tested": 6, - "passed": 0, - "failed": 6, - "partial_success": 0, - "error": 0, - "skipped": 0, - "success_rate_percentage": "0.00" - }, - "test_case_stats": { - "total_applicable": 42, - "total_executed": 42, - "passed": 24, - "failed": 18, - "error_in_execution": 0, - "skipped_during_endpoint_execution": 0, - "success_rate_percentage": "57.14" - }, - "detailed_results": [ + "errors": [], + "endpoint_results": [ { "endpoint_id": "POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}", "endpoint_name": "数据推送接口", "overall_status": "失败", - "duration_seconds": 0.176812, - "start_time": "2025-06-05T15:29:09.343020", - "end_time": "2025-06-05T15:29:09.519832", + "duration_seconds": 0.194773, + "start_time": "2025-06-05T18:28:02.494290", + "end_time": "2025-06-05T18:28:02.689063", "executed_test_cases": [ { "test_case_id": "TC-STATUS-001", @@ -38,8 +42,8 @@ "test_case_severity": "严重", "status": "通过", "message": "响应状态码为 200,符合预期 200。", - "duration_seconds": 0.04925308399833739, - "timestamp": "2025-06-05T15:29:09.392359", + "duration_seconds": 0.07716754200009746, + "timestamp": "2025-06-05T18:28:02.571541", "validation_points": [ { "passed": true, @@ -53,8 +57,8 @@ "test_case_severity": "严重", "status": "通过", "message": "Schema验证步骤完成(未发现问题,或schema不适用/未为此响应定义)。", - "duration_seconds": 0.020062999799847603, - "timestamp": "2025-06-05T15:29:09.412491", + "duration_seconds": 0.024743791000219062, + "timestamp": "2025-06-05T18:28:02.596380", "validation_points": [ { "passed": true, @@ -68,8 +72,8 @@ "test_case_severity": "严重", "status": "失败", "message": "API通过HTTP (http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version) 响应了成功的状态码 200,这违反了HTTPS强制策略。", - "duration_seconds": 0.03328133397735655, - "timestamp": "2025-06-05T15:29:09.445843", + "duration_seconds": 0.021939457999906153, + "timestamp": "2025-06-05T18:28:02.618405", "validation_points": [ { "status_code": 200 @@ -82,8 +86,8 @@ "test_case_severity": "中", "status": "通过", "message": "跳过测试:在查询参数中未找到合适的字段来测试类型不匹配。", - "duration_seconds": 0.019311791053041816, - "timestamp": "2025-06-05T15:29:09.465227", + "duration_seconds": 0.017487500000243017, + "timestamp": "2025-06-05T18:28:02.635967", "validation_points": [ { "passed": true, @@ -96,21 +100,28 @@ "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", "test_case_severity": "中", "status": "失败", - "message": "当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '53'.", - "duration_seconds": 0.01617983286269009, - "timestamp": "2025-06-05T15:29:09.481464", + "message": "当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '83'.", + "duration_seconds": 0.017762041999958456, + "timestamp": "2025-06-05T18:28:02.653793", "validation_points": [ { "status_code": 200, "response_body": { - "code": 53, - "message": "do ut", + "code": 83, + "message": "enim tempor qui cupidatat Excepteur", "data": { - "total": 94, + "total": 92, "list": [ { - "dsid": "23", - "dataRegion": "esse magna", + "dsid": "47", + "dataRegion": "nisi eu", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "2", + "dataRegion": "sed", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -133,8 +144,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。", - "duration_seconds": 0.01953258295543492, - "timestamp": "2025-06-05T15:29:09.501049", + "duration_seconds": 0.01802966600007494, + "timestamp": "2025-06-05T18:28:02.671883", "validation_points": [ { "passed": true, @@ -148,8 +159,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。", - "duration_seconds": 0.018678209045901895, - "timestamp": "2025-06-05T15:29:09.519789", + "duration_seconds": 0.01706554199972743, + "timestamp": "2025-06-05T18:28:02.689010", "validation_points": [ { "passed": true, @@ -163,9 +174,9 @@ "endpoint_id": "POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}", "endpoint_name": "地质单元列表查询", "overall_status": "失败", - "duration_seconds": 0.127835, - "start_time": "2025-06-05T15:29:09.519873", - "end_time": "2025-06-05T15:29:09.647708", + "duration_seconds": 0.140447, + "start_time": "2025-06-05T18:28:02.689106", + "end_time": "2025-06-05T18:28:02.829553", "executed_test_cases": [ { "test_case_id": "TC-STATUS-001", @@ -173,8 +184,8 @@ "test_case_severity": "严重", "status": "通过", "message": "响应状态码为 200,符合预期 200。", - "duration_seconds": 0.023476583184674382, - "timestamp": "2025-06-05T15:29:09.543452", + "duration_seconds": 0.016307667000091897, + "timestamp": "2025-06-05T18:28:02.705519", "validation_points": [ { "passed": true, @@ -188,8 +199,8 @@ "test_case_severity": "严重", "status": "通过", "message": "Schema验证步骤完成(未发现问题,或schema不适用/未为此响应定义)。", - "duration_seconds": 0.017251041950657964, - "timestamp": "2025-06-05T15:29:09.560760", + "duration_seconds": 0.015740542000003188, + "timestamp": "2025-06-05T18:28:02.721320", "validation_points": [ { "passed": true, @@ -203,8 +214,8 @@ "test_case_severity": "严重", "status": "失败", "message": "API通过HTTP (http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0) 响应了成功的状态码 200,这违反了HTTPS强制策略。", - "duration_seconds": 0.018187625100836158, - "timestamp": "2025-06-05T15:29:09.579005", + "duration_seconds": 0.01721854200013695, + "timestamp": "2025-06-05T18:28:02.738684", "validation_points": [ { "status_code": 200 @@ -216,28 +227,21 @@ "test_case_name": "Error Code 4001 - Query Parameter Type Mismatch Validation", "test_case_severity": "中", "status": "失败", - "message": "当查询参数 'pageNo' (路径: 'pageNo') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '70'.", - "duration_seconds": 0.01608020788989961, - "timestamp": "2025-06-05T15:29:09.595141", + "message": "当查询参数 'pageNo' (路径: 'pageNo') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '3'.", + "duration_seconds": 0.016167792000032932, + "timestamp": "2025-06-05T18:28:02.754908", "validation_points": [ { "status_code": 200, "response_body": { - "code": 70, - "message": "enim consectetur dolor non ut", + "code": 3, + "message": "reprehenderit Ut adipisicing anim", "data": { - "total": 59, + "total": 78, "list": [ { - "dsid": "14", - "dataRegion": "dolore consequat enim ad officia", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "83", - "dataRegion": "ut in nisi", + "dsid": "99", + "dataRegion": "ex enim sit", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -259,28 +263,21 @@ "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", "test_case_severity": "中", "status": "失败", - "message": "当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '71'.", - "duration_seconds": 0.019070749869570136, - "timestamp": "2025-06-05T15:29:09.614270", + "message": "当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '55'.", + "duration_seconds": 0.019535458000063954, + "timestamp": "2025-06-05T18:28:02.774595", "validation_points": [ { "status_code": 200, "response_body": { - "code": 71, - "message": "in Ut officia dolore", + "code": 55, + "message": "qui ea est", "data": { - "total": 25, + "total": 37, "list": [ { - "dsid": "5", - "dataRegion": "do", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "71", - "dataRegion": "anim sed velit", + "dsid": "27", + "dataRegion": "qui adipisicing sed in", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -303,8 +300,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。", - "duration_seconds": 0.017200292088091373, - "timestamp": "2025-06-05T15:29:09.631527", + "duration_seconds": 0.02135204199976215, + "timestamp": "2025-06-05T18:28:02.796130", "validation_points": [ { "passed": true, @@ -318,8 +315,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。", - "duration_seconds": 0.016073625069111586, - "timestamp": "2025-06-05T15:29:09.647664", + "duration_seconds": 0.03331174999993891, + "timestamp": "2025-06-05T18:28:02.829507", "validation_points": [ { "passed": true, @@ -333,9 +330,9 @@ "endpoint_id": "PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit", "endpoint_name": "地质单元数据修改", "overall_status": "失败", - "duration_seconds": 0.112382, - "start_time": "2025-06-05T15:29:09.647743", - "end_time": "2025-06-05T15:29:09.760125", + "duration_seconds": 0.119921, + "start_time": "2025-06-05T18:28:02.829585", + "end_time": "2025-06-05T18:28:02.949506", "executed_test_cases": [ { "test_case_id": "TC-STATUS-001", @@ -343,8 +340,8 @@ "test_case_severity": "严重", "status": "通过", "message": "响应状态码为 200,符合预期 200。", - "duration_seconds": 0.015315334079787135, - "timestamp": "2025-06-05T15:29:09.663149", + "duration_seconds": 0.014083292000123038, + "timestamp": "2025-06-05T18:28:02.843755", "validation_points": [ { "passed": true, @@ -358,8 +355,8 @@ "test_case_severity": "严重", "status": "通过", "message": "针对 PUT http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit (状态码 200) 的响应体 conforms to the JSON schema.", - "duration_seconds": 0.0173952910117805, - "timestamp": "2025-06-05T15:29:09.680593", + "duration_seconds": 0.019283624999843596, + "timestamp": "2025-06-05T18:28:02.863091", "validation_points": [ { "passed": true, @@ -373,8 +370,8 @@ "test_case_severity": "严重", "status": "失败", "message": "API通过HTTP (http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit) 响应了成功的状态码 200,这违反了HTTPS强制策略。", - "duration_seconds": 0.018789875088259578, - "timestamp": "2025-06-05T15:29:09.699447", + "duration_seconds": 0.017471499999828666, + "timestamp": "2025-06-05T18:28:02.880732", "validation_points": [ { "status_code": 200 @@ -386,16 +383,16 @@ "test_case_name": "Error Code 4001 - Query Parameter Type Mismatch Validation", "test_case_severity": "中", "status": "失败", - "message": "当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '20'.", - "duration_seconds": 0.01411516685038805, - "timestamp": "2025-06-05T15:29:09.713617", + "message": "当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '15'.", + "duration_seconds": 0.014310125000065455, + "timestamp": "2025-06-05T18:28:02.895094", "validation_points": [ { "status_code": 200, "response_body": { - "code": 20, - "message": "Ut", - "data": true + "code": 15, + "message": "dolore ex id", + "data": false }, "expected_http_status_codes": [ 400, @@ -411,16 +408,16 @@ "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", "test_case_severity": "中", "status": "失败", - "message": "当请求体字段 'id' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '51'.", - "duration_seconds": 0.015274292090907693, - "timestamp": "2025-06-05T15:29:09.728941", + "message": "当请求体字段 'id' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '9'.", + "duration_seconds": 0.01549425000030169, + "timestamp": "2025-06-05T18:28:02.910733", "validation_points": [ { "status_code": 200, "response_body": { - "code": 51, - "message": "do", - "data": true + "code": 9, + "message": "et ut aliqua aliquip est", + "data": false }, "expected_http_status_codes": [ 400, @@ -437,8 +434,8 @@ "test_case_severity": "高", "status": "通过", "message": "当移除必填请求体字段 'id' 时,API响应了状态码 200 (非主要预期HTTP状态 [400, 422],但为4xx客户端错误), 且响应体中包含预期的业务错误码 '4003' (字段: 'code').", - "duration_seconds": 0.013828707858920097, - "timestamp": "2025-06-05T15:29:09.742818", + "duration_seconds": 0.024402500000178406, + "timestamp": "2025-06-05T18:28:02.935253", "validation_points": [ { "passed": true, @@ -451,16 +448,16 @@ "test_case_name": "Error Code 4003 - Missing Required Query Parameter Validation", "test_case_severity": "高", "status": "失败", - "message": "当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '82'.", - "duration_seconds": 0.017204750096425414, - "timestamp": "2025-06-05T15:29:09.760083", + "message": "当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '76'.", + "duration_seconds": 0.014156124999772146, + "timestamp": "2025-06-05T18:28:02.949465", "validation_points": [ { "status_code": 200, "response_body": { - "code": 82, - "message": "aliqua nulla", - "data": true + "code": 76, + "message": "ut do enim dolore", + "data": false }, "expected_http_status_codes": [ 400, @@ -477,9 +474,9 @@ "endpoint_id": "DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit", "endpoint_name": "地质单元数据删除", "overall_status": "失败", - "duration_seconds": 0.136986, - "start_time": "2025-06-05T15:29:09.760155", - "end_time": "2025-06-05T15:29:09.897141", + "duration_seconds": 0.112281, + "start_time": "2025-06-05T18:28:02.949534", + "end_time": "2025-06-05T18:28:03.061815", "executed_test_cases": [ { "test_case_id": "TC-STATUS-001", @@ -487,8 +484,8 @@ "test_case_severity": "严重", "status": "通过", "message": "响应状态码为 200,符合预期 200。", - "duration_seconds": 0.015094458125531673, - "timestamp": "2025-06-05T15:29:09.775343", + "duration_seconds": 0.014672042000256624, + "timestamp": "2025-06-05T18:28:02.964293", "validation_points": [ { "passed": true, @@ -502,8 +499,8 @@ "test_case_severity": "严重", "status": "通过", "message": "针对 DELETE http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit (状态码 200) 的响应体 conforms to the JSON schema.", - "duration_seconds": 0.02816716697998345, - "timestamp": "2025-06-05T15:29:09.803559", + "duration_seconds": 0.015531999999893742, + "timestamp": "2025-06-05T18:28:02.979966", "validation_points": [ { "passed": true, @@ -517,8 +514,8 @@ "test_case_severity": "严重", "status": "失败", "message": "API通过HTTP (http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit) 响应了成功的状态码 200,这违反了HTTPS强制策略。", - "duration_seconds": 0.027584708062931895, - "timestamp": "2025-06-05T15:29:09.831205", + "duration_seconds": 0.01820933299995886, + "timestamp": "2025-06-05T18:28:02.998377", "validation_points": [ { "status_code": 200 @@ -530,15 +527,15 @@ "test_case_name": "Error Code 4001 - Query Parameter Type Mismatch Validation", "test_case_severity": "中", "status": "失败", - "message": "当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '78'.", - "duration_seconds": 0.016078999964520335, - "timestamp": "2025-06-05T15:29:09.847340", + "message": "当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '72'.", + "duration_seconds": 0.0158099579998634, + "timestamp": "2025-06-05T18:28:03.014238", "validation_points": [ { "status_code": 200, "response_body": { - "code": 78, - "message": "proident", + "code": 72, + "message": "dolor", "data": true }, "expected_http_status_codes": [ @@ -555,16 +552,16 @@ "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", "test_case_severity": "中", "status": "失败", - "message": "当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '51'.", - "duration_seconds": 0.02118941699154675, - "timestamp": "2025-06-05T15:29:09.868578", + "message": "当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '54'.", + "duration_seconds": 0.01756933399974514, + "timestamp": "2025-06-05T18:28:03.031851", "validation_points": [ { "status_code": 200, "response_body": { - "code": 51, - "message": "quis dolor", - "data": true + "code": 54, + "message": "do magna labore aliquip occaecat", + "data": false }, "expected_http_status_codes": [ 400, @@ -581,8 +578,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。", - "duration_seconds": 0.014672042103484273, - "timestamp": "2025-06-05T15:29:09.883302", + "duration_seconds": 0.015553834000002098, + "timestamp": "2025-06-05T18:28:03.047454", "validation_points": [ { "passed": true, @@ -595,16 +592,16 @@ "test_case_name": "Error Code 4003 - Missing Required Query Parameter Validation", "test_case_severity": "高", "status": "失败", - "message": "当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '22'.", - "duration_seconds": 0.013733125058934093, - "timestamp": "2025-06-05T15:29:09.897090", + "message": "当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '52'.", + "duration_seconds": 0.014260082999953738, + "timestamp": "2025-06-05T18:28:03.061774", "validation_points": [ { "status_code": 200, "response_body": { - "code": 22, - "message": "fugiat dolor labore Duis dolore", - "data": true + "code": 52, + "message": "proident dolore", + "data": false }, "expected_http_status_codes": [ 400, @@ -621,9 +618,9 @@ "endpoint_id": "POST /api/dms/{dms_instance_code}/v1/cd_geo_unit", "endpoint_name": "地质单元数据添加", "overall_status": "失败", - "duration_seconds": 0.111981, - "start_time": "2025-06-05T15:29:09.897187", - "end_time": "2025-06-05T15:29:10.009168", + "duration_seconds": 0.115648, + "start_time": "2025-06-05T18:28:03.061845", + "end_time": "2025-06-05T18:28:03.177493", "executed_test_cases": [ { "test_case_id": "TC-STATUS-001", @@ -631,8 +628,8 @@ "test_case_severity": "严重", "status": "通过", "message": "响应状态码为 200,符合预期 200。", - "duration_seconds": 0.015056957956403494, - "timestamp": "2025-06-05T15:29:09.912362", + "duration_seconds": 0.019701709000401024, + "timestamp": "2025-06-05T18:28:03.081631", "validation_points": [ { "passed": true, @@ -646,8 +643,8 @@ "test_case_severity": "严重", "status": "通过", "message": "Schema验证步骤完成(未发现问题,或schema不适用/未为此响应定义)。", - "duration_seconds": 0.01394270802848041, - "timestamp": "2025-06-05T15:29:09.926353", + "duration_seconds": 0.015043874999719264, + "timestamp": "2025-06-05T18:28:03.096731", "validation_points": [ { "passed": true, @@ -661,8 +658,8 @@ "test_case_severity": "严重", "status": "失败", "message": "API通过HTTP (http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit) 响应了成功的状态码 200,这违反了HTTPS强制策略。", - "duration_seconds": 0.017161999829113483, - "timestamp": "2025-06-05T15:29:09.943565", + "duration_seconds": 0.013832790999913414, + "timestamp": "2025-06-05T18:28:03.110617", "validation_points": [ { "status_code": 200 @@ -675,8 +672,8 @@ "test_case_severity": "中", "status": "通过", "message": "跳过测试:在查询参数中未找到合适的字段来测试类型不匹配。", - "duration_seconds": 0.01401041611097753, - "timestamp": "2025-06-05T15:29:09.957628", + "duration_seconds": 0.01415450000013152, + "timestamp": "2025-06-05T18:28:03.124825", "validation_points": [ { "passed": true, @@ -689,16 +686,16 @@ "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", "test_case_severity": "中", "status": "失败", - "message": "当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '56'.", - "duration_seconds": 0.019340540980920196, - "timestamp": "2025-06-05T15:29:09.977016", + "message": "当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '92'.", + "duration_seconds": 0.014235833999919123, + "timestamp": "2025-06-05T18:28:03.139106", "validation_points": [ { "status_code": 200, "response_body": { - "code": 56, - "message": "consequat officia consectetur in", - "data": true + "code": 92, + "message": "tempor ut aliquip", + "data": false }, "expected_http_status_codes": [ 400, @@ -714,16 +711,16 @@ "test_case_name": "Error Code 4003 - Missing Required Request Body Field Validation", "test_case_severity": "高", "status": "失败", - "message": "当移除必填请求体字段 'data.0.bsflag' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '49'.", - "duration_seconds": 0.016694082878530025, - "timestamp": "2025-06-05T15:29:09.993760", + "message": "当移除必填请求体字段 'data.0.bsflag' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '35'.", + "duration_seconds": 0.0178965000000062, + "timestamp": "2025-06-05T18:28:03.157053", "validation_points": [ { "status_code": 200, "response_body": { - "code": 49, - "message": "in voluptate laborum", - "data": true + "code": 35, + "message": "tempor culpa", + "data": false }, "expected_http_status_codes": [ 400, @@ -740,8 +737,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。", - "duration_seconds": 0.015315499855205417, - "timestamp": "2025-06-05T15:29:10.009126", + "duration_seconds": 0.020348958999875322, + "timestamp": "2025-06-05T18:28:03.177452", "validation_points": [ { "passed": true, @@ -755,9 +752,9 @@ "endpoint_id": "GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}", "endpoint_name": "地质单元查询详情", "overall_status": "失败", - "duration_seconds": 0.12987, - "start_time": "2025-06-05T15:29:10.009198", - "end_time": "2025-06-05T15:29:10.139068", + "duration_seconds": 0.107158, + "start_time": "2025-06-05T18:28:03.177523", + "end_time": "2025-06-05T18:28:03.284681", "executed_test_cases": [ { "test_case_id": "TC-STATUS-001", @@ -765,8 +762,8 @@ "test_case_severity": "严重", "status": "通过", "message": "响应状态码为 200,符合预期 200。", - "duration_seconds": 0.015195332933217287, - "timestamp": "2025-06-05T15:29:10.024485", + "duration_seconds": 0.015389000000141095, + "timestamp": "2025-06-05T18:28:03.193006", "validation_points": [ { "passed": true, @@ -780,8 +777,8 @@ "test_case_severity": "严重", "status": "通过", "message": "针对 GET http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id (状态码 200) 的响应体 conforms to the JSON schema.", - "duration_seconds": 0.01739870896562934, - "timestamp": "2025-06-05T15:29:10.041943", + "duration_seconds": 0.014463874999819382, + "timestamp": "2025-06-05T18:28:03.207527", "validation_points": [ { "passed": true, @@ -795,8 +792,8 @@ "test_case_severity": "严重", "status": "失败", "message": "API通过HTTP (http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit/1.0.0/example_id) 响应了成功的状态码 200,这违反了HTTPS强制策略。", - "duration_seconds": 0.014476499985903502, - "timestamp": "2025-06-05T15:29:10.056484", + "duration_seconds": 0.013935000000401487, + "timestamp": "2025-06-05T18:28:03.221518", "validation_points": [ { "status_code": 200 @@ -809,8 +806,8 @@ "test_case_severity": "中", "status": "通过", "message": "跳过测试:在查询参数中未找到合适的字段来测试类型不匹配。", - "duration_seconds": 0.01886437484063208, - "timestamp": "2025-06-05T15:29:10.075414", + "duration_seconds": 0.013823915999637393, + "timestamp": "2025-06-05T18:28:03.235405", "validation_points": [ { "passed": true, @@ -823,21 +820,21 @@ "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", "test_case_severity": "中", "status": "失败", - "message": "当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '6'.", - "duration_seconds": 0.022027499973773956, - "timestamp": "2025-06-05T15:29:10.097493", + "message": "当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '62'.", + "duration_seconds": 0.016287874999761698, + "timestamp": "2025-06-05T18:28:03.251747", "validation_points": [ { "status_code": 200, "response_body": { - "code": 6, - "message": "non", + "code": 62, + "message": "eu magna culpa nisi", "data": { - "total": 19, + "total": 75, "list": [ { - "dsid": "82", - "dataRegion": "Excepteur", + "dsid": "41", + "dataRegion": "culpa mollit sunt", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -860,8 +857,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。", - "duration_seconds": 0.01837579207494855, - "timestamp": "2025-06-05T15:29:10.115927", + "duration_seconds": 0.017963499999950727, + "timestamp": "2025-06-05T18:28:03.269756", "validation_points": [ { "passed": true, @@ -875,8 +872,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。", - "duration_seconds": 0.02302633412182331, - "timestamp": "2025-06-05T15:29:10.139026", + "duration_seconds": 0.014825791000021127, + "timestamp": "2025-06-05T18:28:03.284641", "validation_points": [ { "passed": true, @@ -887,43 +884,39 @@ ] } ], - "stage_stats": { - "total_defined": 1, - "total_executed": 2, - "passed": 0, - "failed": 2, - "skipped": 0, - "success_rate_percentage": "0.00" - }, - "detailed_stage_results": [ + "stage_results": [ { - "stage_id": "keyword_driven_crud_example", - "stage_name": "Keyword-Driven Generic CRUD Stage Example", - "description": "Demonstrates a CRUD (Create, List, Read, Update, Delete) flow. This stage dynamically finds API operations based on a configurable RESOURCE_KEYWORD and predefined action keywords (e.g., '添加', '查询列表'). IMPORTANT: User MUST configure RESOURCE_KEYWORD at the top of this file. Request bodies, response paths in assertions, and 'outputs_to_context' are EXAMPLES based on '井筒API示例_simple.json' and WILL LIKELY NEED MODIFICATION to match your specific API's structure.", - "api_group_name": "公共分类", + "stage_id": "generic_crud_validation_stage", + "stage_name": "Generic CRUD Validation Stage", + "description": "Performs a generic CRUD (Create, List, Read, Update, Delete) flow. It tries to dynamically discover API operations based on common keywords and HTTP methods. Field names for IDs, names, features, and JSON paths for list/detail objects are configurable via class attributes or can be set in `before_stage` based on `api_group_name`.", + "api_group_name": "地质单元", + "tags": [ + "crud", + "generic_validation" + ], "overall_status": "失败", "duration_seconds": "0.03", - "start_time": "2025-06-05T15:29:10", - "end_time": "2025-06-05T15:29:10", - "message": "Stage aborted due to failure in step 'List and Find Created 地质单元'.", + "start_time": "2025-06-05T18:28:03", + "end_time": "2025-06-05T18:28:03", + "message": "测试阶段因步骤 'List and Find Created Resource' 的状态 (失败) 而中止.", "executed_steps_count": 2, "executed_steps": [ { - "step_name": "Add New 地质单元", + "step_name": "Create New Resource", "description": null, "lookup_key": "地质单元数据添加", "resolved_endpoint": "POST /api/dms/{dms_instance_code}/v1/cd_geo_unit", "status": "通过", "message": "", "duration_seconds": "0.0000", - "timestamp": "2025-06-05T15:29:10+0800", + "timestamp": "2025-06-05T18:28:03+0800", "validation_points": [ { "passed": true, - "message": "Status code matched (200)." + "message": "状态码匹配 (200)." } ], - "api_call_curl": null, + "api_call_curl": "N/A", "request_details": { "method": "POST", "url": "http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit", @@ -938,10 +931,8 @@ "version": "1.0.0", "data": [ { - "bsflag": 0, - "wellCommonName": "Test_地质单元_1749108550_93ddd2", - "wellId": "ExampleWellID_1749108550", - "dataRegion": "TEST_REGION" + "wellCommonName": "TestResource_1749119283_3c0f3c", + "dataRegion": "Feature_1749119283" } ] }, @@ -949,10 +940,8 @@ "version": "1.0.0", "data": [ { - "bsflag": 0, - "wellCommonName": "Test_地质单元_1749108550_93ddd2", - "wellId": "ExampleWellID_1749108550", - "dataRegion": "TEST_REGION" + "wellCommonName": "TestResource_1749119283_3c0f3c", + "dataRegion": "Feature_1749119283" } ] }, @@ -961,32 +950,42 @@ }, "extracted_outputs": {}, "context_after_step_summary": { - "unique_resource_name": "Test_地质单元_1749108550_93ddd2", - "updated_resource_name": "Test_地质单元_1749108550_93ddd2_UPDATED", + "unique_resource_name": "TestResource_1749119283_3c0f3c", + "updated_resource_name": "TestResource_1749119283_3c0f3c_UPDATED", + "unique_feature_value": "Feature_1749119283", + "updated_feature_value": "Feature_1749119283_UPDATED", + "cfg_list_path_in_listresponse": "data.list", + "cfg_name_field_in_listitem": "wellCommonName", + "cfg_id_field_in_listitem": "dsid", + "cfg_resource_object_path_in_detailresponse": "data.list.0", + "cfg_name_field_in_detailresponse": "wellCommonName", + "cfg_id_field_in_detailresponse": "dsid", + "cfg_resource_object_path_in_updateresponse": "data.list.0", + "cfg_feature_field_name_for_validation": "dataRegion", "dms_instance_code": "your_dms_instance_code", "api_version": "1.0.0" } }, { - "step_name": "List and Find Created 地质单元", + "step_name": "List and Find Created Resource", "description": null, "lookup_key": "地质单元列表查询", "resolved_endpoint": "POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}", "status": "失败", - "message": "Assertion 'find_and_extract_id_by_name' failed: 在列表响应中未找到名称为 'Test_地质单元_1749108550_93ddd2' (字段: wellCommonName) 的资源。.", + "message": "Resource not found: Name 'TestResource_1749119283_3c0f3c' (field: wellCommonName) not found in list at path 'data.list'.", "duration_seconds": "0.0000", - "timestamp": "2025-06-05T15:29:10+0800", + "timestamp": "2025-06-05T18:28:03+0800", "validation_points": [ { "passed": true, - "message": "Status code matched (200)." + "message": "状态码匹配 (200)." }, { "passed": false, - "message": "在列表响应中未找到名称为 'Test_地质单元_1749108550_93ddd2' (字段: wellCommonName) 的资源。" + "message": "Resource not found: Name 'TestResource_1749119283_3c0f3c' (field: wellCommonName) not found in list at path 'data.list'." } ], - "api_call_curl": null, + "api_call_curl": "N/A", "request_details": { "method": "POST", "url": "http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0", @@ -1005,13 +1004,14 @@ "query": { "fields": [ "dsid", - "wellCommonName" + "wellCommonName", + "dataRegion" ], "filter": { "key": "wellCommonName", "symbol": "=", "realValue": [ - "Test_地质单元_1749108550_93ddd2" + "TestResource_1749119283_3c0f3c" ] } } @@ -1021,13 +1021,14 @@ "query": { "fields": [ "dsid", - "wellCommonName" + "wellCommonName", + "dataRegion" ], "filter": { "key": "wellCommonName", "symbol": "=", "realValue": [ - "Test_地质单元_1749108550_93ddd2" + "TestResource_1749119283_3c0f3c" ] } } @@ -1037,174 +1038,40 @@ }, "extracted_outputs": {}, "context_after_step_summary": { - "unique_resource_name": "Test_地质单元_1749108550_93ddd2", - "updated_resource_name": "Test_地质单元_1749108550_93ddd2_UPDATED", + "unique_resource_name": "TestResource_1749119283_3c0f3c", + "updated_resource_name": "TestResource_1749119283_3c0f3c_UPDATED", + "unique_feature_value": "Feature_1749119283", + "updated_feature_value": "Feature_1749119283_UPDATED", + "cfg_list_path_in_listresponse": "data.list", + "cfg_name_field_in_listitem": "wellCommonName", + "cfg_id_field_in_listitem": "dsid", + "cfg_resource_object_path_in_detailresponse": "data.list.0", + "cfg_name_field_in_detailresponse": "wellCommonName", + "cfg_id_field_in_detailresponse": "dsid", + "cfg_resource_object_path_in_updateresponse": "data.list.0", + "cfg_feature_field_name_for_validation": "dataRegion", "dms_instance_code": "your_dms_instance_code", "api_version": "1.0.0" } } ], "final_stage_context_summary": { - "unique_resource_name": "Test_地质单元_1749108550_93ddd2", - "updated_resource_name": "Test_地质单元_1749108550_93ddd2_UPDATED", - "dms_instance_code": "your_dms_instance_code", - "api_version": "1.0.0" - } - }, - { - "stage_id": "keyword_driven_crud_example", - "stage_name": "Keyword-Driven Generic CRUD Stage Example", - "description": "Demonstrates a CRUD (Create, List, Read, Update, Delete) flow. This stage dynamically finds API operations based on a configurable RESOURCE_KEYWORD and predefined action keywords (e.g., '添加', '查询列表'). IMPORTANT: User MUST configure RESOURCE_KEYWORD at the top of this file. Request bodies, response paths in assertions, and 'outputs_to_context' are EXAMPLES based on '井筒API示例_simple.json' and WILL LIKELY NEED MODIFICATION to match your specific API's structure.", - "api_group_name": "地质单元", - "overall_status": "失败", - "duration_seconds": "0.04", - "start_time": "2025-06-05T15:29:10", - "end_time": "2025-06-05T15:29:10", - "message": "Stage aborted due to failure in step 'List and Find Created 地质单元'.", - "executed_steps_count": 2, - "executed_steps": [ - { - "step_name": "Add New 地质单元", - "description": null, - "lookup_key": "地质单元数据添加", - "resolved_endpoint": "POST /api/dms/{dms_instance_code}/v1/cd_geo_unit", - "status": "通过", - "message": "", - "duration_seconds": "0.0000", - "timestamp": "2025-06-05T15:29:10+0800", - "validation_points": [ - { - "passed": true, - "message": "Status code matched (200)." - } - ], - "api_call_curl": null, - "request_details": { - "method": "POST", - "url": "http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit", - "headers": { - "tenant-id": "your-tenant-id", - "Content-Type": "application/json", - "Accept": "application/json", - "Authorization": "Bearer your-test-token" - }, - "params": {}, - "json_data": { - "version": "1.0.0", - "data": [ - { - "bsflag": 0, - "wellCommonName": "Test_地质单元_1749108550_4a265e", - "wellId": "ExampleWellID_1749108550", - "dataRegion": "TEST_REGION" - } - ] - }, - "body": { - "version": "1.0.0", - "data": [ - { - "bsflag": 0, - "wellCommonName": "Test_地质单元_1749108550_4a265e", - "wellId": "ExampleWellID_1749108550", - "dataRegion": "TEST_REGION" - } - ] - }, - "data": null, - "timeout": 30 - }, - "extracted_outputs": {}, - "context_after_step_summary": { - "unique_resource_name": "Test_地质单元_1749108550_4a265e", - "updated_resource_name": "Test_地质单元_1749108550_4a265e_UPDATED", - "dms_instance_code": "your_dms_instance_code", - "api_version": "1.0.0" - } - }, - { - "step_name": "List and Find Created 地质单元", - "description": null, - "lookup_key": "地质单元列表查询", - "resolved_endpoint": "POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}", - "status": "失败", - "message": "Assertion 'find_and_extract_id_by_name' failed: 在列表响应中未找到名称为 'Test_地质单元_1749108550_4a265e' (字段: wellCommonName) 的资源。.", - "duration_seconds": "0.0000", - "timestamp": "2025-06-05T15:29:10+0800", - "validation_points": [ - { - "passed": true, - "message": "Status code matched (200)." - }, - { - "passed": false, - "message": "在列表响应中未找到名称为 'Test_地质单元_1749108550_4a265e' (字段: wellCommonName) 的资源。" - } - ], - "api_call_curl": null, - "request_details": { - "method": "POST", - "url": "http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/your_dms_instance_code/v1/cd_geo_unit/1.0.0", - "headers": { - "tenant-id": "your-tenant-id", - "Content-Type": "application/json", - "Accept": "application/json", - "Authorization": "Bearer your-test-token" - }, - "params": { - "pageNo": 1, - "pageSize": 10 - }, - "json_data": { - "isSearchCount": true, - "query": { - "fields": [ - "dsid", - "wellCommonName" - ], - "filter": { - "key": "wellCommonName", - "symbol": "=", - "realValue": [ - "Test_地质单元_1749108550_4a265e" - ] - } - } - }, - "body": { - "isSearchCount": true, - "query": { - "fields": [ - "dsid", - "wellCommonName" - ], - "filter": { - "key": "wellCommonName", - "symbol": "=", - "realValue": [ - "Test_地质单元_1749108550_4a265e" - ] - } - } - }, - "data": null, - "timeout": 30 - }, - "extracted_outputs": {}, - "context_after_step_summary": { - "unique_resource_name": "Test_地质单元_1749108550_4a265e", - "updated_resource_name": "Test_地质单元_1749108550_4a265e_UPDATED", - "dms_instance_code": "your_dms_instance_code", - "api_version": "1.0.0" - } - } - ], - "final_stage_context_summary": { - "unique_resource_name": "Test_地质单元_1749108550_4a265e", - "updated_resource_name": "Test_地质单元_1749108550_4a265e_UPDATED", + "unique_resource_name": "TestResource_1749119283_3c0f3c", + "updated_resource_name": "TestResource_1749119283_3c0f3c_UPDATED", + "unique_feature_value": "Feature_1749119283", + "updated_feature_value": "Feature_1749119283_UPDATED", + "cfg_list_path_in_listresponse": "data.list", + "cfg_name_field_in_listitem": "wellCommonName", + "cfg_id_field_in_listitem": "dsid", + "cfg_resource_object_path_in_detailresponse": "data.list.0", + "cfg_name_field_in_detailresponse": "wellCommonName", + "cfg_id_field_in_detailresponse": "dsid", + "cfg_resource_object_path_in_updateresponse": "data.list.0", + "cfg_feature_field_name_for_validation": "dataRegion", "dms_instance_code": "your_dms_instance_code", "api_version": "1.0.0" } } - ] + ], + "api_call_details_summary": [] } \ No newline at end of file