From 7333cc8a2aee590af2727109ca3ed53cabef5596 Mon Sep 17 00:00:00 2001 From: gongwenxin Date: Thu, 5 Jun 2025 15:17:51 +0800 Subject: [PATCH] step half finish --- .DS_Store | Bin 8196 -> 8196 bytes Makefile | 8 + __pycache__/run_tests.cpython-312.pyc | Bin 4194 -> 0 bytes api_call_details.md | 2957 +++++++-------- .../__pycache__/paddleocr.cpython-312.pyc | Bin 5759 -> 0 bytes .../keyword_driven_crud_stage.cpython-312.pyc | Bin 0 -> 20745 bytes custom_stages/keyword_driven_crud_stage.py | 432 +++ .../__pycache__/basic_checks.cpython-312.pyc | Bin 3449 -> 3376 bytes custom_testcases/basic_checks.py | 2 +- ...g_required_field_body_case.cpython-312.pyc | Bin 9096 -> 9096 bytes ...issing_required_field_case.cpython-312.pyc | Bin 13258 -> 0 bytes ..._required_field_query_case.cpython-312.pyc | Bin 8921 -> 8921 bytes .../type_mismatch_body_case.cpython-312.pyc | Bin 11174 -> 11174 bytes .../type_mismatch_case.cpython-312.pyc | Bin 14831 -> 0 bytes ..._mismatch_query_param_case.cpython-312.pyc | Bin 11417 -> 11417 bytes .../http_method_usage_case.cpython-312.pyc | Bin 499 -> 499 bytes .../https_mandatory_case.cpython-312.pyc | Bin 6750 -> 6750 bytes .../__pycache__/api_test_cli.cpython-312.pyc | Bin 6314 -> 0 bytes .../api_test_generator.cpython-312.pyc | Bin 22216 -> 0 bytes .../__pycache__/llm_service.cpython-312.pyc | Bin 12372 -> 0 bytes .../scenario_framework.cpython-312.pyc | Bin 0 -> 16595 bytes .../scenario_registry.cpython-312.pyc | Bin 0 -> 7387 bytes .../stage_framework.cpython-312.pyc | Bin 0 -> 30858 bytes .../stage_registry.cpython-312.pyc | Bin 0 -> 10272 bytes .../test_case_registry.cpython-312.pyc | Bin 15324 -> 15391 bytes .../test_framework_core.cpython-312.pyc | Bin 29191 -> 29505 bytes .../test_orchestrator.cpython-312.pyc | Bin 108287 -> 155817 bytes .../__pycache__/parser.cpython-312.pyc | Bin 26570 -> 26570 bytes .../__pycache__/config_models.cpython-312.pyc | Bin 3264 -> 0 bytes .../__pycache__/test_models.cpython-312.pyc | Bin 9344 -> 0 bytes ddms_compliance_suite/scenario_framework.py | 228 ++ ddms_compliance_suite/scenario_registry.py | 90 + ddms_compliance_suite/stage_framework.py | 454 +++ ddms_compliance_suite/stage_registry.py | 123 + ddms_compliance_suite/test_framework_core.py | 8 + ddms_compliance_suite/test_orchestrator.py | 845 ++++- flask_app.py | 219 ++ log.txt | 3020 +-------------- log_stage.txt | 2660 +++++++++++++ .../__pycache__/basic_checks.cpython-312.pyc | Bin 3376 -> 0 bytes .../schema_validation_case.cpython-312.pyc | Bin 6229 -> 0 bytes ...g_required_field_body_case.cpython-312.pyc | Bin 9096 -> 0 bytes ...issing_required_field_case.cpython-312.pyc | Bin 13258 -> 0 bytes ..._required_field_query_case.cpython-312.pyc | Bin 8921 -> 0 bytes .../type_mismatch_body_case.cpython-312.pyc | Bin 11174 -> 0 bytes .../type_mismatch_case.cpython-312.pyc | Bin 14831 -> 0 bytes ..._mismatch_query_param_case.cpython-312.pyc | Bin 11417 -> 0 bytes .../http_method_usage_case.cpython-312.pyc | Bin 499 -> 0 bytes .../url_llm_checks.cpython-312.pyc | Bin 204 -> 0 bytes .../https_mandatory_case.cpython-312.pyc | Bin 6750 -> 0 bytes ...asic_api_sanity_check_case.cpython-312.pyc | Bin 196 -> 0 bytes run_api_tests.py | 56 +- static/index.html | 96 + static/script.js | 140 + static/style.css | 161 + test_report.json | 349 +- test_reports/api_call_details.md | 3351 +++++++++++++++++ test_reports/summary.json | 940 +++++ 58 files changed, 11351 insertions(+), 4788 deletions(-) delete mode 100644 __pycache__/run_tests.cpython-312.pyc delete mode 100644 assets/images/__pycache__/paddleocr.cpython-312.pyc create mode 100644 custom_stages/__pycache__/keyword_driven_crud_stage.cpython-312.pyc create mode 100644 custom_stages/keyword_driven_crud_stage.py delete mode 100644 custom_testcases/compliance_catalog/error_handling/__pycache__/missing_required_field_case.cpython-312.pyc delete mode 100644 custom_testcases/compliance_catalog/error_handling/__pycache__/type_mismatch_case.cpython-312.pyc delete mode 100644 ddms_compliance_suite/__pycache__/api_test_cli.cpython-312.pyc delete mode 100644 ddms_compliance_suite/__pycache__/api_test_generator.cpython-312.pyc delete mode 100644 ddms_compliance_suite/__pycache__/llm_service.cpython-312.pyc create mode 100644 ddms_compliance_suite/__pycache__/scenario_framework.cpython-312.pyc create mode 100644 ddms_compliance_suite/__pycache__/scenario_registry.cpython-312.pyc create mode 100644 ddms_compliance_suite/__pycache__/stage_framework.cpython-312.pyc create mode 100644 ddms_compliance_suite/__pycache__/stage_registry.cpython-312.pyc delete mode 100644 ddms_compliance_suite/models/__pycache__/config_models.cpython-312.pyc delete mode 100644 ddms_compliance_suite/models/__pycache__/test_models.cpython-312.pyc create mode 100644 ddms_compliance_suite/scenario_framework.py create mode 100644 ddms_compliance_suite/scenario_registry.py create mode 100644 ddms_compliance_suite/stage_framework.py create mode 100644 ddms_compliance_suite/stage_registry.py create mode 100644 flask_app.py create mode 100644 log_stage.txt delete mode 100644 mvp/custom_testcases/__pycache__/basic_checks.cpython-312.pyc delete mode 100644 mvp/custom_testcases/compliance_catalog/core_functionality/__pycache__/schema_validation_case.cpython-312.pyc delete mode 100644 mvp/custom_testcases/compliance_catalog/error_handling/__pycache__/missing_required_field_body_case.cpython-312.pyc delete mode 100644 mvp/custom_testcases/compliance_catalog/error_handling/__pycache__/missing_required_field_case.cpython-312.pyc delete mode 100644 mvp/custom_testcases/compliance_catalog/error_handling/__pycache__/missing_required_field_query_case.cpython-312.pyc delete mode 100644 mvp/custom_testcases/compliance_catalog/error_handling/__pycache__/type_mismatch_body_case.cpython-312.pyc delete mode 100644 mvp/custom_testcases/compliance_catalog/error_handling/__pycache__/type_mismatch_case.cpython-312.pyc delete mode 100644 mvp/custom_testcases/compliance_catalog/error_handling/__pycache__/type_mismatch_query_param_case.cpython-312.pyc delete mode 100644 mvp/custom_testcases/compliance_catalog/normative_spec/__pycache__/http_method_usage_case.cpython-312.pyc delete mode 100644 mvp/custom_testcases/compliance_catalog/normative_spec/__pycache__/url_llm_checks.cpython-312.pyc delete mode 100644 mvp/custom_testcases/compliance_catalog/security/__pycache__/https_mandatory_case.cpython-312.pyc delete mode 100644 mvp/custom_testcases/setup_checks/__pycache__/basic_api_sanity_check_case.cpython-312.pyc create mode 100644 static/index.html create mode 100644 static/script.js create mode 100644 static/style.css create mode 100644 test_reports/api_call_details.md create mode 100644 test_reports/summary.json diff --git a/.DS_Store b/.DS_Store index 1e5357056c6ad04f9347766660102547fb48a347..8db86f228b979532a5ffa0345ae4424909e577ab 100644 GIT binary patch delta 146 zcmZp1XmOa}&nUbxU^hRb@Ma!?PprIb48;s342eLT$&fsGfk1<>iK(TIf}y2Zt&T#q frICS-f{Ep1Ls1h{m7Cv-YA|kQm-tSJ395_$tWG2< delta 40 qcmZp1XmOa}&nUPtU^hRb;AS3yPpq5YiAgd}Z1}L5UE({8^A-Ronh%Ts diff --git a/Makefile b/Makefile index 11ecced..89547b7 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,14 @@ run: python run_api_tests.py --base-url http://127.0.0.1:4523/m1/6389742-6086420-default --yapi assets/doc/井筒API示例_simple.json --custom-test-cases-dir ./custom_testcases --verbose --output test_report.json >log.txt 2>&1 +run_stages: + python run_api_tests.py \ + --base-url http://127.0.0.1:4523/m1/6389742-6086420-default \ + --yapi ./assets/doc/井筒API示例_simple.json \ + --stages-dir ./custom_stages \ + --custom-test-cases-dir ./custom_testcases \ + -v \ + -o ./test_reports/ >log_stage.txt 2>&1 docker_build_redhat: docker run --platform linux/amd64 --rm -v "$(pwd)":/app -w /app registry.access.redhat.com/ubi8/python-39 sh -c "pip3 install --no-cache-dir -r requirements.txt || true && pip3 install --no-cache-dir pyinstaller && pyinstaller --onefile --noconfirm run_api_tests.py && ./dist/run_api_tests --base-url http://host.docker.internal:4523 > ./dist/output.txt 2>&1 && chown -R $(id -u):$(id -g) dist build run_api_tests.spec || true" diff --git a/__pycache__/run_tests.cpython-312.pyc b/__pycache__/run_tests.cpython-312.pyc deleted file mode 100644 index d25e049b0ee11bebfe54ba3f95275629a3fe1ea4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4194 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 diff --git a/api_call_details.md b/api_call_details.md index 5650306..a377562 100644 --- a/api_call_details.md +++ b/api_call_details.md @@ -1,7 +1,7 @@ ## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` **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: 480' -d '{"isSearchCount": true, "query": {"dataRegions": ["JD", "DG"], "fields": ["field1", "field2"], "filter": {"key": "conditionKey", "logic": "AND", "realValue": [{"value1": "example"}], "subFilter": ["subCondition1", "subCondition2"], "symbol": "="}, "groupFields": ["groupField1"], "groupFilter": {"key": "groupConditionKey", "logic": "OR", "realValue": [{"value1": "exampleGroup"}], "subFilter": ["subGroupCondition1"], "symbol": ">"}, "sort": {"field1": "ASC", "field2": "DESC"}}}' --insecure http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version +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 ``` ### Request Details - **Method:** `POST` @@ -20,62 +20,54 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, "isSearchCount": true, "query": { "dataRegions": [ - "JD", - "DG" + "example_string" ], "fields": [ - "field1", - "field2" + "example_string" ], "filter": { - "key": "conditionKey", - "logic": "AND", + "key": "example_string", + "logic": "example_string", "realValue": [ - { - "value1": "example" - } + {} ], + "singleValue": {}, "subFilter": [ - "subCondition1", - "subCondition2" + "example_string" ], - "symbol": "=" + "symbol": "example_string" }, "groupFields": [ - "groupField1" + "example_string" ], "groupFilter": { - "key": "groupConditionKey", - "logic": "OR", + "key": "example_string", + "logic": "example_string", "realValue": [ - { - "value1": "exampleGroup" - } + {} ], + "singleValue": {}, "subFilter": [ - "subGroupCondition1" + "example_string" ], - "symbol": ">" + "symbol": "example_string" }, - "sort": { - "field1": "ASC", - "field2": "DESC" - } + "sort": {} } } ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0540s` +- **Elapsed Time:** `0.2650s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "187", + "Content-Length": "389", "success": "false", - "Date": "Sat, 31 May 2025 16:34:09 GMT", + "Date": "Thu, 05 Jun 2025 05:18:23 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -83,14 +75,28 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 6, - "message": "dolore irure commodo aliquip", + "code": 24, + "message": "esse eu", "data": { - "total": 90, + "total": 41, "list": [ + { + "dsid": "95", + "dataRegion": "Duis", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "67", + "dataRegion": "laborum in", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, { "dsid": "61", - "dataRegion": "labore mollit", + "dataRegion": "occaecat quis nulla reprehenderit", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -161,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.0394s` +- **Elapsed Time:** `0.0583s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "380", + "Content-Length": "261", "success": "false", - "Date": "Sat, 31 May 2025 16:34:09 GMT", + "Date": "Thu, 05 Jun 2025 05:18:23 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -178,123 +184,21 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 43, - "message": "dolor", + "code": 55, + "message": "nulla", "data": { - "total": 58, - "list": [ - { - "dsid": "27", - "dataRegion": "in", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "17", - "dataRegion": "nisi", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "23", - "dataRegion": "laboris anim nulla velit voluptate", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - } - ] - } -} - ``` - ---- -## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` -**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/message/push/example_schema/example_version -``` -### Request Details -- **Method:** `POST` -- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` -- **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.0359s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "195", - "success": "false", - "Date": "Sat, 31 May 2025 16:34:09 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 64, - "message": "aute non cupidatat sint", - "data": { - "total": 52, + "total": 66, "list": [ { "dsid": "53", - "dataRegion": "dolor Excepteur aliqua id", + "dataRegion": "exercitation", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "57", + "dataRegion": "qui", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -365,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.0243s` +- **Elapsed Time:** `0.0245s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "435", + "Content-Length": "174", "success": "false", - "Date": "Sat, 31 May 2025 16:34:09 GMT", + "Date": "Thu, 05 Jun 2025 05:18:23 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -382,28 +286,116 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 10, - "message": "Lorem mollit proident dolore ipsum", + "code": 22, + "message": "velit", "data": { - "total": 83, + "total": 48, "list": [ { - "dsid": "58", - "dataRegion": "commodo culpa", + "dsid": "59", + "dataRegion": "veniam eu ea esse enim", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +**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/message/push/example_schema/example_version +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +- **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.0295s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "287", + "success": "false", + "Date": "Thu, 05 Jun 2025 05:18:23 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 76, + "message": "dolore eiusmod anim", + "data": { + "total": 10, + "list": [ + { + "dsid": "15", + "dataRegion": "sint nostrud", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { - "dsid": "53", - "dataRegion": "occaecat sit dolore id aute", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "41", - "dataRegion": "fugiat commodo minim Lorem", + "dsid": "89", + "dataRegion": "sed dolore anim", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -474,16 +466,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0252s` +- **Elapsed Time:** `0.0378s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "390", + "Content-Length": "292", "success": "false", - "Date": "Sat, 31 May 2025 16:34:09 GMT", + "Date": "Thu, 05 Jun 2025 05:18:23 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -491,28 +483,334 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 84, - "message": "ea", + "code": 94, + "message": "irure nulla fugiat sit", "data": { - "total": 90, + "total": 86, "list": [ { "dsid": "39", - "dataRegion": "Duis nostrud", + "dataRegion": "qui sed in", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { - "dsid": "23", - "dataRegion": "culpa ea enim et non", + "dsid": "87", + "dataRegion": "deserunt aute irure", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +**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/message/push/example_schema/example_version +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +- **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.0165s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "276", + "success": "false", + "Date": "Thu, 05 Jun 2025 05:18:23 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 4, + "message": "ipsum exercitation ex", + "data": { + "total": 66, + "list": [ + { + "dsid": "97", + "dataRegion": "elit est sed", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "67", + "dataRegion": "non", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +**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/message/push/example_schema/example_version +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +- **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.0176s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "197", + "success": "false", + "Date": "Thu, 05 Jun 2025 05:18:23 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 89, + "message": "elit cupidatat adipisicing", + "data": { + "total": 90, + "list": [ + { + "dsid": "52", + "dataRegion": "culpa aliqua ex nulla in", + "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.0213s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "369", + "success": "false", + "Date": "Thu, 05 Jun 2025 05:18:23 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 67, + "message": "ea", + "data": { + "total": 51, + "list": [ + { + "dsid": "26", + "dataRegion": "occaecat in", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { "dsid": "50", - "dataRegion": "nisi eu nostrud culpa", + "dataRegion": "ipsum sunt", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "44", + "dataRegion": "ipsum minim", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -523,14 +821,14 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` --- -## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +## `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/message/push/example_schema/example_version +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/message/push/example_schema/example_version` +- **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 { @@ -539,6 +837,13 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, "Accept": "application/json" } ``` +- **Query Parameters:** +```json +{ + "pageNo": "query_val_pageNo", + "pageSize": "query_val_pageSize" +} + ``` - **Body:** ```json { @@ -583,16 +888,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0242s` +- **Elapsed Time:** `0.0160s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "170", + "Content-Length": "289", "success": "false", - "Date": "Sat, 31 May 2025 16:34:09 GMT", + "Date": "Thu, 05 Jun 2025 05:18:23 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -600,472 +905,123 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 62, - "message": "eiusmod do", + "code": 86, + "message": "dolore et", + "data": { + "total": 19, + "list": [ + { + "dsid": "48", + "dataRegion": "non enim", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "33", + "dataRegion": "Duis anim sit cupidatat nostrud", + "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.0187s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "197", + "success": "false", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 53, + "message": "labore ut laborum", "data": { "total": 32, "list": [ { - "dsid": "99", - "dataRegion": "est dolore ex", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - } - ] - } -} - ``` - ---- -## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` -**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/message/push/example_schema/example_version -``` -### Request Details -- **Method:** `POST` -- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` -- **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.0304s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "389", - "success": "false", - "Date": "Sat, 31 May 2025 16:34:10 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 35, - "message": "do consectetur non Lorem", - "data": { - "total": 70, - "list": [ - { - "dsid": "55", - "dataRegion": "in culpa fugiat sed", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "91", - "dataRegion": "quis esse", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "89", - "dataRegion": "id", - "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: 487' -d '{"isSearchCount": true, "query": {"dataRegions": ["JD", "DG"], "fields": ["field1", "field2"], "filter": {"key": "conditionKey", "logic": "AND", "realValue": [{"valueKey": "value1"}], "subFilter": ["subCondition1", "subCondition2"], "symbol": "="}, "groupFields": ["groupField1"], "groupFilter": {"key": "groupConditionKey", "logic": "OR", "realValue": [{"groupValueKey": "groupValue1"}], "subFilter": ["groupSubCondition1"], "symbol": ">"}, "sort": {"field1": "ASC", "field2": "DESC"}}}' --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": [ - "JD", - "DG" - ], - "fields": [ - "field1", - "field2" - ], - "filter": { - "key": "conditionKey", - "logic": "AND", - "realValue": [ - { - "valueKey": "value1" - } - ], - "subFilter": [ - "subCondition1", - "subCondition2" - ], - "symbol": "=" - }, - "groupFields": [ - "groupField1" - ], - "groupFilter": { - "key": "groupConditionKey", - "logic": "OR", - "realValue": [ - { - "groupValueKey": "groupValue1" - } - ], - "subFilter": [ - "groupSubCondition1" - ], - "symbol": ">" - }, - "sort": { - "field1": "ASC", - "field2": "DESC" - } - } -} - ``` -### Response Details -- **Status Code:** `200` -- **Elapsed Time:** `0.0457s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "370", - "success": "false", - "Date": "Sat, 31 May 2025 16:34:21 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 24, - "message": "dolore nisi", - "data": { - "total": 63, - "list": [ - { - "dsid": "93", - "dataRegion": "Duis velit", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "47", - "dataRegion": "enim", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "12", - "dataRegion": "incididunt", - "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.0246s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "385", - "success": "false", - "Date": "Sat, 31 May 2025 16:34:21 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 31, - "message": "et", - "data": { - "total": 30, - "list": [ - { - "dsid": "15", - "dataRegion": "aliquip dolore irure ea qui", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "69", - "dataRegion": "cillum enim sunt", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "14", - "dataRegion": "magna", - "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.0235s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "309", - "success": "false", - "Date": "Sat, 31 May 2025 16:34:21 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 10, - "message": "consectetur laboris aute ut esse", - "data": { - "total": 16, - "list": [ - { - "dsid": "20", - "dataRegion": "officia do occaecat laboris mollit", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "14", - "dataRegion": "ea", + "dsid": "22", + "dataRegion": "reprehenderit minim commodo dolor", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -1143,16 +1099,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0272s` +- **Elapsed Time:** `0.0165s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "327", + "Content-Length": "282", "success": "false", - "Date": "Sat, 31 May 2025 16:34:21 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1160,21 +1116,21 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 61, - "message": "dolore ad magna labore", + "code": 53, + "message": "velit sed", "data": { - "total": 17, + "total": 28, "list": [ { - "dsid": "76", - "dataRegion": "commodo dolor pariatur laborum reprehenderit", + "dsid": "77", + "dataRegion": "deserunt", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { - "dsid": "3", - "dataRegion": "ut commodo in ea enim", + "dsid": "43", + "dataRegion": "quis anim ea pariatur in", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -1252,16 +1208,125 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0231s` +- **Elapsed Time:** `0.0208s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "188", + "Content-Length": "319", "success": "false", - "Date": "Sat, 31 May 2025 16:34:21 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 36, + "message": "in voluptate commodo", + "data": { + "total": 37, + "list": [ + { + "dsid": "59", + "dataRegion": "amet occaecat deserunt ex pariatur", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "20", + "dataRegion": "aute officia deserunt in", + "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.0153s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "174", + "success": "false", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1270,13 +1335,13 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ```json { "code": 16, - "message": "nostrud proident enim laborum culpa", + "message": "laboris", "data": { - "total": 63, + "total": 87, "list": [ { - "dsid": "66", - "dataRegion": "sit ad", + "dsid": "65", + "dataRegion": "ex ut laboris veniam", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -1354,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.0227s` +- **Elapsed Time:** `0.0183s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "279", + "Content-Length": "325", "success": "false", - "Date": "Sat, 31 May 2025 16:34:21 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1371,130 +1436,21 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 83, - "message": "adipisicing reprehenderit", + "code": 39, + "message": "sed dolor incididunt tempor do", "data": { - "total": 72, + "total": 28, "list": [ { - "dsid": "22", - "dataRegion": "pariatur", + "dsid": "45", + "dataRegion": "est velit Lorem aliqua nostrud", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { - "dsid": "73", - "dataRegion": "magna", - "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.0230s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "331", - "success": "false", - "Date": "Sat, 31 May 2025 16:34:21 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 54, - "message": "exercitation culpa id non deserunt", - "data": { - "total": 79, - "list": [ - { - "dsid": "23", - "dataRegion": "non qui nostrud ad", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "92", - "dataRegion": "cupidatat adipisicing ut laboris minim", + "dsid": "42", + "dataRegion": "incididunt magna do nisi", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -1508,7 +1464,7 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ## `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: 33' -d '{"id": "12345", "version": "1.0"}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid' +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` @@ -1530,22 +1486,22 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "id": "12345", - "version": "1.0" + "id": "example_string", + "version": "example_string" } ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0469s` +- **Elapsed Time:** `0.0257s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "56", + "Content-Length": "49", "success": "false", - "Date": "Sat, 31 May 2025 16:34:22 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1553,8 +1509,63 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 42, - "message": "mollit fugiat labore", + "code": 1, + "message": "commodo irure", + "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.0215s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "39", + "success": "false", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 9, + "message": "sunt", "data": true } ``` @@ -1591,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.0251s` +- **Elapsed Time:** `0.0163s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "63", + "Content-Length": "56", "success": "false", - "Date": "Sat, 31 May 2025 16:34:22 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1608,63 +1619,8 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 76, - "message": "Lorem incididunt Excepteur", - "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.0235s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "64", - "success": "false", - "Date": "Sat, 31 May 2025 16:34:22 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 9, - "message": "ad in incididunt cillum nisi", + "code": 17, + "message": "dolore dolor fugiat", "data": false } ``` @@ -1701,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.0210s` +- **Elapsed Time:** `0.0186s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "56", + "Content-Length": "57", "success": "false", - "Date": "Sat, 31 May 2025 16:34:22 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1718,9 +1674,9 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 50, - "message": "nulla dolore cillum", - "data": false + "code": 75, + "message": "dolore sit minim sint", + "data": true } ``` @@ -1756,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.0290s` +- **Elapsed Time:** `0.0157s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "39", + "Content-Length": "56", "success": "false", - "Date": "Sat, 31 May 2025 16:34:22 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1773,9 +1729,9 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 17, - "message": "in", - "data": false + "code": 33, + "message": "sit non esse ad enim", + "data": true } ``` @@ -1810,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.0218s` +- **Elapsed Time:** `0.0180s` - **Headers:** ```json { @@ -1819,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": "Sat, 31 May 2025 16:34:22 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1857,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.0202s` +- **Elapsed Time:** `0.0187s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "50", + "Content-Length": "75", "success": "false", - "Date": "Sat, 31 May 2025 16:34:23 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1874,8 +1830,8 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 47, - "message": "irure laborum", + "code": 69, + "message": "exercitation laborum cupidatat commodo", "data": false } ``` @@ -1884,7 +1840,7 @@ curl -X PUT -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d ## `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: 51' -d '{"version": "1.0.0", "data": ["id1", "id2", "id3"]}' --insecure 'http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=dsid' +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` @@ -1906,26 +1862,24 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip - **Body:** ```json { - "version": "1.0.0", + "version": "example_string", "data": [ - "id1", - "id2", - "id3" + "example_string" ] } ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0438s` +- **Elapsed Time:** `0.0128s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "56", + "Content-Length": "45", "success": "false", - "Date": "Sat, 31 May 2025 16:34:24 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1933,8 +1887,8 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip - **Body:** ```json { - "code": 43, - "message": "fugiat dolor aliquip", + "code": 46, + "message": "cupidatat", "data": true } ``` @@ -1973,16 +1927,16 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0251s` +- **Elapsed Time:** `0.0147s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "73", + "Content-Length": "45", "success": "false", - "Date": "Sat, 31 May 2025 16:34:24 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -1990,9 +1944,9 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip - **Body:** ```json { - "code": 50, - "message": "eiusmod occaecat magna non Excepteur", - "data": false + "code": 100, + "message": "in magna", + "data": true } ``` @@ -2030,16 +1984,16 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0250s` +- **Elapsed Time:** `0.0130s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "65", + "Content-Length": "52", "success": "false", - "Date": "Sat, 31 May 2025 16:34:24 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2047,8 +2001,8 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip - **Body:** ```json { - "code": 22, - "message": "ipsum adipisicing magna amet", + "code": 59, + "message": "eu Lorem dolore", "data": false } ``` @@ -2087,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.0220s` +- **Elapsed Time:** `0.0133s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "47", + "Content-Length": "44", "success": "false", - "Date": "Sat, 31 May 2025 16:34:24 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2104,8 +2058,8 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip - **Body:** ```json { - "code": 26, - "message": "mollit Duis", + "code": 91, + "message": "irure ex", "data": true } ``` @@ -2144,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.0215s` +- **Elapsed Time:** `0.0162s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "53", + "Content-Length": "51", "success": "false", - "Date": "Sat, 31 May 2025 16:34:24 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2161,8 +2115,8 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip - **Body:** ```json { - "code": 63, - "message": "fugiat eu tempor", + "code": 2, + "message": "aliqua pariatur", "data": false } ``` @@ -2201,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.0220s` +- **Elapsed Time:** `0.0170s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "52", + "Content-Length": "47", "success": "false", - "Date": "Sat, 31 May 2025 16:34:24 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2218,9 +2172,9 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip - **Body:** ```json { - "code": 91, - "message": "non ut cupidatat", - "data": true + "code": 82, + "message": "incididunt", + "data": false } ``` @@ -2252,16 +2206,16 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0350s` +- **Elapsed Time:** `0.0137s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "76", + "Content-Length": "57", "success": "false", - "Date": "Sat, 31 May 2025 16:34:24 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2269,126 +2223,8 @@ curl -X DELETE -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip - **Body:** ```json { - "code": 73, - "message": "ullamco occaecat sit cupidatat Excepteur", - "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: 208' -d '{"version": "1.0", "data": [{"bsflag": 0, "wellCommonName": "Well_A", "wellId": "WID_001", "dataRegion": "Region_X"}, {"bsflag": 1, "wellCommonName": "Well_B", "wellId": "WID_002", "dataRegion": "Region_Y"}]}' --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": "1.0", - "data": [ - { - "bsflag": 0, - "wellCommonName": "Well_A", - "wellId": "WID_001", - "dataRegion": "Region_X" - }, - { - "bsflag": 1, - "wellCommonName": "Well_B", - "wellId": "WID_002", - "dataRegion": "Region_Y" - } - ] -} - ``` -### Response Details -- **Status Code:** `200` -- **Elapsed Time:** `0.0418s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "65", - "success": "false", - "Date": "Sat, 31 May 2025 16:34:30 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 6, - "message": "ea velit enim nisi consectetur", - "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.0226s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "41", - "success": "false", - "Date": "Sat, 31 May 2025 16:34:30 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 43, - "message": "esse", + "code": 19, + "message": "sed cillum sit nulla", "data": false } ``` @@ -2426,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.0217s` +- **Elapsed Time:** `0.0130s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "63", + "Content-Length": "55", "success": "false", - "Date": "Sat, 31 May 2025 16:34:30 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2443,8 +2279,8 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 27, - "message": "non sed Ut ullamco laboris", + "code": 14, + "message": "occaecat non minim", "data": false } ``` @@ -2482,16 +2318,16 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, ``` ### Response Details - **Status Code:** `200` -- **Elapsed Time:** `0.0208s` +- **Elapsed Time:** `0.0136s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "73", + "Content-Length": "46", "success": "false", - "Date": "Sat, 31 May 2025 16:34:30 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2499,8 +2335,120 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 35, - "message": "incididunt quis elit dolor Excepteur", + "code": 15, + "message": "anim elit", + "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.0129s` +- **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 05:18:24 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 18, + "message": "commodo", + "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.0148s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "72", + "success": "false", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 40, + "message": "elit eu voluptate culpa consectetur", "data": false } ``` @@ -2538,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.0257s` +- **Elapsed Time:** `0.0132s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "55", + "Content-Length": "47", "success": "false", - "Date": "Sat, 31 May 2025 16:34:30 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2555,8 +2503,8 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 100, - "message": "ullamco sunt Duis", + "code": 73, + "message": "ullamco ex", "data": false } ``` @@ -2593,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.0269s` +- **Elapsed Time:** `0.0164s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "76", + "Content-Length": "53", "success": "false", - "Date": "Sat, 31 May 2025 16:34:30 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2610,8 +2558,8 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 24, - "message": "tempor exercitation occaecat laboris ea", + "code": 72, + "message": "dolore Excepteur", "data": false } ``` @@ -2649,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.0222s` +- **Elapsed Time:** `0.0138s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "52", + "Content-Length": "39", "success": "false", - "Date": "Sat, 31 May 2025 16:34:30 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2666,129 +2614,12 @@ curl -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, deflate, - **Body:** ```json { - "code": 37, - "message": "ullamco nostrud", + "code": 14, + "message": "do", "data": false } ``` ---- -## `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: 480' -d '{"isSearchCount": true, "query": {"dataRegions": ["JD", "DG"], "fields": ["field1", "field2"], "filter": {"key": "conditionKey", "logic": "AND", "realValue": [{"value1": "example"}], "subFilter": ["subCondition1", "subCondition2"], "symbol": "="}, "groupFields": ["groupField1"], "groupFilter": {"key": "groupConditionKey", "logic": "OR", "realValue": [{"value1": "exampleGroup"}], "subFilter": ["subGroupCondition1"], "symbol": ">"}, "sort": {"field1": "ASC", "field2": "DESC"}}}' --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": [ - "JD", - "DG" - ], - "fields": [ - "field1", - "field2" - ], - "filter": { - "key": "conditionKey", - "logic": "AND", - "realValue": [ - { - "value1": "example" - } - ], - "subFilter": [ - "subCondition1", - "subCondition2" - ], - "symbol": "=" - }, - "groupFields": [ - "groupField1" - ], - "groupFilter": { - "key": "groupConditionKey", - "logic": "OR", - "realValue": [ - { - "value1": "exampleGroup" - } - ], - "subFilter": [ - "subGroupCondition1" - ], - "symbol": ">" - }, - "sort": { - "field1": "ASC", - "field2": "DESC" - } - } -} - ``` -### Response Details -- **Status Code:** `200` -- **Elapsed Time:** `0.0377s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "464", - "success": "false", - "Date": "Sat, 31 May 2025 16:34:37 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 18, - "message": "deserunt incididunt cupidatat esse", - "data": { - "total": 100, - "list": [ - { - "dsid": "24", - "dataRegion": "Lorem sint enim dolore in", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "30", - "dataRegion": "adipisicing enim dolor dolore laboris", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "65", - "dataRegion": "Duis enim elit adipisicing ipsum", - "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:** @@ -2850,16 +2681,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.0228s` +- **Elapsed Time:** `0.0129s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "287", + "Content-Length": "294", "success": "false", - "Date": "Sat, 31 May 2025 16:34:37 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -2867,225 +2698,327 @@ curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 32, - "message": "aliqua nisi in", - "data": { - "total": 60, - "list": [ - { - "dsid": "71", - "dataRegion": "consectetur", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "19", - "dataRegion": "incididunt sunt culpa", - "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.0248s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "411", - "success": "false", - "Date": "Sat, 31 May 2025 16:34:37 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 30, - "message": "incididunt non sint", - "data": { - "total": 31, - "list": [ - { - "dsid": "98", - "dataRegion": "culpa et esse deserunt cillum", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "73", - "dataRegion": "Excepteur", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "22", - "dataRegion": "enim laboris qui ut", - "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.0303s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "179", - "success": "false", - "Date": "Sat, 31 May 2025 16:34:37 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 84, - "message": "in dolore elit", + "code": 40, + "message": "in Excepteur", "data": { "total": 11, "list": [ { - "dsid": "77", - "dataRegion": "aliquip culpa sint", + "dsid": "6", + "dataRegion": "reprehenderit", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "83", + "dataRegion": "Duis incididunt velit et 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.0133s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "313", + "success": "false", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 47, + "message": "in in ea adipisicing consectetur", + "data": { + "total": 85, + "list": [ + { + "dsid": "6", + "dataRegion": "officia mollit ad dolore", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "88", + "dataRegion": "laborum cupidatat", + "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": "281", + "success": "false", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 4, + "message": "velit do ipsum", + "data": { + "total": 68, + "list": [ + { + "dsid": "15", + "dataRegion": "in est commodo irure", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "51", + "dataRegion": "nostrud", + "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.0134s` +- **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 05:18:24 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 39, + "message": "pariatur", + "data": { + "total": 69, + "list": [ + { + "dsid": "61", + "dataRegion": "ex in sit dolor sed", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "27", + "dataRegion": "culpa irure Duis", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -3156,16 +3089,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.0325s` +- **Elapsed Time:** `0.0191s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "191", + "Content-Length": "173", "success": "false", - "Date": "Sat, 31 May 2025 16:34:38 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -3173,14 +3106,14 @@ curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 82, - "message": "id ipsum tempor", + "code": 49, + "message": "officia ex non do dolore", "data": { - "total": 63, + "total": 38, "list": [ { - "dsid": "28", - "dataRegion": "est id culpa dolore consequat", + "dsid": "22", + "dataRegion": "do", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -3251,16 +3184,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.0240s` +- **Elapsed Time:** `0.0134s` - **Headers:** ```json { "Vary": "Origin", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "282", + "Content-Length": "394", "success": "false", - "Date": "Sat, 31 May 2025 16:34:38 GMT", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", "Connection": "keep-alive", "Keep-Alive": "timeout=5" } @@ -3268,130 +3201,130 @@ curl -X GET -H 'User-Agent: python-requests/2.32.3' -H 'Accept-Encoding: gzip, d - **Body:** ```json { - "code": 87, - "message": "veniam laboris cupidatat", + "code": 40, + "message": "magna nulla commodo", + "data": { + "total": 91, + "list": [ + { + "dsid": "66", + "dataRegion": "Duis aliqua do est", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "78", + "dataRegion": "et eu ea deserunt", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "12", + "dataRegion": "ex ut", + "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.0161s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "275", + "success": "false", + "Date": "Thu, 05 Jun 2025 05:18:24 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 98, + "message": "veniam aute labore", "data": { "total": 71, "list": [ { - "dsid": "37", - "dataRegion": "elit", + "dsid": "45", + "dataRegion": "pariatur", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { - "dsid": "50", - "dataRegion": "non in dolore", - "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.0231s` -- **Headers:** -```json -{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "471", - "success": "false", - "Date": "Sat, 31 May 2025 16:34:38 GMT", - "Connection": "keep-alive", - "Keep-Alive": "timeout=5" -} - ``` -- **Body:** -```json -{ - "code": 46, - "message": "sunt occaecat officia pariatur ullamco", - "data": { - "total": 33, - "list": [ - { - "dsid": "86", - "dataRegion": "adipisicing labore voluptate proident", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "28", - "dataRegion": "proident Ut ut dolor occaecat", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "70", - "dataRegion": "aliqua exercitation nostrud aute", + "dsid": "72", + "dataRegion": "irure ea", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null diff --git a/assets/images/__pycache__/paddleocr.cpython-312.pyc b/assets/images/__pycache__/paddleocr.cpython-312.pyc deleted file mode 100644 index eb0c434d6be16272b4c86a67642f4140fd955adf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5759 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 YDPAfDe5@5UiA7kaXcCBK1nl_#0Y|#%p#T5? diff --git a/custom_stages/__pycache__/keyword_driven_crud_stage.cpython-312.pyc b/custom_stages/__pycache__/keyword_driven_crud_stage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22631093ba472629eb84c216e7bdfb94118016ae GIT binary patch literal 20745 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 ValidationResult: + """ + (通用版) 在列表响应中通过唯一名称查找新创建的资源, + 验证其存在,并将其唯一标识符(例如 'id', 'dsid', 'uuid')提取到阶段上下文中。 + + 需要用户在 '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 + for part in path_str.split('.'): + if 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 + + resource_list = _get_value_by_path(response_data, LIST_PATH_IN_RESPONSE) + + if not isinstance(resource_list, list): + return ValidationResult(passed=False, message=f"响应格式错误:期望路径 '{LIST_PATH_IN_RESPONSE}' 返回一个列表,实际得到 {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: + found_item = item + break + + if not found_item: + return ValidationResult(passed=False, message=f"在列表响应中未找到名称为 '{unique_name_to_find}' (字段: {NAME_FIELD_IN_LIST_ITEM}) 的资源。") + + 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}'。") + + # 将找到的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。") + + +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" + # 【【【修改结束】】】 + + 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) + + if not isinstance(resource_data, dict): + return ValidationResult(passed=False, message=f"响应格式错误:期望路径 '{RESOURCE_OBJECT_PATH_IN_RESPONSE}' 返回一个对象,实际得到 {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})。") + + return ValidationResult(passed=True, message=f"资源详情 (ID: {created_id}) 校验成功。") + + +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" + # 【【【修改结束】】】 + + 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) + + if not isinstance(resource_data, dict): + return ValidationResult(passed=False, message=f"更新后详情响应格式错误:期望路径 '{RESOURCE_OBJECT_PATH_IN_RESPONSE}' 返回一个对象,实际得到 {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}'。") + + +class KeywordDrivenCRUDStage(BaseAPIStage): + id = "keyword_driven_crud_example" + 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." + ) + tags = ["crud", "keyword_driven", "example"] + continue_on_failure = False # Set to True if you want to attempt all steps even if one fails + + # This will be populated by is_applicable_to_api_group + discovered_op_keys: dict = {} + # This will be populated in before_stage + 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) + + # 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: + 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) + + text_lower = text_for_matching.lower() + resource_kw_lower = resource_kw.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 + + 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}'.") + 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.discovered_op_keys = {} + all_endpoints = global_api_spec.endpoints + + 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") + + missing_ops = [op_type for op_type, key_val in self.discovered_op_keys.items() if not key_val] + + 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}") + 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}") + return False + + def before_stage(self, stage_context: dict, global_api_spec: ParsedAPISpec, api_group_name: str | None): + 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}" + updated_name_for_run = f"{unique_name_for_run}_UPDATED" + + stage_context["unique_resource_name"] = unique_name_for_run + stage_context["updated_resource_name"] = updated_name_for_run + + # These are placeholders and likely need to be adapted or fetched from config/context + 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}") + + 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.") + self.steps = [] + return + + # --- 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}", + endpoint_spec_lookup_key=self.discovered_op_keys["create"], + request_overrides={ + "path_params": {"dms_instance_code": "{{stage_context.dms_instance_code}}"}, # Example path param + "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 + }] + } + }, + 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}", + endpoint_spec_lookup_key=self.discovered_op_keys["list"], + request_overrides={ + "path_params": { # Example 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 + "isSearchCount": True, + "query": { + "fields": ["dsid", "wellCommonName"], # Example fields - MODIFY + "filter": { # Example filter - MODIFY + "key": "wellCommonName", + "symbol": "=", + "realValue": ["{{stage_context.unique_resource_name}}"] + } + } + } + }, + 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", + endpoint_spec_lookup_key=self.discovered_op_keys["detail"], + request_overrides={ + "path_params": { # Example path params - MODIFY + "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 + }, + "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}", + 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 + "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 + } + }, + expected_status_codes=[200], + ), + StageStepDefinition( + name=f"Get Updated {RESOURCE_KEYWORD} 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}}" + }, + "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}", + 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 + "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 + request_overrides={ + "path_params": { + "dms_instance_code": "{{stage_context.dms_instance_code}}", + "version": "{{stage_context.api_version}}", + "id": "{{stage_context.created_resource_id}}" + }, + "headers": {"tenant-id": DEFAULT_TENANT_ID_PLACEHOLDER, "Authorization": DEFAULT_AUTHORIZATION_PLACEHOLDER} + }, + expected_status_codes=[404], # Expect Not Found + ), + ] + + 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 diff --git a/custom_testcases/__pycache__/basic_checks.cpython-312.pyc b/custom_testcases/__pycache__/basic_checks.cpython-312.pyc index 426f047412bdaa09ce49cf9ac6746cdc56efa92c..44056a95597d704d2ebc2ea52668191e985b8032 100644 GIT binary patch delta 430 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 delta 26 hcmZ1$zASu$qdey=M$J-X1_lPb$qkBPn-k>ScmQ>B2dn@9 diff --git a/custom_testcases/compliance_catalog/error_handling/__pycache__/type_mismatch_case.cpython-312.pyc b/custom_testcases/compliance_catalog/error_handling/__pycache__/type_mismatch_case.cpython-312.pyc deleted file mode 100644 index 3345557a81fa6bb4b8bb1bd5f662eae8f1c06c6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14831 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 diff --git a/custom_testcases/compliance_catalog/error_handling/__pycache__/type_mismatch_query_param_case.cpython-312.pyc b/custom_testcases/compliance_catalog/error_handling/__pycache__/type_mismatch_query_param_case.cpython-312.pyc index daea819a75545de7ffbaa0ea6745555157642410..da6662e9b8a640cc39369123e48eb1e7690681ae 100644 GIT binary patch delta 21 bcmbOkIWuyD78m2M&Dvb|M1T~Rd_OM$Uit_T delta 21 bcmbOkIWuyD78m2K&Dvb|M1T~Rd_OM$T$%^b diff --git a/custom_testcases/compliance_catalog/normative_spec/__pycache__/http_method_usage_case.cpython-312.pyc b/custom_testcases/compliance_catalog/normative_spec/__pycache__/http_method_usage_case.cpython-312.pyc index 46651f39bc9c11c35c2780373aa36c1bc20e7bb8..2a90af96ae7b9a575b896212affa7bc354d3184b 100644 GIT binary patch delta 13 Vcmey&{F!;fen!S$lMgT&0{|@V1>XPw delta 13 Vcmey&{F!;fen!SylMgT&0{|>f1-}3Q diff --git a/custom_testcases/compliance_catalog/security/__pycache__/https_mandatory_case.cpython-312.pyc b/custom_testcases/compliance_catalog/security/__pycache__/https_mandatory_case.cpython-312.pyc index de7f3e858cbbe7dd585aee29cc3fc932da2397eb..0bb99955627a028934c697cb9596dde4c561c624 100644 GIT binary patch delta 14 Wcmca-a?fPLEOy3Un`g5h76Je@cLtjP delta 14 Wcmca-a?fPLEOy3Qn`g5h76Je?w+4Fv diff --git a/ddms_compliance_suite/__pycache__/api_test_cli.cpython-312.pyc b/ddms_compliance_suite/__pycache__/api_test_cli.cpython-312.pyc deleted file mode 100644 index c69880ec8d0f4defb5de21d6bcbc1d6de8d0ce18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6314 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 Yn|q&l>52Y5uRL{`w%?!#x&kx*KhZ}K*Z=?k diff --git a/ddms_compliance_suite/__pycache__/api_test_generator.cpython-312.pyc b/ddms_compliance_suite/__pycache__/api_test_generator.cpython-312.pyc deleted file mode 100644 index 688fbd2e60fc9f15f4347385da8394f8107608fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22216 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 Ie}w1%1Fc8boB#j- diff --git a/ddms_compliance_suite/__pycache__/scenario_framework.cpython-312.pyc b/ddms_compliance_suite/__pycache__/scenario_framework.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1cb2809e3d96c82ec744921c1905bec04decc32 GIT binary patch literal 16595 zcmd5^eQ*;;mLGk~AF||+fNj8*WrGnoGK7Q=hcAN(kYGb>13?KZgl25Zu_b3l3bEJh zI)p4Hfnavo0D%N^7lKJPAa?f_2S~zQ)m5=|b#*h?IcaCJb*WlQHvim;b?$PTzwW&r zjVuY7gsQu$H03uvuRrH?_v_z#-Qr&ihD-{=f}u5S-bEDkXMB-^Iu@A>K;$GvQ?#Ok z>QvYjol3j1Q)O3ms_p7dja}2JwQCiauI$j+b>ykH>*1;D$mqnDylij4Cl+;Fw)*Ym1{YOfvReLVsWdJWT&dVdbEZ}9wdHIBA0A5a< zSJ17r8t-C7R;{Ss;^us!y3XzLiK<#px2WIR<#T&I&JIz(-r3RN+}pv3n(ZE7HCPp* zdV|N`c~^mDRibH!v%^h0F?%D!`8#}KZtb?sjm%4ahV!lWdVI_)J~5B5xGt}UV`4n0 z#{gWczK-!Z-5oCJt0bBmdzl=7$VrN!>wW zMOg&-@sHL5PtRn;-*x0YlgUcV*{Xy**_dalBq^m9gQE$KN?PHrzKh{9*X$FUQ~f zRpjFfcRzgp&wU3PM777+$%uuFhwk#aJw6B5#kd?DUhj+kF2{>Zx0uUHf^>LaW?0ru zGo1Jc^9p40F|>p8IemW4;qoFopJgQZI-DHGu-F?;%=7wvU49?u@OdE{84H&Vx+n*n zzbg2f{56o1RIj3!a>!{^uM*yHlu77Sy{hb0c@%C6xUm^XQN3#5sy&KU{Xnh-c^1S>j$)=ms7hHR+axcG@5CSg<7_i ztBJoM6UAF&mIMx?5I%Ng;>wNiz|rxG0g!)E*6GHe#yoyvXzco1k#iR!hd&$t=*swk zPoyD+3h$n{Y@R>%*_+`H4wx2;bR9PzYJi=-}9= zN5_Bl!C!73AszVfkGa^iltjwuS@0}eRzTV*VF!+uAr^kkmPJDi5;{1{E!#D`>GLgUU zgYo&x&HlTm-@p6rd*dgrrdbZ*_YaN_{Om6`52uPEOyb?ecbZb-0}#c&F)3)U)!tgY&z6Otsu~ zM+>YD220zzVDEG|a5r!`dPjKh8MJuRBiu%<@GD7p$_Nzzrb3;ov z@=Ke9vd8#c&m*HGw7Q93?GWbH@JuT*ETNiuzGjzDzLa-3kzo!kf0|#uL$Ex~zwjeu zlzus5PH;x0Fr#wFHe4{Q<>#*%nE|yQ&6Z!GgIz?#px~P&`tE^Lo*4EuK6l!V}p_#=|6-K^VXp3qv64g?3 zA028Aln1!L{7XL)Dpp2ygs-QpivtA#*VQ6n{*%!R!po#8tA~7nP5kO@eB%y&r=5Sn z!S8ekjeGc2PTtkZx4j~`y7^Vz!s9(c^^b*lz0oXEFq@iZ8=?bChE;*(mpsDURbP|t zNS}gV;ex+-khi4C3fQKm(8_jzgLW0Iw5t(K(5jVCfL7ZPiD+pJdDGen(x7$t)=Jqk zm`p~42n2HIW4tWj5sU)74CG}{^lUndF+e>z5C>IrT_d?qaXP4U{FJV#X zru|0f0XA~JFWv>BOZ+P!VdC@Cpy^^TE;$qGLFmVct5T~{V^X)ENihrHnTvH3L@la) z&Q?y;pt9o{L}P1*cdxTU>I$Gbu>f{j4xkKnAOqI=>SFbvfIVD;&=)=h3gGh z-{b_4@4|11xXl+wf$j3-g&O2Q0}gB_R*%e)o+(HS)c^^QJ6n!VJ=;;9DFN`@G&R#I zNWqnr63)Pqc~|pM4F4&pZjDvz|7UoOZ)V~Ccf%Lo3?F$rK5Ftnqnf`T6Q;<##vHzU zB=XDO!eoI8CN3VFIPzK?Zp9nHs?v=O*@_Y7RX6Q(;x06C@$Vz=4TKL}hq(w<#_-~m zPbRLOm$r8VDShvRhlgQ0VZjYC><@S`R)x%g;(*&}u*&9J$8Y=suuvN8f*nf}V7iW7 zKNFVPy?!EmqpId08Drk5?C9OY9xh7P}#9oB*j2PwcFF;B`esfW@jNg zxe$j-2|r8PoN%}5DNIpI@y&WMq;jbBVY4oz%+mmht&nk1K9?K}X_?zXntQEPkpTn5m&1)k8{v&II8_B zFiTZ0&WGVEe~53?^{Su^ebP57T}lPjgl2B~Z^)2)PFj2HAzI7)t{SK7OM+Y#a_b4a z^!?0|bIQ+$?r-)q{f*Z=U4N&QoguL=oN_>Mq~sywmorU&;iRAq6JQ*k@-@kxi{aw7Se_Vc62`1ZFhFh>sxr$?qf!FVR_$ zs7j@5cl&Nke0CgN60d!F_iW$92d_#^C$i zcp~r`>}83KjbH8qw-e~#@wWnhx%p1`)k71PKTB)__MxPzi08uR_H{6c)%Ytwn&H5^ zfXKiimz1>RS4nh?)R-&3RaA=FPR7^frA10qm_;?Z5d5g1Vc(nh{E)davE!iREB$Eh zRa(v9Ujd_2k{YxvYDh209v~Mb94sTMKn8xa4r58UmzpbqNm8@CT?}kV;04=E`)5w& zs!ZUMrV-mk&VC4E5I#GUc8eziOL~?lH4uWi(vL2yO588woo=w|q}@kDGkg85(iT+? z*+dmstfI!>1sxN0`<$!?%vgD2dJHod;yW@L%c4;dA~;*X0|U;$kSJ~9 zEv&cGA>o@I+kHFP1M{zk9&jgNA;A8YO=TFQt*S`S7xA;#-YUM8eY=(~ZWz^X4b3SF z&RHtVSvpA-WX$caA1kXE+#Q^|RG7Oo@XD>ck-2pvWgCKJ&j@ADjFi>$=7!r&e%tQg zHm9)7$?t9B+dD?Kb@E$1e2KSzYsgr1%5le76*3i^%sQSGG?fXaGQMKvu!CP&&(}M6 z%brn_Gc>c}j;R7HKU49k-N89FVUBHR-^iS0cZ|zY3O*6&3@+U$EZulpH?nja|HQNW zvo793kD3^%j<2DP{DGP`fBJs;U}tdNGGX4bVa>?A)gzWQcZ_RNDqB80C%EEiVa3z8 zpBP#3EWf;wZ=`t(Giqu{*P;C*b5@NSSEbbP^d2gPuk zXiTZ4r!;lur(~e9hPgocsIO#9CQbBZ!|Km5alz-*G>jd8()TMJJ) zW^8zcarwaw-xPE5G!nim5pVr4#$({E?;ek0X*`@QK5!SypPD!v>{B2wt7>Wp*i9%! z{8|}6i#f@~drDHrAvxWR6{H=8r2*fyeOLDd+`}*N#kHgQbqT`&hO>i?AGjomI}V7^ zr}mK3Uy%;};`9d)6Ss4r+E{=TRgzVzwrYr*02YSi8h+>{k)OOI;5%V2)m0`A!XiFsnw|3rc z{N!Es)~W1=0kGu|=YWR^;%*9kuVXaPpEC4jDAI z0X|JqV(eCk%6mK+pJy?R3=+x!mX2h6ikY#sfrC_>I!IG#9281FMz*1!2CLT#)$4g% z-K~wc>;7%y?>F9F!8dQ`i+7CbcgkaQNzq`P!Iok#%t*?RSdb9Axg27m(cy4C3Li*hVDJAlZhb840d;$%{H0W0f*N zKDQL$$LrKRrAniZW>Q8=-@1O)h`KCfD(kE3FUQ!-#=d6;@<-H-p&5n1tLWzrTSwG| zp#@ca8~PvTP4k4T$`N%Hl&)TKPiN9Rs|Z=<4RS;42VXgFi>i?ERpr8=xPg5G8^GwT}^Aj?W}{Rp3x;8sDrDT&IDc-dR@RBtz)vGCPTu3 zc@CWoZs#1@keC8)-YbUQwcUTWwR*hB{IERPE+1@YHN*Y~0!?>YAR}ylvZtx|C%g zYNe*xUC_vn;g7?!u7gx4x2Rt$5mQOOCX`ovSSO9N6Ve;R45DxGh(^>(mjOgwC&O{h zRz}QyIest0LGBiCqMr6kCXr}F|FR3NUcgq0cQ3?TxTV25$*qFeaic5IFN|;tSN-Ho zAP?hbp6-4C_@ZMo4()=p^ zsN*ptI2p?yFbUNJ{#kHFfXysYeapjRZHS}da9UrPzpWcDS=j<)i*)U6r^|i@MKuj#ZDgJhL^SrZxqpFrHDF7VQ{brlIOo@ zlC=w*RKZ;%nqxbl9cgLBSCutqs+gz&6$RHx$OF_)>bJoe;!mho%_obk>Tkv*6&W*~=Sjk4^vsg*&u~pHC zZ{>~3zmgh5wHt!9+watFAGL!kr6sucWnu5jP`F#M4qyQFykfoblrLDiL?~SnEPYZa zeR8yP6(ny4un;Pn8!THUlr6iLn_ zOQt6CRKY3N;F42qr%S%3;8jwX*k{~8;z8bJCVvO4WE3(T)?&2j)D{hw4r9nm4af^F z0x;?pJ-K|S2gH>Dsab%aGU3oa3lLYfgt&lf0Iq?_p>r4`ycrLwWfcZT|2ZjnO^`R2 z&IdlWmJ2v7uRG6Lz;1@lOSc%w9U$-}Cm}M)!}EQx7;3m=Dd0s2#A1N_G~doiU6+z& z7{g$!9ZIv$BY6QxgH@Y433p@KkC5y^k}{#loa}*wLHOfxfh2*cWE@4NyqG0>J-~x3 z8saYmT;<^HOGHZ&$RZlcrGZ-IfSVxMEPn-&hr>sJPp~8jzBorVDUnscww-(S}3j_DP9b)$ryTK1;8Q6k`m#( z6}@~(-c=kXGRQR$nGO-9J8$icpX|Z)g%|`?vOk4dM6DB!13a|s+k6dpiF+6TbsF#a z#=R;%^QMtYO1|GRtD6ss4dUPuX^%g;I8C?2>egRQoqCpxz`C@P)lEX_qaZ;h6jy$S{ zDg3c&pF*;%)sj(703F$c9niofrKq$mg3GzMjbLLjWBA*Qm92~iZiut1d)7^(*NBR8 z_e`A;#oWubl^tGiU~sE#@jB2q!Oa6QLH$o3b;s0pyKbQ1rx-)c-8`b{`+T)O9%+!9{vvm?U}}#^wGs+R=daS0{7Awn?A_Nso%p+tB+n!W)?b#G zH}dQA@#9*^B{?*cb0yXl=^qHcaZYlELN2i0QGpPc#~#2~9}+||5^hB6K{5#UKulCQ zJ>3#Wr={194ixdf9+6wp_JKAX5m_&EVLFjb zD;V6sQbM}j8p@}Eyubw^rUqJZ1_0p0TbStpIEzloG;l86y>NNpJd%?#FSTD3mEg>U zRDxyjS3xO3t_Pg01#xF<8o&q+*^DHYr>dbxWqYgzE*7V;P}!HDnWA}}NAhH@f0`WvOD0wbRrqOsYujL39It~Qp;H=W%tcAj? zh2&~hwJ@hTRALF1EEY-@2TPU-CCg+NW_jhsRp(a)@_EY>q2iKr)u*e2#Y=?ZB_qX8 zfc1NA_pf)KQlB%NHUtZ+g~IC5!o|1Mp_1?DP3Wh zk_S#7>BnoRDJ77D4op$az)#(YSjBuF9RE%I)DJG;v5fRHH`LO^Rk*G?cQ2YnADoCyRBW3&}mGdX+ zk#XudfqL#wRMj`?Vnwau9)Ige=ATd$g z$2cgps73Ww2k#cuyBh0RQC;M)yG8xBdbh(>XLCNL0LMa!@#}3oTe!V=r=6{{aSoSV zCM3VLp~3ho&^b+5Qcf`hWTimP7)HgaS{pMukj0pO-a+F}$F6d87~RUkLl=qZEcF=lv1Kf5^k*>3_J?~c6F_g%~1 z1>Wo${rvO5-?xuk=^p7k5o~J-o^KmH`BC7?uZC~6jr{7kd6HJsG8qE~9PXfwf^g2aYr{ zoRBIUh4H(~M_6@XN z2=u%aXg_71>;uJWh*ii{@%iC32zkno`R2eUXM*p25q1QGRp9*X;MuF@%$)j0bMVy3 z;XBtYX7JC*xhsLs-ygkkHSoo8;1Kxj>%m{2AHI3J)K$m+``z|H>)GL(Z;yU?ZnV2y zak}h0Wa`-pqED7HqC)WW_2BuBf*qa1Uz~edK%hK&I;X3u z%28J(8md_LR_L>wsJB|{Y_+V_Dr#{SAO5LX)E!Yl6SBKeo6#e>3Q{vuFZz%bgLIAxRKUtP*zbG)6qV~sS#|Y#~8fYbA*ZU>L9k% z5en{f1*3YA(u=eaUf^4*;tKd1c1v?ivvI<@%m}{H^BNTn;OS)d;t1TmMCmJ*1&kc8 zF#`8c09onIRq(t<#;D+OCayjSSJ>(!^BN?u98NiMIRWqtgZ%5~h@Knk3`&3*mhNQDBTNO?2w3L0I<-io~!o zU+G6$MgJnwVd{vrtEz~du7FsSyl-lb^~Of?LUevL5Fg-Cv)A-4-JYr@&2i00A&yIN z7bqOPamP4L}p#xHNQ zy%X)5Iy<^%;HNq6LWK{+X(BWCawuJcx#y`%Q@Bw)Fag&xaVIs>cA6q~RdZ~! zsez;t_j-kA8sVOAPWUS{Pm#W5W=a1A-URrfX(4_VD)B>+{ZPm>Cmc)YRJFe-_Zld7 z(f^xYs>E-O#4qh<_`M$Hw`l^uoWDxHbcxd8o-vrO z;uCDU9PH=_wx5I&MNWPL9d8ESxGtA2floSRAm+Yr_6DKCxq3J7#-(6yci_Tl1m3zH z{IoZ4qFu%xxziJD`x5f(XX_luts|ula`xcYJDiEjY#_OYR6TIMH`sa#`oS|-hi|qF z-~33P%{P~Nu!0EOZGoa-_|7{r*qq_P!z{xrOCFY4PNTyda&mGwOyinVn2gd^>*N3a z>8GDO$p8wrb_U+OD61C6mvziHd$2e%12?lsI~WgUL17$F3Ap3u0JwwHQXv75YF*|QL4EI?)W)?0x#Tq@U{fxZ)?|8RNqwoV@+`y|dtPiTMY|p@NSrR$Pm>1{r3=hNAzyi%`*xT)YI!Mz3Clm6+#* z*T{YhTxo~+0-b^_cLHx*lZ`xl`-IuE5|BZRk4E15c%<#tQ=ZNYT)Yi7DK0`|gy`J5 zE?+N5YcVaxwP9xR?y{uI1taZ(;;!E2J|t=!JlrL434kx^8f;u0l#v{oMpQT0oHbyt zI)-m>0A>vDwsCH`uda4E>O_O1w%*0LosNT|+T(UO#W{REYqwT%u3BrQ!^v8mF1rn{ zZLkEjF;Idg)VdfCOh_n*EE?G(utWxn8iqaSsS?c$?eJap*Wv!*ZO9@s8VCy`!EN64G+;kjkd61c9M6Ip9 z9+VSxzyz0z#$rjGjksQnD+G|^pvTS1W5dQHc2>HB5>-yN&N7X|T_GAFkm?wya6NT! zNyWKbZoHZiDXXYK3-F>I8{8nGF{HaRFi7^1JfN2Bpp|Di+~A_hb+B5b9HO4L%k{Z9 zn>_+oOW+%M3=zyY>_A=v9rlPwu{`RE-_55U4ht3zgP|$)nWFmHf*%dYe+73xP+sdv z!c2esf^Xs%d_4W?oDb(*P5v;s&+T7X>|0qpXn7GzX}Nq(@tIPDg=NByJ^mexZwDik zv4XjB&{Q>Kn*K;{>M*t${rW_oK2eyrq<5D;d#x{ft*~UBu+A>bWd`-^(Cj&_#)k{j zdNR5*dei(_t9@Ck2No8LlSKwE-?Gj3)DM=uG_)|QcWLkXuI$c|hvtPnx^7*MsoT`MukXl!d0l7m7`hA_9bNtc`x0oxmO{STZLC0g0))6sToXi4recu z)$P{~WN#iP(~})^x1mejWq+8O)w8yHZQs%dsVnck*w6oQ+k@2y1RFExJo=68=)=W- z)3@}ddT?<;|IV-W{BF-s=8~(%4~_oJ7krs7+$_Df^#1CvSKrGK_OU{xOJM8A2>At7 zNkg-$iv9tVsGrb*~O>`MHWi*dXfm`C_p&u2j1GANOm-a2avEtea zUt0d~PM~e`SMa_Heqg8jPlT-5M*mYue_{U-Sl9@(0n|tp(cjAr0JqR32;4%KA`qK# zoGYbo+h7)!3u*Z<0iA!%D0sMhm9Tn;aNyO!<+dk;vXoN28;A0i`SUjU@;3E*e0eX8 zsSrA*CFvG_T0V&6Pb>7L751kNrfnKZ%k6vKm$s~{WGF4Or=+{YpSBE!!pg1pcHZCf z^`3iMgk5_F_kknr0$U^0as&H#VXqs+@KEbf^9^7XkaYvS4Q0g!fa_%&ZKq$x(E*yp z=4D!PN+n%|qZNnf|0E>cL4Ti)fiRXyk{8G^B}Y(Uzombku+<~v93D(+`16ys80}*! z+y!I%C}N16xRW;ge#1TW{kX5=28#9y8}^iHE9!gBQXgq85Ct7@o7GcST z{*wLzVf$WTpH0|%P&numYU>22OUSAhj=m-&T7co)Li&mH{>#I879_HDGLd!t^ZH}& z?G(z&h3zj3FE3mP{{`<;l~@k`Q8aXcz7^B3U=KJzI~;*X!M;MfsRw*lx$*Z z5IW~+`Rr4{*=C`oql$Y82!yV0rDH*y4wK=_UhBa|tAmMhN<53S3kl7ER||O*KcnMV z+c7vNeDMpq77xVd2>Kij@5Y|GMn&!Le;jXaP7`QNdN!< literal 0 HcmV?d00001 diff --git a/ddms_compliance_suite/__pycache__/stage_framework.cpython-312.pyc b/ddms_compliance_suite/__pycache__/stage_framework.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2eb307b06303c634f1b36f19bed0cb42ac0773ed GIT binary patch literal 30858 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ɥ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 literal 0 HcmV?d00001 diff --git a/ddms_compliance_suite/__pycache__/stage_registry.cpython-312.pyc b/ddms_compliance_suite/__pycache__/stage_registry.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..567959094a59332207372cceb663fcc1d5c142ef GIT binary patch literal 10272 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 delta 2205 zcma);YfMx}6vua#-OGwREJcMC5pV%lRA9wgK@m#=tO~V=v?0Q>u$N^Oc5(KivTa1I z(I#qBJs)hWsS5U?^^tmQNfS-9tw|f3G)>wjTw7YL`l(4DG;PWU)A`Q=qNZv2@XOgb z|Cu@G%$d1dyT|t3VTm^q65>qaZ{%`uN5ubr;$?Hna`E$sNi{VxpQ+L8V~sIB8x5Ot zZF@|OalK~e6g@j8kD1%p;Uy^)vPNjc@+6H~9c((yQCw^)ZRt#*b|sVL(E%lkx#+x7 zU>=FnN0j3%ae-KzF9a3|&>>sO45y9H#lYh(8n!KFc0GAYgf%?y76`Fn=?sK5UMS7Y zYHyeqVToLUFcZk+cKps0h}c)HbJwX`depF15ejPRc5RWz!_{u?@#NF(xL1}sA+-V) zKmi;8rt?%F4UkLb!va$2IEhI&T zY^Eb~YS<3CGCxhfKPS$dpiY|KP1Cd2u-&>h`&agmBTUVXDt3t8cDNMT)#Wto*qbcp z#zaFL8{V3;mYtwaatcJVjO1KR4q*8)i9FA8x}IClPLVyYloe4!-tpwFNfO!KN|6Ub#WX3bzuqy6gJuaXy7qxo>ovQB-J-lSEMWi~qY=53?00ZDSAS!n|MFnDcNcM+oZRbwpy8oJ}+OE z)gZ+DFlNMbdAqsH$`Z}$EL`Vk?y7)zV-BwR)2dt)BatfF>CU1vRZp=CbgSx2)+I6M zjGq+6Da?BdH~<9cY;{rA2QaY@9|Yt+u@CKYzj}Zb>;3M#Hl<%kA{%K}Ll&K{TdfRW zhMVr!y{?>u8Kh(DhZG$mw-g<#FJ>3%tNLBF6LsP;3fbtgJ~9*;R121n;ar3DNK6UQ zm_CN9Uq7+I%-BYKpy7PQl*_Ku*G(lW|3?Ve zef)ZVD|Z5J0AEl|a|?SzKi}LFD{^wQ53uX{XYFZ>8FbrUDtaoT!__CBI{CIeC^ou- z9|UFt>41D<(PYu%kww7E;~YyIrVq=><1~^y9&a!h(!5$A6by?`h#RieKq4?5SOcsDVu2b!zPh!r)&Uj3bHF^H z4p5F%lOZ9ixJY6FWeHZ9F(e-eSlk6K3X3axaq8?S4##%pf2$F9`-`v6D&ubL#f(Zh>(8 z-v9mI_rC_!ty@*+)TvWdr%qL!s{7Y}QJ%RJ81l~=O^^(J57$-i`QTCJct|waeLQR4 zHl**=6PYo{s2JJ_)9xCZ987l289a_@4 zWT>pOY-nlcQW_UBSUyzISwa1wgUg00J1eO_Y;gI|ip~|(A3nHpXjSK`p{mZRq1BzM zhpIbm)ifevux6;XvzGd`gLOmoo%PfoIk;x1p|gR=0+Gb1!L>t;osC4+FY9bI`J38I z8dH2M6sng&*VJx|SpiQ*)*v&+J|Z*5eUE`x_;s$QVet@_;0fD+VOx!f5SZi%?4Svg zAx!59+c?go$xKb@GBy*4VmcccnTZTME28#wP3yi##P@;cxnJf*#70Z+M7B+KZ1(}# zLHRb>0isVi-^wf@M9DoYZ&SH6?FQCtGFG=YazB;-#-?zoYYb)+ymnX&eI{2#{XtXD zn8jqIuNzF}u|bO~dO=`^#Wd=Uh@h!3pw86WKiqHW9~ssYm&Og;*KfA4;}8%c<(Rdkod$H)qSJ^@ z6FSY@rvaJ8e{t~s!PRB#i4U8Lr`Gq8%uI>We>qXskZha%Pou!|vW z;#R4nR<>i#NP}KO6T1`xBmKi7RSTh9e)|oBV&BV2#5RjiHD^Zyn68L=(JH09uo zDZ%;GGbeAo@djIg?`nL1`1JhIuiiL1HUIUOTJ?d8QOmA`bnGg0s?b>tjw__Sdc(%X z>UG^6n`&$8J38*AjFzhxQj%`Y7?vfqkKJlKA82DsP5W4E@Vw+)@W z;J5-z!^Un)|B%V0F|q6j+dX75o1xWv8_9I0;g;a=bgYuph z6S)G7ktry0F_s=L_!F^pUA!~+Qx>p4+4LZdo1Bmo0qx6h#AYy4xnR1hZbWs_*`wZjZ_q2pY2!6FO=n+|`#uRK+nL;2;{fOdw0EfTMP*14F zCp63x8tfAq4)75sttnC*iUCsyV2?6JK)4p(LW3Xi>x?#rL1r=I;d(81A;UmMx!BD2 zHXDgm)~ylql*#B@@PfCH1#h7X-om7}J{e#Mm)Ve!%mt)4#b>HBH4We6JkPXre2;fl*Wxpc%h6|wGJN#>X8l`A z+qW=(7M%x)5>blC2TjAG5ShZnRCF9iAC)9eqYots%c1iOI^RIYj*eICoWR$U=sbtc z^RhH5G3a1C3L&mQOOM1Q><^-_Ia{=h{LA?pMJxk?e_Ls}j*3viJ_RWxfqx48UWt9K zv@!BOF(e3_BQj@J-ciLz0qJZF7rdk>)(wv89eZX0+?FNlV}9)ems^Bz*>t4lUXF-j zDj05`zMZisx!mwX?%mvofW0szo7GmrjYeygY@}6okZ{KXv|1yX&_M5Gy8Qtk{Xv@b zaauR5y)%_WaP5(P+^#$&cV}5dlm{SC0vMMq1o?f47lcIFkM|O-)}0ATANsoo21)ef z!scpi5>==(xBF+YIWbnSB9cXj^y@eY7pS zguZEX%;0$H1pKa0gUx6JQ0QsyTAoNiLEAAlG-P1M3k>(feu4;o4h~ddfZ7p|CIqB8 z0&;|aoYPC^01%}aHCI$?E@wKLy00{KJ2hbrP1Y4n z*6CtFlV|%#lXXoMb{|l^kY0a9Rqs@XI@C#5)JfARf;#Qz>LjNo!l6kOG^ul$%N&`j zh0N8C%myK|;fki=OQl^aWUjrUSxeI)=jO{Dws?m?;kiad08gLFMM=M>tUdvF*Qf80MW=}e_G$bCc;3MJN81aS>z zr3^zjYne_IA>zpYUfD?2S0OEo{1jv_!aa5`Fupf)>zBqdeuNubS_D1$g{4PQcR~2C za2V4wEEOzNrYy*{s(dA*BHZC}P!Ry;Koa}5n4ZcODp3}sZ?33f!U=b*qC5cyNuP4c zWXK1UD|erkLq9ISk>h;SvS>yz$yjCflnfHdO>K-MR&Kg3lKXIDl)@?-DB;L2A}~16 zsN4%(flUyjpV}Cun}B|2^q&Atb(k2HM)JJE81PM{6$W0M9stVXOz5L^vZv%dOdkk? zE*QQh14^9Hupe^&v3xoCdoFp!GEt`E7{^`!N3Uc*K>v@?5!0gYhv@u0I4+ggA;Gnn zY5&*9iyD_#g=)scC~kc!iOT$Y#Qh8=u~EV5tsP%^57F;p8anJyos2emDo3aY@k$Sr zL~g~D#j%0?Iyf#l431P2g`vT%L?W7r2yb5q8JASH7--|>ne%^K!4TU~#qAZcq*O=Z zQXz4v6Ff;3LQ;h@D$Ws=EktE|J<;)w=o}$B$7$+!m~4W{c3UQ^W$Ktaun0lwnA1xf zxhsX-l@}F`)tv(T&+X*9c3sKc1<9J2W(FSXm^OUmv@@S*{F8%@Dvovu%>nVZLuGYj zEpgQD6l!<=T;DxYdphln+%vhampLNo`xL{*Sv+FHn9K>)k#Zdc ziQ*2ej`mBT>5FR$$vUpMCf82|@2%9A3chym>99vpl+hF=o8yBp4dT{eZ%c$UK;S(; z+S$@4{J7%UXtIGzsn>E{wHah1ce1X6d#^TdxpIts`;3&!I~ zf1ebYR{w#`c0(44mirHEwF{Xf(k~0bI=M>`5u^)?AC_&@OKU~X%Zxczf0PwkuDUKd zB)}&F|AC!AR-`|)>B#_V0H@m<$*Gu$dH(yiBD)4mAbJ+8vWw0PCk0$Yo~6#d~87?ngV68PIv3V`CA`8W&?-_ z`YxjR)sg2Q^yZU~RqCkh8cTslO4at)mY#1_qE^jTYrmH5lEJ$|q>u=vU@({pjDJ41xy7Ahp zzxwVgVxABIQeK9kZy&w!&>M>+6c=MEb^215-zeKZZ27YC({``EOaIq-u5iO> ze|H}{GByeeI~D^@s9o|tlZAa9(dHsxAS#R9n3~QdV0DTr{Qm!z zHBj7Uml75tK-Ocf0E|)}^_NISmvkoEXj&vfBq zCu3v)a3^C%Kzz`*aq(>&lXNi?_=rEmd@7SgS{Y}0jw5}UkiP7WOc6OqP6RmP(_X4N zSv6Ns?RaCZzD`6*Do8WzE8}W*c9z?s7A~b(dr79%1VqeoH@} zI`C1#UT0#)OWh~C=ZYE}MXf?ntD|V6P_%J2apOYp2SDEmL?S-%Lss4PlZ7VUj+W&& z!`K`zOR&JB02yqKfwpP89GtgFr?|Xa0WKesw<$xxuTX&7swW%uv5PLrZU8v33x5au zfE;DVcQNcNI@s;lH_&+#o%85Cj?Qj$n$e*GgQ`?=+K&wwh%2Y!I`bU*ZlY6-P7OM> z=sY1guYt#mio+waj}^6d6!Cs#w=22AmeknW0cyW=KCAMs44$_Wh+od>p1U%5aO+zP zjah!$6WS9!)1@c&oJ_hagV#?s5XP^COhY1k-VIpcHwZHvDWe|ncz!sF;P0+d!F}G6 zstm;KpGGdJwb15gQp7@xG0-IWf=o(SV^SK`@TY;lU@4|I2G*ebI{l5IrT|kQLcuyz z7_3SK8N*EqV+5pAQCy)WWv|kx#nmv#r^y%z+e!*ku(*jd2Sy@g*h>h)D#@@x~+| z+=mp%)n8^z26{rdRc*;O9Ux0wB$3RR0%=k)oi8|Kp9T;~#`G^FGa0hafOI;_^>xNf zz>@`K4-h#|Ii^4!+o(6xlweAM*Hp?Ax(^2#Wdr?bZUlNjkh2(qFM!Vl_;fe?!s^Jw ztSO`ovlYFtQVE&n15k#s0J1CeEjMsM0c9$JGG!WDjK#2iS#nQ&FvOPvbe3_+f|xR? z)W)R?!m%v`*no`+Tr@>$q(2~|95Tu_RzNn(0Q{abKum%u82%}HwAfhe!DkTMw}XG-iz{ zrB`8WfcHXVG&IUqDg3_rUbOn6Xf1>S8ntmPFt2Ew(YLuGxHsR8u#Fvpp*IM}Vo_tf z`Tnyvo_u=#g-W%wFDvTSpjSS7 zZvI;@Qs|`xx|`3u1lxEb#Eq}NI)D7@KnRckyaa9b)*Iis@$jQTI_}Z+nOcq6y|oML z*8QxgmT|AFpN`f*yOVw}-w~&J!vWmBs|j|VB>|jmLljpYtL5Iv4Pw4WxbJVMqmHiOdI?msfFMk4zqp2IpMD}d z)TmmVo+P7MDw><9Xb({e_Du zW4M&NyAbgbWtIxb$5vYX*b1oEWm1UM&#JWgpN;q)E*`)SD36yYFEDDY{s)N}*079` zFinnHz`isew24+fv!{AD8e_ebSOWl~w-p7#TauU)X?eQ`sa^ZjP~XZ$1?n59{=@fz?tf?~|>!a;xhi8FK})kJRIwe|wylDq}og z_fSROJXFy)4^{L{Ct((6;b}5UsuThiCMA;^sgl+!ts1N(qyO0eX??+68=g+L4ch&r z=CEdpIrg6DI{>qI(aPitFo!)5v!}6oFq2~k{s!h!FU_`S#B7XtLB0spo;Kuzd)>Xb z^$D$?lftn);K_~GzCHiV)7Rg7^5*le&wua@QSL4()nRf?T)`HTd9|gx2ZTD6cw<3; zLj=11?pJkV3Gk|e(PmK$Fy@S5%eKQBT%1jJL53PeJKW4kE6!`*6{*S6WdS zTjfqy1jI_Y+>`qa``hzR9fx7l1GL@^)Lg0a)Z0C!T9jq(wJf><28GbeUH-VbvDY-t z{ug&=6URNh*=0*}DZxmB?H^_T3$k(f503Qp^$+*C0%6f(9r(d|0>!0Ei4pLEt5Im+ z1O{L%i!Ia@gh+b~gM$#D!+_uc^T=>F*emtJ^2rG63Ws(sHgj0`5bd;F3T%pOrc42o zw^!`{xr!v&T!HlmdrYHf|HWQHJYkYP-~nR`F+ASbZ|)h{Z(_R*V2cArNw5hgX%4O! zpt~E0@dS1E45Brb*}a|Z#g&h^B0b4h(|tTCaR`P})KIDs*6dOZ4i16o2fM$&$HW!^ zC<`m-GWISyFwvK>zvG&=X4^u=#USJ*`@hinH9FYd*x#Z9D+4n26Ljtc$1qqBk-3No zGQ&c-bC$!?OuLV`R^)NrhC~1}k>KtM+|0Yd+`n!0w><@VjQLM6tR0cvj+4cvycBXW z%&AHeGqP z2N$0jg_1@`Nsmy{Gh1SsE$HR*`+yI7VEX|csrAh7WU{a|%zW;=r7GFKmjg zsv($t(#NWpd$O;(sF|_xiEVT0_Ny6Xvl-<_>*my{baygUP^a1)>Q#bz)y(9ax@7_6 ziHWmmr;Uz+I-#J>QP3q6bj=oY&*tpn^#1&dKgB{)u_LKk zNUEMqs-04O9FgQq&bcEaDC*}~bnZRSunK47cboXsUVh&gh2HPX%t7e1E1_u=I`>bX z#>lw#&XVm{LUlAG`*Sm{3H>mrI;>@d>?i7)u+~c1KLsvrtC0Q6ion)#`A_|_T1(_V zE%8HtWnf#G{Acp4wj%k@iu}-D5!k*&&Xer+LOEaP2Y$AL`(Ec@noBDQFff-v0~a%N z{Jw>I#ro~F|9A|xqsfdh5Q$n)_pe^my%#zxMzdf|bnF)Tc5`|A6G=1Iv_C5`022j)qfZn$0#?Z~_P;S% z7U7=UuP4RlXZBYSCCrLs=0xtdmvm}TwrzxfiKSAZnJDJG;ozMm{y1{CvfW(gYpY{R zA&ERIlB9eY!0ITBX|C_wOM26J%G+QIuqzn2$ct-(a2iQr@o#~$k)%ezwrwa zc@K;gVZOrEzWEy2aQ>4w2{QNY-@QaazXB01f3O9#m|&SRlW^a9YgZ8aF&4`O&UwxE zzeO}o@WHk(i%87e`)|iHVTAkm?G=G75CWP=JUO3qVI%SXoXINK$bQa^&#X^I0$lPj zc92a%uw-;}=p>@Ua=)5+e3^IaqX9Fddm?lbgf5$+il_HuX-PN$q64;J$P8$>*WO7Y zJoi7|Nzo!smzoaNQYlVw-U4yX#=cfUS|;368Jv3mAc(eYc)jrQq(qtB-pi zHO<`8_pZjRN4htlvlX)pKxM(O8}x;4F7N#;o2QYnM<5rMl3F^OX^Rni(5Lx=EggPFGCuOfhA5RAxO3Q&B^ViU$4LRS*(!i)^= zH*r_qPm7~%REdaa&z?pfR;4SEGyFa=T4d#Y)xp(%&=Qw{)IEU!bksNC>lD7Gao_zQ zm2lj@d{AcFins#ICeT{?VQU*_Q0!rJZ0NA)(3+#$T-Y_m9WL0mcH1H0e2w)3v?BYu zL1wXN5Wt>5=XrDlOmYRCbabA>#9^Wu#y#|dNG>D%R`g}Zk92RkTx{Y?iAL!;0Xs7&|^ z!qDbWfds7t=U0a?Y!&$WUT^s2g!c8jRcsZ!ZDf~V5;&$I6Ad5C; zr@3GHV$7|F&QC*(PWIrn4>)-HfkCRve8 za7gc8x%of5ml7src19}O=>2IKKR-_WSqT%taH~HnC!4v0pADq{8cT{&2lylQwP?V# z2ylcSxBl}bN=!OY$eq2N#GU#4Bss*@{;3QGrtv@Zr9KT&`eYHwcMxp`I<&LV5i@{r z%%7{aVh3jpSmks;*@UlHr7l0qh|w_4?!YKI^t4eQ#xqzxIy4=@u=N;5r4255uxHVE zh&%b`f+E_o(jbk#KakIzp%0TX4FSX~~CMwC-j5PO+S^$4YTgoOh?UJ;}Z7CF2I>!tyn zV*76*NG4Oj*rT*$8ToH}yOv}sDZ`TN$s;7r{;ZZHF=c)i-qw$^5?kPwbro{FKNCv63 z=O>XiV!be#M4G_R_rhfzDO9D?5&3^1UB}R&nh6z@R6RkxhMlm-=Mi1F1N}~LpvLx~ zzyCr@9*HNU#onJ!^pF9UPnwc0!{#Wps5&B>j&YNj`WQ%Xq0g``4qkdSBW_9C*j;#EvV`>B^{MkK=@Balm8 zJ6iF?#t6nfVvjB+$u?R{TDWz{lUFc`4yoTlz;B~diea=WXYiHQ#ebr2D>?=Qqe{&x zOoxM(cp`!hl9%w+f({O8aF~f!*EWQ~GOEo>; z3}9%oFh@NCm;)! z*1&o2xstoxM${lT%@%WaFFP`X{R7Uw(e%w42904&xKnx#Wb8!`4vw@H8m_E1eN>C+enF z@@gGS)B`n+fIJ}}&l!{E)W$obQ=F;gw_(#T|5KS?V9@PgS!nbL6(5qu2c*$Gefz)G zkj(#IG>7KD(HwGsAD-sm-bs8=i?F}6mZavu{9^h&$8T=iFgW6LmLsr~jAGLVU*t*Ca=F&g!fiJ+3AlG6O5 zV))N4!}#U)BU?!nSz)(tg~1*bS9YcSe{Lm}N;;K^2 zdq`^*9r+?5O)H#|rR6+@u?B>q{Gj8^f7y2!Nx~W`9UIGZJ&gk6>$WJ3O&VF#1B#{ogeV8<=y(QEV`~Mmy`J(c40+pu3O<^|!s_QwyAiukjDaBuTeVaiqvbi+u?TM)_etAGQJZSuBwq zo!5a*Q4iXH6w60PM%jBfLmNA-KFU0=ETDZo2*4!8^!tbr)hkyp5^Jw|hU7p;9e9Q; z1>G7-jOvLvlu{Q8`}Q-Wjmh-C;QtMh7HD$?(=`^)RL6btj}{${*TT+=Wa8Ql-3*sQ zd)%rCAoe+Tas_lJyUYSvia#sC0YdyqJHTMU9$*12Rs0R$D9^2k4S^G7RwAXDR9F@4 zZ>$PXu_EPQgJJ*I6p~~=XCRSTaJ&TeXJJeP*AG=Hqw)oRWDx$)O2f)bDlL9oN=|~! z=x_D&p!B!;!%39@_em8n8$la(GdZTT1{`OO1uDR79zq~ZmjU7eeF~wpgo@~8G6@^2 z1VaI8k~gV5=3|g=Ra(M5X;tpBv&q&#?%bmZTiFnZ_iRvG10}L!0R-@@wV;Roi~-g_ zC|aP!v*m16N~s|{=mkIN?JGnfqZ{rY^lLj+lsRgv64GcWi-LWbV^wy*nY)gK738H? zA~(fKfKw_rr$8Q0s;pe`smKJY3iVRSI0Cp9t$>p}lPbi>P3=yUm%)iX;YL#IQ|hNQ zJ@S5t?1Ccg0K}8(NsU!a(G*xUzGyh+SUjMSPiiLBB6)7R{(u8;e$oQ85413D^yuoYdWzet-V`rx3%@lc2MU`>@w%zJ7h?an#giUYmdF zS$7sw-+?qYpMUGdlds|t@Dp0d(pHtSedmttT{%0t z^wu5QtvkBLf&rljF5VU)<)OP_pT2P(%>d><;O4*f1aS1`oA1G*hK?FofJMb?VqK3R zt=kvu=S#%mYAX;6INX%lo_$ONnm>9D5JFzKK9!}*_7q@($~ZYWeL45E;oAjMAq(~>r`z}?^?d0XevN_O zy^lBG#=Xr9hY;Xd$85kyEz^OI4rU`h(l*g8+0D#tCNxavOfQ~lxtfsl(%O@2`HU4a zBeMyuQ}xd5{GTV3P8a`O*mLXogwm;caIWbx?#Psphsg=W)%c9*p|>{9#aBA>md&IK zc~vJ{t|n%k*1TnzOI&eLYx_yUrGy_PLFD^sGsgGyLSEg;mg}iGr+3cO%`D}scg%GG zu_Loxqx_D2{Jukcu5~tbl24ett-%an(i<6TZ$94a(54GoFoj>iuWaR4wDE0&{LlnH zcnC^iCG-qLBeNCDw3gY1k8R9$d}P{o&?609j59u)*Ji_%T${?PQ?6>FPXwP;%xUs( zGqN#Y5m+&3>ll7;bgIswtrE0V7Zn$W_)WbZY5VTbC_tvEWA1~4z3(y7hJe4Fc<`~E zp(jAv7#pqjEL!V3ncWPp&469_$R6fud@}A(hw1)&CkTuF* z`mYIB{LoKU7^tA zM@NRuRQfK%jYgMhWXv);1}iN?hS466UIjU!(nr^_u7j>-2fc`eC8#50oLCvout94d zwGfqt>56j?(0-FjdvP$y&1KN8((@RU(XJ(jT-e0?LxoekqMa+K@kSd(AZs8m3g@c8>W%;o=MQ>ta7WL{f!V3PnXzqu*8Ox2UDFO#OjYafs~xcj{TE8 zMMI*wwZDi+aHkBVW%TnZQ;_P{o>V37RAH!H7{lFZeRNGYi>S4#kLW3(z71|T)x*{$ZX7YRGGZ67l{uCO2SW*{j7btVKxHhR3>Bd-{xZVmhK{4q@zzkP zG$x!)T%a_P$4-URNeItzIlD-T~YY~h3w}0NA4wl0hcOua1!(moBPn`o@Ts%8_!~W|0hjuR#ovxMr5!CV+_DRtAL=#exWuWAt zwPO~TYM%2btfG>Ss;Lci8oEY^J(nuJqJ_ru81XqeI&_``hbpUp-rYiuo&yBG$8g*R zfp8yofqwdg$k|&TJ`d9oCw|0x{~wyHjpmH)}$brRyJt z4Kd3eNRP^vCx1uz+S}_2JmCB zeo9qmsvo<8AR*eBj_e+A1>m+bs?StmhNF|lgH&raW5X0%x{r&RvJNa^rQExv-VX%1 zsfT^|H{Xr6QMwn2{voQ#HqaN2$Uf1^LgV?Q0zPS}QyqS-c!i_5MkubCEv~yOD+_FA z1a&^IPB<~*F?mcB)QQs}d{H%DSi{$J@Ed#h4kK@z0G-K7s1|mJw4esn!q{5zncRk& zqo$p4CZ_?a+e``d7fz|2iFuC15+SkVTs8cFudco;^ zr`hRNJ~ZW8MACHTm56L-O1>kdSV$>8S1_AWeZ0vTsheJVB{I(&uAfa=f#EjYbjy{< z;*aC=oVn$W+~q><@|l*|+$KII+gaIkLc?b+6=KRgHj>#wO!nz2e)&4SvgI-uI1cjL zhxnmUC;|(nn(){sP62Z2ut2f(j59`eO){{|72pi?h^S9O()FlJ+E9(86NEZu6C&8e zz!X6y%ilr~Y^4Y!jWkQpW}PnN-A9%C`GGOMe?KHXAm&{w&O2%r%scdS-VwQ(`B34d%2b0-phCP@qLH+Y#XYt)f6&5V=BOzkbg&}3M-td zyBeJ`oqe`$F1py6mV0W&%PY<)X4A?}23(Czn_hd?I2T(wqxew$j{5!Jt4S%->Cg9r znQ45&w0thU^p&2|+20=eD8AI0Rd`PRvTgF@+G|<4C)S?XbS*9GM8KIyXLPaeDa=v=yHs)bK25wxWqEgh#S(>A_*Ex)vpZ`_6Uxw}}N9h=)f z4xBjzGXzlm4~VUp~aJ@eToeFVG1A3xnATE!A<#J*;+(xma?Fu%#jZ#40yLpI(z$san*r{cXU%`l;W zRt!^`uy(wF1>8S@2`-@d+`J6B`6a)axV2@>-|JGr{gFHa-5fo*KaQ+k4v(LNRqNn! zxh$};(C_l9%*GtQf6Va%zhv7knQ+qmK36d8+2*=0Gr;AY1#7rCAkf*u{(PD2u~JyY zl|B7Jf_?QdxCjIk`bb5;Y|^h!_VrTl+AS>heG;$b9*T>CiG_W7H_;|q<*Wi0a^?L5 zZVZy0WuzVKNjL&+nfHm6%B+FqA!d?1TZ5`})z@PvNq5;O>3BZ6G`jaYS z$fUXt&K_CxZnQG1%988x2O2|-GAVaJbbO=M{!}KMQH%Md7H&L=2ss<(DO~V^!i9^4 zOMt>fSXG`P`bd3bxD|Vn3cuz^503n1L!d1DK#NCb?sv%rD5H1tmk~I=hes7sCPD;esqE zpW26DPm@}N9v#rL8tLJ-)~V&PfqDdv#!7{u7=M#tmIl!WI}mU!kir@UclSWMQcs58 zAG1!3iMT(e6=NzVwE*5O;qyKxBaJE6z<~|k5XrY+#{K~g>}^82_8U= zWE#_P4i5Vy(Z+zuXmOTj>6S3SL3^21E5dfv$t3F+sW(r?`D7gB&DgR_LeR^2h$yp0 zn@g>6=3--}Rcp+G$)i_fc1nIguLBd&D252?UnX8V=qgRQM#rHD<`uWR8DMn`8|=yYzc78^GUWs^wA92c0pM z<^&1lIuQV#Uq!%p-M~>PmG{XeLi(e$tdCC?P{MycT`h@csro=a5y#ZEc@c@eV=8QVrW=z`?ZCTCCt(W|2lzgp z0lvc1>iwjTPNBbB>)@p8lEI)AflaMOl|9T|Bq$j{bDb>mYguhJDb@C*)g zsX{Z)ay@)=X=f&+dIT z76+>#Bil=zHG8p-7??-BRS~zaDvWDrRt*3MY6V<{7qs>TzX#Qe)KAp{bx^A(JgSMi6Zv#1+Rg%7zA2x~1$p;87TYhE z!l2L37%6IoIuC)k5(OA#H~nBU)&9 zCjxC^NpMsbb!AXEC32}sdj<<18)$_^eX7y6OQM;`zE&!>2#sf593Z?^0ovlrwGo+6 z8D?fG=-52y$KRD`@IG0LyL*49^vc(bz=H}Z#m>?u6SB#-q55P9bsr;NW>HA0b&XZo zjk7BHvnmI4Zm-V+W+qCQnQW%YL*fgt=i=q*@K=3tug!~z?FJ+sUEPbtlcUxjTV93x z9R$&iFHOOg#VBwu>3>nCFcE_LmldgC)bsh*O3gJmHS7Glh^PP-!@j^6Z3^sAa^}fED%jSqG-ZV z0D9&Ep>!Ubair2Ml8j!_YgKZF|I~s}(pk?==3-NN6fS$|{CW_(w2yG{8-jqhP|e65 zhTE1$7EJKLdJA^9JoZ|!yY)KkwozdUQ*wn-DN+nN1Z?i%?k8N=d^S)T)L~$VmKp?Q zRYI^aNQ#vBDlQ55FmE{7+Y(cKTcS}#vtWGrCl-J8J;hh{F!a6@|HJ+rc-sp+y_;(H z6zJ(my?1TG2E&F&-nobFCaWF`Hkku@Rn7vv>Tj!ZImTv-R}a=pRoYJ$Q|Dmd<@QBu zIp4*OR^Y5S`SiEupr*EvzqFM4!}=-zW50)Tg71Ol{Muxmx10;sVCabZ=C31Fd5{6) z9dB_0;%TU!O800}-to$_4zqSK^70PnO(~E40>}fOmpr#gTs}3q^KD^2pDgfXrZBGe zDjwo+?Qbo(pASCc79E766m0z$l@|4j4HS`2dGmbBJ6wotky@|!$;MiP4-!~*0u(J0 z3Q)7*y96Fy!A5n5h};(=t*e5=1yEN?U-BT9g)*^@;+!o(yBlOj4?fqU<8g+rsat4luj za0D7yQZIq|{c~TGOq>I#P%Vx#_F_t(u~yYb*O)^li@i9(B50w`&ON1yEL>D~hXss~ z$r3A0WA|9G5J}czD1@IlJ<9VP7eRb2iUP!!QW9UbenbKi|9j*3S49V6`fMt=!SW_Y(iHHw=KYpPP*MDu;n+2-z(Ae+D2H> zHbs{;q0TDM)#5!CcsL5qfY7aQGh(<3Yv&Uw^o$A`6D&mG#XxNt#0`6TR&ye5LCQTN zBYSn?ec1HkGYx!{$Oc>C(oVHs2OKxhi53)_B4i{Fs)KkTsD2R|c$uypUmIqdNEo+bDdI z&!U5jS7uEFK|*ShyHY$|47~a`G#l{pDzkQEY|yA19Kp#%aZ$Wk+q zrGwk6L~LMGaU8jgXM!g}Hx2I{9yu_qt9R!;Q4BP-vnH?^K&n_1Txejn=+Ml7B6M5D z8a>3q0XIB|zeY4a`7=G}LvNdDhAs<+fwHb>?xoM-xFaJ0HAWdO(mqS<1Xj3X(V*%z zIehPtVgC#m7G5#nw+Gq3@bEuWg?&1oL}{f%pm2*!-=MpZal#)WZ2bW+Ay0#Jw`6}j zBD*7#Rn;(j&z_mF4-dU_=)Fn4edkA2J3pbppP6w@<12~DgbhKiqV?584HO7v;|(Bq*d0ETH`w1pZ+CI4 zVZfazI(KrD?tsBeE6$+9t3!0zXtsej_aiNM3ClzwK+@YJ+y}t_7U)Dy7JL#ww2Jzh z`Ann$cB$^AO7_r3TMbl;=Kvf{4xJWkqsMxXHE1;s7T&aRbi?H_(9_@s7;2=%0rBj! z=;+X)w=_gSZuRs#VA!aznc}T1x(OYGZx*j^6I+{Te_DXI)PY48@Z)J@h2NN^H@||# z^LlWTp%NGlm!z>L@ztMw5pzMaCss%Erv_0c@coiL0KNTHNh07yOyX(wkESM0# zKC9b9yFSgrTwuSnmPB!%#Eg`+Kuy9pgd-09_JermK^457k*-oP|8EM!F26t!h`4A* z1>zNL@8y)K_4cjDx6Y+hI8v&FlqyF`y^vD>QDnWK?fs0!`)?+)+J;R!7~O_o1Q)3U zY2Pz424gl0tTMP8pO^Ha#Yv~PDf|lB#{VYOZ2|XC-FLb8KC0IUDQiB8Tm#nlZmMJN zr&`nkL^|VGDB3rOXH+VH{Sxvu2G8hm#c}JnwpjnpBK-IZ4oNH)=*)d}u@Xb!)G9pK z|HL*QB4N+++Ubl z=5jR@W)Muv?kh}#kkar`WCIqamidf@V;!=I=xP`pC`-le=qdZ`5j%;hEsc9-ZNJMmq)e>CGC!qEkenbk21Fi83)}hY-tBpG6;UW zLkfk)fquVg?5Q8DPZz({X4=TRY^haHGYlLD{$D2Xu}N**8m5tK$X6-(|0bg%T( z-6uWoK`;@X-3AAg`-ct4Huuo!gz`^2TG)ygxzr&53QX~m7%G37;MElgG=iEj;no#x5})y) zw9Ah+G*RT@O*F0;NfD=aiok(nX*S^UZ?A8yYiwyJvdcQu~D}O2y(mhLmgr$0mN@r4cg-@}_b{ETTV% zHvz52q;k+%T`DO(^a}bJ8T}H`xch%%7WC>9oX5IC#SRTF3!k8bPk4)+`Yxuj;R!|j zN3w@j6O6do)8a+~*@{ zyf`KS-Ox7iJ_FEiZLV0ieYn)>#FmaT5tnv1ToLZk?cKa|h0z}5u_uSAj4NCW@|~l= zhp4clb-QOFc&7rs;+YLs6ty|0?cKH??(4xoG(mTz!lh6&8#vL4vmjuJ8$q|!v|X{D zej=jw#F*KCM{esD!Lfi8@yZT7Vd@HIZQ{{Xqx%49=)JQUky-98!2S|j@xNn@MY*{q zbq%`- z_qh@vLOha(GjJ+a+(!WDL0DSBsDmI7y*AUOFu}aT6#_aYR2Coesu@m z(arA~;=70Wq>(xG=rwhmL!Bk4v(CY}&|UmK8?Vm70|M2|r>U~MvU58fWsO2vBiQNR zm9@(QlOW~MrW0@{b*3Y!P)I6tB$WzDrL#$8N86k+S&o=IAtvui%-VAqGeH+^>)#3H z%NzKjwMQGB@rg&*IagNk>eTD0%bam(R}<2v+s<`eteZ`M$Q(y}tq@;(HM+nNT_!}A zIignz(JMa<^iK=s)ycQRtL2)c1qR-HdhNwlN8Ki&ZWCX-ncobB>gT%$_yM%iKPa9W zwH+XEmo*#+Za@qFFgQ=El!YZbLUV-BoO2wR~s}rs!lATn;^5etMN7 zcZHCH*Z*@DMo@c}r72|cB|6^^39TMx4jAG>XE?h~FY ze47j&sTNAb7~`y5>!|DzDtnyC1&-tfA-TbsUg%6KzU?ntZX|bQisj)`s!!Cin6%Tm zj-1LXIh9w7*E)*ZgyJ?w@g|{o6R*vh(-t_Fz)jZ!K*|m{-2kNE1G3pJotWJK->t(l z(FP3NAX2s)KAHw^r6xEr3pffrw*7bl_q6}HU`J84Ko65#)L(AAyqw>>jqeJ=XQQapJT_MK+kpvD~17f7qEt<|y7F6z^~*^+mm)TX%Vg@9G86Wl4NO*{4dGE{C_})c$DWTym2$e~lx*S;%jm&2NE&*D2e` zbUl2z{M4bB4}E)bCU`b$jk9GvpWP&MY=yJa5DlmGS5yJlkP(C9j={si;9=m)5U>aM z2BGk>0^(vSuE%HanJeD6{AlCM;9PvOuyH?tt!8#H&K0dEY%Qk?goI_z1l>!`Cz~A! z`9ebeIschpM@6Gh(a4uKUDop(yZDZs!1``N+iBr$%ptJ{yJ}IDqp)2lYJOg?cE%@7=U<60yqc^(Z7X;` zeJ;6*uioIO-X>H-Q{MAYb-yz;6K@)Dq?QS(Wi!f|@tM7R z9+_%o=;sH^*W+=Ov<-|iQ8(RsC9wpvkaFm7RCfy1&>{OjsveMXur0^}E}EZ&g4zH# zWHBM)9*4VtAh1n5CsV$GX3;^jXuOh`@6F<3qN93~P`!!YZ2YL&B;~Lm1M{5aAmEyS z4geXz!F?N|w!o#A@MvP_X|VDZyb~a;mFBSKxh|)^{JExUQUw(X35DmfW(quCX}sKs zl64b)g4iIPe4-+?hG{^o4NN0GiklE?B7CDb5o_pnsw_Ltk+s$)WUX~(7CYczSLRY@ zdKrA>FuM^1oIE><*QP`BmM%efKyT(Z9{}Xza03B64vOW-YNlOx9dkW35AN0%Kb+}I z0DrMlm+wr>`c$P%i<)YND;Ad9)(}T!yHMFaTe*SCk8+Rvpl6v5oIdO*TrCu?<_oGX z#$H}_IhWtGmmfSJHh6w7%Foq|`-_w(G@7x>9Fi zws_FbnOXH|NMHd}M$V^NS$3r}dzCZ2$dSH6NMGU9Z_p*-O!$R+2 zo_;yoT`|cu41QRlz!6g>#FWh~U31w4U(E*g93%}kk#}7p@90-U`}RUwke&On zm(<8X>Xg@_8(Sy8TDHzn)*+O2ILbPOvQGG(>Re2TGba7C{B+NmKq031gxYgVk)AZ{ zJ2&iD+8``#;LFxt4&*m%=hyFmPcqo}T|IoakC5G$3S*KVthaeEepg`7qkj21Z@?u9nAIorM7c6 zM|r1E-Z`7U{f;ao@(_XVPMjboR$bK>olCkH$G5?_haZ3t3`TyJiErth)%TqUzRhT2 z50SquwfUVEpklwMc8rN*e?3FRLm}0;Y>8``k29C>WiYPIW^Ovs;7llSBrJm=VJ2%X zp~jh(b86MMR$X1W(Xn#7uyVU&lhKcP@8km|xj)xs%`8?bzBUZ0+N> zz?W+W_@cdnZtt|(sY^eldRZm5>2rNE!;V#Lg8K#$5cNI$HXEFT#oJ;mqUdtp8B@zp z?zM_qN-KO#7Fdc8NZG>d#79{-vNB~C^T*o}$TkpYF}aTDVj;SC&f7M&31!=^L~rvn z1^lYV>4tNyjwSU1y|Ko2v7c|>cKHzBDfZt0T zsI9LN%GU5p8ZM6W>usHU`*wc&4nDW*Q$KlZ+@}Gu8nTA`B=J(><;mIVF50kHeHtoT zR!zh)*-_CVRJ6=iwDB7ZLWRLmJ}Q)t&X%)$Xxd!p5@%tJqp(RRY`WY5!!k@Hgu-q| zL9bBIJ6o`aCdqZS_x`-1?{ex)_=j=t*y27&xKhzaW6EwTLc==A0)>;$UUTuVqhYJi zu$5o4jo$`Magg5)r+i2F%+WdRzH8c4hc;gTEi*CC`Tx}REkJQyXPSMxX=tE0FJW@l5`mZjaX`8qq|da2_l(J2vh%Ot|$E z{?}Z1uTwO4KK5MaiJd(qONZt+kzYv^G;eJq3QEO}^kAWzih-RWRmr`ZBck~%P-W7<5VB?@g< zf+9R#(iDoC!n^5AQ|Q(l_Gq*|?a(f$hkmL0X1$bCDdtqN?0szCaj5)a$H94*N2)DU zHl0F0l}$SEt0DP{H;hZdDJpiSlv8vF^xoIW%e3-3-E=7%RX9v3t#q)en&^b$>9Lix2m0cVc1kzRT2Q)ODBigZ_k_C+mScUs!>z@_ zOp>HEi(2#D(@blIS$I!e<^wHMR>dP;pFL?+D~tsnE7a(IAMS2DSX!w&t;%C6zf;f3 zq3HqhfU~TBgyoLD)Z$6YztwW5_j?^;+Wwb10)4Ez#?{VxjbED#c2gBp07_N+sQ5NjL8V3Ija|J0`2B;6wYX^3c8$(L%PCaZO{TJ#-Ei@h$Dc z0u4H#-L|W49=_En71xQyb*!lV?)3fedskTx6^gy52Hx_zmL)PO$ndCzEx5dbiaMRgF1XaT525>TL;-;ELe;&+Z-F4XY**KFR=@k zSsoSRCRnTYDIjZ8di>=C0|i&`C~_n5WYD;h#ty!5Wp%q$-6K}_u;X^-xXkQVSpSk( zO`T6Q?|a}v2GvMIQqhB?3Quyelw7%yTnQ}h@s1(|eq`dQPzY zgDj=QowDyAK85Nzr0=sQ>3^v19=*M|fAUjzpvQOpGk5v_hr0Yvo<#p+Gt2d*a_gTz zvs_;)w}Lb46FIYf#ULM06N8yV%Ss|R|03isVgXH{LSdw_KvXU9*l!C7`yMUvz4ZM{r3*Df{vA9w<|Ue&5oXA_8Uhn z_IuWo8m{XV@8%y#uviO}f78&XrsGFytJ-3T4EY}s)@Zu^U;7d*&Gn(bf<7Eei%R*K zx!y7ms`#xw++xwFew)&mW3i}I>xb$Dx?Z=a@G>1E!!6dluyu=}G0bAk3R}0PxBQUDIY^4EGPG?)(3P=>6Vifs`ZlKjTshM)X>6h(Aff^16c%ZgmklK=O)xzo48u*U?OUW z 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 delta 14351 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 diff --git a/ddms_compliance_suite/input_parser/__pycache__/parser.cpython-312.pyc b/ddms_compliance_suite/input_parser/__pycache__/parser.cpython-312.pyc index 001770697ed5b22eb49448605a3e01f6f2decc01..7c114be91af36d62883c9bb09e181c35c14c7f41 100644 GIT binary patch delta 23 dcmX?gp7GRq#tqThjJGz&XbYGDsoca^HUNIt355Uv delta 23 dcmX?gp7GRq#tqThjK4O=XbYGDsoca^HUNP)3B>>a diff --git a/ddms_compliance_suite/models/__pycache__/config_models.cpython-312.pyc b/ddms_compliance_suite/models/__pycache__/config_models.cpython-312.pyc deleted file mode 100644 index 9da7cc934cc6d1c0f7277f1ab580814710f02301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3264 zcmbVO&2JmW72o9!$t5L<`eIUl(-ItWEnAc$wsIZkL!v$`SEgLbP74CXV$B^%+w79; z?$R{{6yTu-)I$O06a~5Hm>@m$|LBFn>Oc)pv_Ma}1u%Qbsqf9MXohAlA+T>}es6}e z@ArQ5X8w^##0B_W{`>X)zs3aNKiE0{g@eZH4m7?HbfF~Zq8>6uD^v=J*p^JmA|+yl zOJOTgiiko;*bsE`XF(6s(6^F5zZB(Y1kh+7Dsxl@G}ed4I2s3Zqz{dAbQI7;A3DO( zF+h`j=qN|W0iEbW6C9lcbgB;>YfLMtgZU>7U8}f8Ic-&SYC7rNs-4zqHPa|-u2HR| z%hk%Ru~)ZwZ~i+BOA%RYMRVw5oS{fe-mc+L&17WND7!4WWw_MV%(BmcZ%NR3eIFWM z2vjJEKx*h2P+5{FpiqI&PX^h5pLl*$S2fPHm4M_>JvguxPdJ7TzHHRMV;LC~+pMYDKfCs8V+Y5}2I1^T*fIqI9f>ePX&tj|4+L$2||AQSVohArb-Xrk~qvtV8col94m z+pQgsTGkwnEFePgIbNQQ1@CgIryK|Fk1$I87+)KI*PvcYr$l zZW|3waI#>4x(_y*tA{t+lS?P@dmh>7T%3h|rnUH&J06+s+?;EZRO{uj^!cAo$(&Ct z{=;x$AA+Z!*pNV_Zvn$!iBJj16*-Y1Bv+RLBKc<3!zJ9tVLifWjRLLHNNbVSs*VBN zHUeg&j!!fjGc}hwu1YJ~bCc>o^DL~x5&`T0*(POS`ci``^RsgW2HHbfVftQUoh52E zHLIGg@)Q)_W}5Sc`@m=VJ#2B}Z{m97d9`W|QhgoApg|Qnb6{QxXV>5NuIHK??Zj1& ztt6A0SlhYB1UgiSsL zX|27a<$AA-t+NzJucpGD+%;?v-mYetb(A;!4x}5Ft3E~ zBf@M3ix>#trvLpoV)*y}L;<95FWK$}t-yKP3yYE8J5Y-ydkNNKWZ$(+CcOlcfOD}{ zhcJ2a4q{NF_*?md<0K3DI`U`ZR!5tMO_20SsunU&jmljT@?t0{Y z=iQm+uUb>5WX2~2hYu&^Z{Yd=Nrh4r>6M}=jhxqcz~vqugPTNfcK|%z!$)WwaK4iO zAMN1@Itn;1Sb&f9@FX1roSzSXkN5BiIu5wZ3tS8?7_sGA&EJg&snylTJL!Dy=uhw9 zQO{(!T=7c?i<hMEXeQ|#3vLseA6|?16PL}WsWgurZ?k7^+ zJ6A$MnH-exM?j~aH7;Sk0Y65J-!eYI7S=X<84U{AUO~gPoyQi>?kcthKAXAg%`7$_wUQoLJX?C=Efrylv@hj6Qaro; ziFbRYx!q1F9$7id-1jmMnvdI4H$3v-Y(DSJueHf^`<=N{vgRuXS1c$=7FAWfT84|9 zTnjFI2Lhhf!)qe@MPJ~-sIVAqPWpo92b>pJAa2)Fj@aoEvc>4(2@am3AV*2Qp*iLsx oL*k~`+QbQ)VmB^{nWGEn$zXf-2psV0#-rl8*oysEz&DTof3jltT>t<8 diff --git a/ddms_compliance_suite/models/__pycache__/test_models.cpython-312.pyc b/ddms_compliance_suite/models/__pycache__/test_models.cpython-312.pyc deleted file mode 100644 index 86e3d0011e02c1e1a9100f6fa07e539d9d1e086d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9344 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 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 new file mode 100644 index 0000000..cb5c0b3 --- /dev/null +++ b/ddms_compliance_suite/scenario_registry.py @@ -0,0 +1,90 @@ +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 new file mode 100644 index 0000000..c354819 --- /dev/null +++ b/ddms_compliance_suite/stage_framework.py @@ -0,0 +1,454 @@ +""" +API 阶段测试框架模块 +""" +import logging +import time +from typing import List, Dict, Any, Callable, Optional, Union +from enum import Enum + +# Add Pydantic BaseModel for APIOperationSpec +from pydantic import BaseModel + +from .test_framework_core import ValidationResult, APIResponseContext +from .api_caller.caller import APICallDetail +# Import ParsedAPISpec and endpoint types for type hinting and usage +from .input_parser.parser import ParsedAPISpec, YAPIEndpoint, SwaggerEndpoint + +# 尝试从 .llm_utils 导入,如果失败则 LLMService 为 None +try: + from .llm_utils.llm_service import LLMService +except ImportError: + LLMService = None + logging.getLogger(__name__).info("LLMService not found in stage_framework, LLM related features for stages might be limited.") + + +logger = logging.getLogger(__name__) + +# 定义 APIOperationSpec +class APIOperationSpec(BaseModel): + method: str + path: str + spec: Dict[str, Any] # 原始API端点定义字典 + operation_id: Optional[str] = None + summary: Optional[str] = None + description: Optional[str] = None + +# 默认的操作类型关键字映射 +# 键是标准化的操作类型,值是可能出现在API标题中的关键字列表 +DEFAULT_OPERATION_KEYWORDS: Dict[str, List[str]] = { + "add": ["添加", "创建", "新增", "新建", "create", "add", "new"], + "delete": ["删除", "移除", "delete", "remove"], + "update": ["修改", "更新", "编辑", "update", "edit", "put"], + "list_query": ["列表", "查询", "获取列表", "搜索", "list", "query", "search", "getall", "getlist"], + "detail_query": ["详情", "获取单个", "getone", "detail", "getbyid"], + # 可以根据需要添加更多通用操作类型 +} + + +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测试阶段的基类。 + 一个测试阶段通常针对一个API分组(如YAPI中的一个分类,或Swagger中的一个Tag下的所有API), + 并定义了一系列有序的API调用步骤来完成一个完整的业务流程或集成测试。 + """ + id: Optional[str] = None # 唯一ID,例如 "TC_USER_CRUD_STAGE" + name: str = "Unnamed API Stage" + description: str = "" + tags: List[str] = [] + + # 由子类定义,表示此Stage中的API调用步骤 + steps: List[StageStepDefinition] = [] + + + def __init__(self, + api_group_metadata: Dict[str, Any], + apis_in_group: List[Dict[str, Any]], # 当前分组内所有API的定义列表 (字典格式) + 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.llm_service = llm_service + self.global_api_spec = global_api_spec # 保留 Optional[ParsedAPISpec] + + self._operation_keywords = operation_keywords or DEFAULT_OPERATION_KEYWORDS + self._matched_endpoints: Dict[str, Dict[str, Any]] = {} # 存储按操作类型匹配到的端点定义 + self._match_api_endpoints_in_group() # 初始化时自动匹配 + + # 确保子类定义了ID + if not self.id: + self.id = self.__class__.__name__ + 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) + + + def is_applicable_to_api_group(self, api_group_metadata: Dict[str, Any], apis_in_group: List[Dict[str, Any]]) -> bool: + """ + 判断此测试阶段是否适用于给定的API分组。 + 子类可以重写此方法以实现更复杂的适用性逻辑。 + + Args: + api_group_metadata: API分组的元数据 (例如 YAPI category name/id 或 Swagger tag name/description)。 + apis_in_group: 该分组内的API端点定义列表。 + + Returns: + True 如果此阶段适用于该API分组,否则 False。 + """ + return True # 默认应用于所有分组 + + def _match_api_endpoints_in_group(self): + """ + 在当前API分组 (`self.current_apis_in_group`) 中,根据API标题和关键字匹配操作类型。 + 并将匹配到的API端点定义存储在 `self._matched_endpoints` 中。 + """ + self.logger.debug(f"'{self.id}': Starting API endpoint matching within group '{self.current_api_group_metadata.get('name', 'UnknownGroup')}'. Found {len(self.current_apis_in_group)} APIs in group.") + if not self.current_apis_in_group: + self.logger.warning(f"'{self.id}': No APIs found in the current group '{self.current_api_group_metadata.get('name', 'UnknownGroup')}' to match against.") + return + + self._matched_endpoints = {} # 重置 + + # 尝试从API定义中获取标题的优先级 + title_keys_priority = ['title', 'summary', 'operationId', 'description'] + + for api_def in self.current_apis_in_group: + if not isinstance(api_def, dict): + self.logger.warning(f"'{self.id}': Found non-dict API definition in group, skipping: {type(api_def)}") + continue + + api_title = None + for key in title_keys_priority: + title_candidate = api_def.get(key) + if isinstance(title_candidate, str) and title_candidate.strip(): + api_title = title_candidate.strip() + break + + if not api_title: + self.logger.debug(f"'{self.id}': API definition (method: {api_def.get('method')}, path: {api_def.get('path')}) has no suitable title/summary for matching. Skipping.") + continue + + api_method_path_log = f"(Method: {api_def.get('method', 'N/A')}, Path: {api_def.get('path', 'N/A')}, Title: '{api_title}')" + + for op_type, keywords in self._operation_keywords.items(): + if op_type in self._matched_endpoints: # 如果该操作类型已经匹配到了,则跳过 (每个操作类型只取第一个匹配项) + continue + + for keyword in keywords: + if keyword.lower() in api_title.lower(): + self._matched_endpoints[op_type] = api_def + self.logger.info(f"'{self.id}': Matched API {api_method_path_log} to operation type '{op_type}' based on keyword '{keyword}'.") + break # 当前操作类型的关键字匹配成功,跳到下一个操作类型 + if op_type in self._matched_endpoints: # 再次检查,因为可能在内层循环break + continue # 跳到下一个操作类型 + + self.logger.debug(f"'{self.id}': Finished API endpoint matching. Matched operations: {list(self._matched_endpoints.keys())}") + if not self._matched_endpoints: + self.logger.warning(f"'{self.id}': No API endpoints were matched to any operation type within the group '{self.current_api_group_metadata.get('name', 'N/A')}'. Stage execution might fail if steps rely on matched operations.") + + + def get_api_spec_for_operation(self, lookup_key: str, global_api_spec: ParsedAPISpec, api_group_name: Optional[str] = None, required: bool = True) -> Optional[APIOperationSpec]: + """ + 获取为指定查找键 (API标题、操作ID或 "METHOD /path") 匹配到的API端点定义。 + 此方法现在直接从 global_api_spec.endpoints 中查找。 + + Args: + lookup_key: API的查找键 (通常是标题、操作ID, 或 "METHOD /path" 字符串)。 + global_api_spec: 已解析的完整API规范对象。 + api_group_name: 当前API分组的名称 (可选, 主要用于日志)。 + required: 如果为True且未找到匹配的API,则记录错误。 + + Returns: + APIOperationSpec 实例,如果未找到则为None。 + """ + if not global_api_spec or not global_api_spec.endpoints: + self.logger.error(f"'{self.id}': global_api_spec 或其端点列表为空,无法查找操作 '{lookup_key}'。") + if required: + self.logger.error(f"'{self.id}': 未找到必需的操作 '{lookup_key}',因为API规范为空或无端点。") + return None + + self.logger.info(f"'{self.id}': 正在从 global_api_spec 中查找操作,键: '{lookup_key}', API组: '{api_group_name}'") + + for endpoint_obj in global_api_spec.endpoints: + # endpoint_obj is YAPIEndpoint or SwaggerEndpoint + match_found = False + # 1. Check by "METHOD /path" string + method_path_key = f"{endpoint_obj.method.upper()} {endpoint_obj.path}" + if method_path_key == lookup_key: + match_found = True + + # 2. Check by title + if not match_found and hasattr(endpoint_obj, 'title') and endpoint_obj.title == lookup_key: + match_found = True + + # 3. Check by operationId + if not match_found and hasattr(endpoint_obj, 'operation_id') and endpoint_obj.operation_id == lookup_key: + match_found = True + + if match_found: + self.logger.info(f"'{self.id}': 找到匹配操作 '{lookup_key}' -> Method: {endpoint_obj.method}, Path: {endpoint_obj.path}") + + raw_spec_dict: Dict[str, Any] = {} + if hasattr(endpoint_obj, 'to_dict') and callable(endpoint_obj.to_dict): + raw_spec_dict = endpoint_obj.to_dict() + elif isinstance(endpoint_obj, dict): # Should not happen if global_api_spec.endpoints are objects + raw_spec_dict = endpoint_obj + else: + self.logger.warning(f"'{self.id}': 匹配的端点对象 '{lookup_key}' (类型: {type(endpoint_obj)}) 缺少 to_dict() 方法且不是字典,无法获取完整规格。") + # Fallback: construct spec from known attributes if possible + raw_spec_dict = { + "method": endpoint_obj.method, + "path": endpoint_obj.path, + "title": getattr(endpoint_obj, 'title', None), + "summary": getattr(endpoint_obj, 'summary', None), + "description": getattr(endpoint_obj, 'description', None), + "operationId": getattr(endpoint_obj, 'operation_id', None), + "parameters": getattr(endpoint_obj, 'parameters', []) if hasattr(endpoint_obj, 'parameters') else [], + "requestBody": getattr(endpoint_obj, 'request_body', None) if hasattr(endpoint_obj, 'request_body') else None, + "responses": getattr(endpoint_obj, 'responses', {}) if hasattr(endpoint_obj, 'responses') else {} + } + + + return APIOperationSpec( + method=endpoint_obj.method, + path=endpoint_obj.path, + spec=raw_spec_dict, + operation_id=getattr(endpoint_obj, 'operation_id', None), + summary=getattr(endpoint_obj, 'summary', None) or getattr(endpoint_obj, 'title', None), # Prioritize summary + description=getattr(endpoint_obj, 'description', None) + ) + + # If no match found after iterating all endpoints + if required: + self.logger.error(f"'{self.id}': 在 global_api_spec 中未找到必需的操作,查找键: '{lookup_key}'. (API组: '{api_group_name}')") + else: + self.logger.debug(f"'{self.id}': 在 global_api_spec 中未找到可选的操作,查找键: '{lookup_key}'. (API组: '{api_group_name}')") + return None + + def get_endpoint_lookup_key_for_operation(self, operation_type: str, required: bool = True) -> Optional[Union[str, Dict[str,str]]]: + """ + 辅助方法:为指定操作类型获取可以直接用于 StageStepDefinition 的 endpoint_spec_lookup_key。 + 注意:此方法依赖于旧的 _matched_endpoints 机制。如果主要查找机制已改为 get_api_spec_for_operation(lookup_key, global_api_spec, ...), + 则此方法的用处可能有限,除非有Stage明确需要通过通用 operation_type ("add", "delete") 来获取 method/path key。 + """ + # This method implementation relies on self._matched_endpoints which uses generic operation_type keys + # It might conflict or be less useful if the primary way to get spec is via specific lookup_key in get_api_spec_for_operation. + # For now, keeping its original logic related to self._matched_endpoints. + # Consider if this method needs to be aligned with the new get_api_spec_for_operation behavior or deprecated/refactored. + + api_spec_dict = self._matched_endpoints.get(operation_type) # Uses generic keys like "add" + + if api_spec_dict: + method = api_spec_dict.get("method") + path = api_spec_dict.get("path") + if method and path: + return f"{str(method).upper()} {str(path)}" + else: + self.logger.error(f"'{self.id}': 从 _matched_endpoints 获取的操作 '{operation_type}' 的规格缺少 'method' 或 'path'. 规格: {api_spec_dict}") + if required: + raise ValueError(f"为 '{operation_type}' 匹配到的API规格无效 (缺少 method/path)。") + return None + else: # Not found in self._matched_endpoints + if required: + self.logger.error(f"'{self.id}': 在 _matched_endpoints 中未找到必需的操作类型 '{operation_type}'。") + return None + + # --- Stage Lifecycle Hooks --- + def before_stage(self, stage_context: Dict[str, Any], global_api_spec: Optional[ParsedAPISpec] = None, api_group_name: Optional[str] = None): + """在阶段所有步骤执行之前调用。""" + self.logger.debug(f"Executing before_stage for '{self.id}'") + + def after_stage(self, stage_result: 'ExecutedStageResult', stage_context: Dict[str, Any], global_api_spec: Optional[ParsedAPISpec] = None, api_group_name: Optional[str] = None): + """在阶段所有步骤执行完毕后调用(无论成功、失败或错误)。""" + self.logger.debug(f"Executing after_stage for '{self.id}'") + + def before_step(self, step: StageStepDefinition, stage_context: Dict[str, Any], global_api_spec: Optional[ParsedAPISpec] = None, api_group_name: Optional[str] = None): + """在每个步骤执行之前调用。""" + self.logger.debug(f"Executing before_step for step '{step.name}' in stage '{self.id}'") + + def after_step(self, step: StageStepDefinition, step_result: 'ExecutedStageStepResult', stage_context: Dict[str, Any], global_api_spec: Optional[ParsedAPISpec] = None, api_group_name: Optional[str] = None): + """在每个步骤执行之后调用。""" + self.logger.debug(f"Executing after_step for step '{step.name}' in stage '{self.id}'") + + +class ExecutedStageStepResult: + """存储单个API测试阶段步骤执行后的结果。""" + class Status(str, Enum): + PASSED = "通过" + FAILED = "失败" + ERROR = "执行错误" + SKIPPED = "跳过" + PENDING = "处理中" # 新增:表示步骤正在等待或预处理 + + 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, # 记录此步骤的API调用详情 + 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 + ): + self.step_name = step_name + self.status = status + self.message = message + self.validation_points = validation_points or [] + self.duration = duration + 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 # <--- 设置属性 + + def to_dict(self) -> Dict[str, Any]: + vps_details = [] + if self.validation_points: + for vp in self.validation_points: + if vp.details and isinstance(vp.details, dict): + # 尝试序列化 details,如果包含复杂对象 + try: + # 只取部分关键信息或确保可序列化 + serializable_details = {"passed": vp.passed, "message": vp.message} + if "status_code" in vp.details: serializable_details["status_code"] = vp.details["status_code"] + # 不直接序列化整个 response body 以免过大 + vps_details.append(serializable_details) + except TypeError: + vps_details.append({"passed": vp.passed, "message": f"{vp.message} (Details not serializable)"}) + else: + vps_details.append({"passed": vp.passed, "message": vp.message}) + + + 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, # <--- 添加到输出 + "status": self.status.value, + "message": self.message or "; ".join([vp.message for vp in self.validation_points if not vp.passed]), + "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 + 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()} # <--- 添加到输出 (摘要) + } + + +class ExecutedStageResult: + """存储整个API测试阶段执行后的结果。""" + class Status(str, Enum): + PASSED = "通过" + FAILED = "失败" + SKIPPED = "跳过" # 如果整个阶段因is_applicable_to_api_group返回False或其他原因被跳过 + PENDING = "处理中" # 新增状态:表示阶段正在处理中 + ERROR = "执行错误" # <--- 新增 ERROR 状态 + + def __init__(self, + stage_id: str, + stage_name: str, + api_group_metadata: Optional[Dict[str, Any]] = None, + description: Optional[str] = None): # <--- 添加 description 参数 + self.stage_id = stage_id + self.stage_name = stage_name + self.description = description # <--- 存储 description + self.api_group_metadata = api_group_metadata or {} + self.overall_status: ExecutedStageResult.Status = ExecutedStageResult.Status.PENDING # 默认为 PENDING + self.executed_steps: List[ExecutedStageStepResult] = [] + self.start_time: float = time.time() + self.end_time: Optional[float] = None + self.duration: float = 0.0 + self.message: str = "" # 整个阶段的总结性消息,例如跳过原因或关键失败点 + self.final_stage_context: Optional[Dict[str, Any]] = None # 最终的 stage_context 内容 (敏感数据需谨慎处理) + + 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 = time.time() + self.duration = self.end_time - self.start_time + self.final_stage_context = final_context + + if not self.executed_steps and self.overall_status == ExecutedStageResult.Status.SKIPPED: + # 如果没有执行任何步骤且状态是初始的 SKIPPED,则保持 + if not self.message: self.message = "此阶段没有执行任何步骤,被跳过。" + elif any(step.status == ExecutedStageStepResult.Status.ERROR for step in self.executed_steps): + self.overall_status = ExecutedStageResult.Status.FAILED # 步骤执行错误导致阶段失败 + if not self.message: self.message = "一个或多个步骤执行时发生内部错误。" + elif any(step.status == ExecutedStageStepResult.Status.FAILED for step in self.executed_steps): + self.overall_status = ExecutedStageResult.Status.FAILED + if not self.message: self.message = "一个或多个步骤验证失败。" + elif all(step.status == ExecutedStageStepResult.Status.SKIPPED for step in self.executed_steps) and self.executed_steps: + self.overall_status = ExecutedStageResult.Status.SKIPPED # 所有步骤都跳过了 + if not self.message: self.message = "所有步骤均被跳过。" + elif all(step.status == ExecutedStageStepResult.Status.PASSED or step.status == ExecutedStageStepResult.Status.SKIPPED for step in self.executed_steps) and \ + any(step.status == ExecutedStageStepResult.Status.PASSED for step in self.executed_steps) : + self.overall_status = ExecutedStageResult.Status.PASSED # 至少一个通过,其他是跳过或通过 + if not self.message: self.message = "阶段执行成功。" + else: # 其他情况,例如没有步骤但状态不是 SKIPPED (不应发生),或者混合状态未被明确处理 + if self.executed_steps: # 如果有步骤,但没有明确成功或失败 + self.overall_status = ExecutedStageResult.Status.FAILED + self.message = self.message or "阶段执行结果不明确,默认标记为失败。" + # else: 状态保持为初始的 SKIPPED,message也应该在之前设置了 + + def to_dict(self) -> Dict[str, Any]: + # 对 final_stage_context 进行处理,避免过大或敏感信息直接输出 + processed_context = {} + if self.final_stage_context: + for k, v in self.final_stage_context.items(): + if isinstance(v, (str, bytes)) and len(v) > 200: # 截断长字符串 + processed_context[k] = str(v)[:200] + '...' + elif isinstance(v, (dict, list)): # 对于字典和列表,只显示键或少量元素 + processed_context[k] = f"Type: {type(v).__name__}, Keys/Count: {len(v)}" + else: + processed_context[k] = v + + return { + "stage_id": self.stage_id, + "stage_name": self.stage_name, + "description": self.description, # <--- 添加 description 到输出 + "api_group_name": self.api_group_metadata.get("name", "N/A"), + "overall_status": self.overall_status.value, + "duration_seconds": f"{self.duration:.2f}", + "start_time": time.strftime('%Y-%m-%dT%H:%M:%S%z', time.localtime(self.start_time)), + "end_time": time.strftime('%Y-%m-%dT%H:%M:%S%z', time.localtime(self.end_time)) if self.end_time else None, + "message": self.message, + "executed_steps_count": len(self.executed_steps), + "executed_steps": [step.to_dict() for step in self.executed_steps], + # "final_stage_context_summary": processed_context # 可选: 输出处理后的上下文摘要 + } \ No newline at end of file diff --git a/ddms_compliance_suite/stage_registry.py b/ddms_compliance_suite/stage_registry.py new file mode 100644 index 0000000..c3502b6 --- /dev/null +++ b/ddms_compliance_suite/stage_registry.py @@ -0,0 +1,123 @@ +""" +API 测试阶段 (Stage) 注册表模块 +""" +import os +import importlib.util +import inspect +import logging +from typing import List, Type, Dict, Optional + +from .stage_framework import BaseAPIStage # 导入新的 BaseAPIStage + +logger = logging.getLogger(__name__) + +class StageRegistry: + """ + 负责发现、加载和管理 BaseAPIStage 子类。 + """ + def __init__(self, stages_dir: Optional[str] = None): + """ + 初始化 StageRegistry。 + Args: + stages_dir: 存放自定义 BaseAPIStage Python文件的目录路径。 + 如果为 None 或无效路径,则不会加载任何自定义阶段。 + """ + self.logger = logging.getLogger(__name__) + self.stages_dir = stages_dir + 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: 未提供阶段目录,将不会加载任何自定义阶段。") + + 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}' 无效或不存在,无法发现阶段。") + return + + self.logger.info(f"StageRegistry: 开始从目录 '{self.stages_dir}' 及其子目录发现测试阶段...") + found_count = 0 + # 使用 os.walk 进行递归扫描 + for root_dir, _, 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 + try: + spec = importlib.util.spec_from_file_location(module_name, module_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}") + 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: + 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})") + else: + self._errors.append(f"无法为文件 '{module_path}' 创建模块规范。") + self.logger.error(f"StageRegistry: 无法为文件 '{module_path}' 创建模块规范。") + except ImportError as e: + error_msg = f"导入模块 '{module_name}' (从 '{module_path}') 失败: {e}" + 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}" + 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),未来可以添加。 + + 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]]: + """获取所有已注册的测试阶段类的列表。""" + return list(self._stages.values()) + + def get_load_errors(self) -> List[str]: + """获取加载过程中发生的错误信息列表。""" + return self._errors + + 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}' 无效或不存在。没有加载任何自定义阶段。") + else: + self.logger.info("StageRegistry (重载时): 未配置阶段目录,没有加载任何自定义阶段。") \ No newline at end of file diff --git a/ddms_compliance_suite/test_framework_core.py b/ddms_compliance_suite/test_framework_core.py index e7f4b46..53dc8f9 100644 --- a/ddms_compliance_suite/test_framework_core.py +++ b/ddms_compliance_suite/test_framework_core.py @@ -18,6 +18,14 @@ class ValidationResult: self.message = message # 验证结果的描述信息 self.details = details or {} # 其他详细信息,如实际值、期望值等 + def to_dict(self) -> Dict[str, Any]: + """将 ValidationResult 对象转换为字典。""" + return { + "passed": self.passed, + "message": self.message, + "details": self.details + } + def __repr__(self): return f"ValidationResult(passed={self.passed}, message='{self.message}')" diff --git a/ddms_compliance_suite/test_orchestrator.py b/ddms_compliance_suite/test_orchestrator.py index 3351560..84178c0 100644 --- a/ddms_compliance_suite/test_orchestrator.py +++ b/ddms_compliance_suite/test_orchestrator.py @@ -21,7 +21,7 @@ from pydantic import BaseModel, Field, create_model, HttpUrl # Added HttpUrl for from pydantic.networks import EmailStr from pydantic.types import Literal # Explicitly import Literal -from .input_parser.parser import InputParser, YAPIEndpoint, SwaggerEndpoint, ParsedYAPISpec, ParsedSwaggerSpec +from .input_parser.parser import InputParser, YAPIEndpoint, SwaggerEndpoint, ParsedYAPISpec, ParsedSwaggerSpec, ParsedAPISpec from .api_caller.caller import APICaller, APIRequest, APIResponse, APICallDetail # Ensure APICallDetail is imported from .json_schema_validator.validator import JSONSchemaValidator from .test_framework_core import ValidationResult, TestSeverity, APIRequestContext, APIResponseContext, BaseAPITestCase @@ -29,6 +29,12 @@ from .test_case_registry import TestCaseRegistry 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 + try: from .llm_utils.llm_service import LLMService except ImportError: @@ -184,6 +190,14 @@ class TestSummary: 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.start_time = datetime.datetime.now() self.end_time: Optional[datetime.datetime] = None self.detailed_results: List[TestResult] = [] # 将存储新的 TestResult (EndpointExecutionResult) 对象 @@ -223,6 +237,24 @@ class TestSummary: def set_total_test_cases_applicable(self, count: int): self.total_test_cases_applicable = count + # 新增:用于场景统计的方法 -> 修改为 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 + + 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.SKIPPED: + self.stages_skipped +=1 + + def set_total_stages_defined(self, count: int): + self.total_stages_defined = count + def finalize_summary(self): self.end_time = datetime.datetime.now() @@ -246,7 +278,7 @@ class TestSummary: return (self.test_cases_passed / self.total_test_cases_executed) * 100 def to_dict(self) -> Dict[str, Any]: - return { + data = { "summary_metadata": { "start_time": self.start_time.isoformat(), "end_time": self.end_time.isoformat() if self.end_time else None, @@ -274,6 +306,17 @@ class TestSummary: }, "detailed_results": [result.to_dict() for result in self.detailed_results] } + # 新增:将场景测试结果添加到字典 -> 修改为 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: indent = 2 if pretty else None @@ -318,13 +361,45 @@ class TestSummary: 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}%") + + 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}") class APITestOrchestrator: """ - 测试编排器,负责加载API定义、发现和执行测试用例、生成报告等。 + 测试编排器,负责协调整个API测试流程。 + 包括: + 1. 解析API定义 (YAPI, Swagger) + 2. 加载自定义测试用例 (BaseAPITestCase) + 3. 执行测试用例并收集结果 + 4. 加载和执行API场景 (BaseAPIScenario) - 已实现 + 5. 加载和执行API测试阶段 (BaseAPIStage) - 新增 + 6. 生成测试报告和API调用详情 """ + 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 llm_api_key: Optional[str] = None, llm_base_url: Optional[str] = None, llm_model_name: Optional[str] = None, @@ -332,19 +407,53 @@ class APITestOrchestrator: use_llm_for_path_params: bool = False, use_llm_for_query_params: bool = False, use_llm_for_headers: bool = False, - output_dir: Optional[str] = None # output_dir is now optional and not used for saving API call details internally + output_dir: Optional[str] = None ): self.base_url = base_url.rstrip('/') - self.parser = InputParser() - self.api_caller = APICaller() - self.schema_validator = JSONSchemaValidator() - self.test_case_registry = TestCaseRegistry(custom_test_cases_dir) self.logger = logging.getLogger(__name__) - # self.output_dir is kept if other parts of the orchestrator might use it, - # but it's no longer used by the removed _save_api_call_details - self.output_dir_param = output_dir + 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.api_call_details_log: 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.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 @@ -844,7 +953,7 @@ class APITestOrchestrator: test_case_instance = test_case_class( endpoint_spec=endpoint_spec_dict, global_api_spec=global_spec_dict, - json_schema_validator=self.schema_validator, + json_schema_validator=self.json_validator, llm_service=self.llm_service # Pass the orchestrator's LLM service instance ) self.logger.info(f"开始执行测试用例 '{test_case_instance.id}' ({test_case_instance.name}) for endpoint '{endpoint_spec_dict.get('method', 'N/A')} {endpoint_spec_dict.get('path', 'N/A')}'") @@ -1429,100 +1538,52 @@ class APITestOrchestrator: def run_tests_from_yapi(self, yapi_file_path: str, categories: Optional[List[str]] = None, custom_test_cases_dir: Optional[str] = None - ) -> TestSummary: - if custom_test_cases_dir and (not self.test_case_registry or self.test_case_registry.test_cases_dir != custom_test_cases_dir): - self.logger.info(f"从 run_tests_from_yapi 使用新的目录重新初始化 TestCaseRegistry: {custom_test_cases_dir}") - try: - self.test_case_registry = TestCaseRegistry(test_cases_dir=custom_test_cases_dir) - self.logger.info(f"TestCaseRegistry (re)initialization complete, found {len(self.test_case_registry.get_all_test_case_classes())} test case classes.") - except Exception as e: - self.logger.error(f"从 run_tests_from_yapi 重新初始化 TestCaseRegistry 失败: {e}", exc_info=True) + ) -> Tuple[TestSummary, Optional[ParsedAPISpec]]: + self.logger.info(f"准备从YAPI文件运行测试用例: {yapi_file_path}") + self.api_call_details_log = [] # 为新的测试用例运行重置API调用日志 - self.logger.info(f"从YAPI文件加载API定义: {yapi_file_path}") - self.api_call_details_log = [] # Reset for new run - - parsed_yapi = self.parser.parse_yapi_spec(yapi_file_path) # Corrected: self.parser + parsed_yapi = self.parser.parse_yapi_spec(yapi_file_path) summary = TestSummary() if not parsed_yapi: self.logger.error(f"解析YAPI文件失败: {yapi_file_path}") - summary.finalize_summary() - # No longer calls _save_api_call_details here - return summary + summary.finalize_summary() # 即使失败也最终化摘要 + return summary, None - endpoints_to_test = parsed_yapi.endpoints - if categories: - endpoints_to_test = [ep for ep in endpoints_to_test if ep.category_name in categories] - - summary.set_total_endpoints_defined(len(endpoints_to_test)) - - total_applicable_tcs = 0 - if self.test_case_registry: - for endpoint_spec in endpoints_to_test: - total_applicable_tcs += len( - self.test_case_registry.get_applicable_test_cases( - endpoint_spec.method.upper(), endpoint_spec.path - ) - ) - summary.set_total_test_cases_applicable(total_applicable_tcs) - - for endpoint in endpoints_to_test: - result = self.run_test_for_endpoint(endpoint, global_api_spec=parsed_yapi) - summary.add_endpoint_result(result) - - summary.finalize_summary() - # No longer calls _save_api_call_details here - summary.print_summary_to_console() # Keep console print - return summary + # 调用内部执行方法来执行测试用例 + self._execute_tests_from_parsed_spec( + parsed_spec=parsed_yapi, + summary=summary, + categories=categories, + custom_test_cases_dir=custom_test_cases_dir + ) + # finalize_summary 和 print_summary_to_console 将在 run_api_tests.py 中进行 + return summary, parsed_yapi def run_tests_from_swagger(self, swagger_file_path: str, tags: Optional[List[str]] = None, custom_test_cases_dir: Optional[str] = None - ) -> TestSummary: - if custom_test_cases_dir and (not self.test_case_registry or self.test_case_registry.test_cases_dir != custom_test_cases_dir): - self.logger.info(f"从 run_tests_from_swagger 使用新的目录重新初始化 TestCaseRegistry: {custom_test_cases_dir}") - try: - self.test_case_registry = TestCaseRegistry(test_cases_dir=custom_test_cases_dir) - self.logger.info(f"TestCaseRegistry (re)initialization complete, found {len(self.test_case_registry.get_all_test_case_classes())} test case classes.") - except Exception as e: - self.logger.error(f"从 run_tests_from_swagger 重新初始化 TestCaseRegistry 失败: {e}", exc_info=True) + ) -> Tuple[TestSummary, Optional[ParsedAPISpec]]: + self.logger.info(f"准备从Swagger文件运行测试用例: {swagger_file_path}") + self.api_call_details_log = [] # 为新的测试用例运行重置API调用日志 - self.logger.info(f"从Swagger文件加载API定义: {swagger_file_path}") - self.api_call_details_log = [] # Reset for new run - - parsed_swagger = self.parser.parse_swagger_spec(swagger_file_path) # Corrected: self.parser + parsed_swagger = self.parser.parse_swagger_spec(swagger_file_path) summary = TestSummary() if not parsed_swagger: self.logger.error(f"解析Swagger文件失败: {swagger_file_path}") summary.finalize_summary() - # No longer calls _save_api_call_details here - return summary + return summary, None - endpoints_to_test = parsed_swagger.endpoints - if tags: - endpoints_to_test = [ep for ep in endpoints_to_test if any(tag in ep.tags for tag in tags)] - - summary.set_total_endpoints_defined(len(endpoints_to_test)) - - total_applicable_tcs = 0 - if self.test_case_registry: - for endpoint_spec in endpoints_to_test: - total_applicable_tcs += len( - self.test_case_registry.get_applicable_test_cases( - endpoint_spec.method.upper(), endpoint_spec.path - ) - ) - summary.set_total_test_cases_applicable(total_applicable_tcs) - - for endpoint in endpoints_to_test: - result = self.run_test_for_endpoint(endpoint, global_api_spec=parsed_swagger) - summary.add_endpoint_result(result) - - summary.finalize_summary() - # No longer calls _save_api_call_details here - summary.print_summary_to_console() # Keep console print - return summary + # 调用内部执行方法来执行测试用例 + self._execute_tests_from_parsed_spec( + parsed_spec=parsed_swagger, + summary=summary, + tags=tags, + custom_test_cases_dir=custom_test_cases_dir + ) + # finalize_summary 和 print_summary_to_console 将在 run_api_tests.py 中进行 + return summary, parsed_swagger def _generate_data_from_schema(self, schema: Dict[str, Any], context_name: Optional[str] = None, @@ -1886,4 +1947,608 @@ class APITestOrchestrator: self.logger.error(f"[Util] _util_remove_value_at_path 未能在循环内按预期返回。路径: {'.'.join(map(str,path))}") return data_container, None, False + # --- 新增:场景测试执行相关方法 --- + def _resolve_value_from_context_or_literal(self, value_template: Any, stage_context: Dict[str, Any], step_name_for_log: str) -> Any: + """ + 解析一个值,如果它是字符串且符合 {{stage_context.变量}} 格式,则从阶段上下文中取值,否则直接返回值。 + 支持从字典和列表中深入取值,例如 {{stage_context.user.id}} 或 {{stage_context.items[0].name}}。 + """ + if isinstance(value_template, str): + match = re.fullmatch(r"\{\{\s*stage_context\.([a-zA-Z0-9_\.\[\]]+)\s*\}\}", value_template) + if match: + path_expression = match.group(1) + self.logger.debug(f"[阶段步骤 '{step_name_for_log}'] 解析上下文路径: '{path_expression}' 来自模板 '{value_template}'") + try: + current_value = stage_context + parts = re.split(r'\.(?![^\[]*\])|\[|\]', path_expression) + parts = [p for p in parts if p] # 移除空字符串 + + for part in parts: + if isinstance(current_value, dict): + current_value = current_value[part] + 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}')") + 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 # 不是有效的占位符,返回原始字符串 + 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 + else: + return value_template # 其他类型直接返回 + + def _extract_outputs_to_context(self, response_content: 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"}。 + 支持 "body.", "header.", "status_code" 作为路径前缀。 + stage_context: 要更新的阶段上下文。 + step_name_for_log: 当前步骤名称,用于日志。 + """ + if not outputs_map or response_content 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}'") + 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:] + + if source_type == "body": + target_obj = current_data.get('json_content') + elif source_type == "header": + target_obj = current_data.get('headers') + elif source_type == "status_code": + if not actual_path_parts: + value_to_extract = current_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}") + continue + else: + 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}'") + continue + + if target_obj is None and source_type != "status_code": + self.logger.warning(f"[阶段步骤 '{step_name_for_log}'] 提取源 '{source_type}' 为空或不存在。") + continue + + temp_val = target_obj + for part in actual_path_parts: + if isinstance(temp_val, dict): + temp_val = temp_val.get(part) + elif isinstance(temp_val, list) and part.isdigit(): + idx = int(part) + if 0 <= idx < len(temp_val): + temp_val = temp_val[idx] + else: + temp_val = None; break + else: + temp_val = None; break + if temp_val is None: break + + value_to_extract = temp_val + + 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]}...") + else: + self.logger.warning(f"[阶段步骤 '{step_name_for_log}'] 未能从路径 '{extraction_path}' 提取到值。") + except Exception as e: + 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: + stage_start_time = datetime.datetime.now() + stage_context: Dict[str, Any] = {} + executed_steps_results: List[ExecutedStageStepResult] = [] + + stage_result = ExecutedStageResult( + stage_id=stage_instance.id, + stage_name=stage_instance.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__ + ) + + 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 + 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) # <--- 更正方法名, 移除多余参数 + 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_result = ExecutedStageStepResult( + step_name=step_name, + description=getattr(step_definition, 'description', None), # <--- 使用 getattr + 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 对象上 + ) + + 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 + 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}'") + 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 + ) + + 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}") + 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 + + 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 + + # 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()) + + 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.") + + + 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( + method=api_op_spec.method, + url=full_request_url, # <--- 使用构建好的完整 URL + params=final_query_params, # <--- query_params 对应 APIRequest 中的 params + headers=final_headers, + body=final_body # APIRequest 会通过 model_post_init 将 body 赋给 json_data + ) + current_step_result.request_details = api_request.model_dump() # Use model_dump for Pydantic v2 + + 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() # Use model_dump for Pydantic v2 + + self.logger.debug(f"Stage '{stage_instance.id}', Step '{step_name}': Validating response. Status: {api_response.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})) + 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}).")) + + for i, assertion_func in enumerate(step_definition.response_assertions): # <--- Corrected: custom_assertions to 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) + 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}") + except Exception as assert_exc: + current_step_result.status = ExecutedStageStepResult.Status.ERROR + errMsg = f"Assertion '{assertion_name}' execution error: {assert_exc}" + step_message += errMsg + " " + 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) + + 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}") + response_data_for_extraction = { + "json_content": api_response.json_content, + "headers": api_response.headers, + "status_code": api_response.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}'" + ) + 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) + + 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] + + 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, + stage_context=stage_context, + global_api_spec=parsed_spec, + 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) + 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}" + + executed_steps_results.append(current_step_result) + + 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 + + # Determine final stage status + 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." + 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 + 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 + 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 + 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." + + + try: + self.logger.debug(f"Calling after_stage for stage '{stage_instance.id}'.") + 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}" + + 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 + 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.") + return + + stage_classes = self.stage_registry.get_all_stage_classes() + summary.set_total_stages_defined(len(stage_classes)) + + api_groups: 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) + 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) + + 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) + + self.logger.info(f"Evaluating test stages against {len(api_groups)} API group(s): {api_groups}") + + total_stages_considered_for_execution = 0 + + 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 + + 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]] = [] + + 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." + + # 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 + ] + 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] + + 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] + + # Instantiate the stage with the prepared context for the current API group + stage_instance = stage_class( + api_group_metadata=current_group_metadata, + apis_in_group=current_apis_in_group_dicts, + llm_service=self.llm_service, + global_api_spec=parsed_spec + ) + 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, + 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) + 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}" + ) + error_result.finalize_result(datetime.datetime.now(), [], {}) + summary.add_stage_result(error_result) + was_applicable_and_executed_at_least_once = True # Considered an attempt + continue + + 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) + 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.") + + 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.") + failure_result = ExecutedStageResult( + stage_id=stage_instance_template.id, stage_name=stage_instance_template.name, api_group=None, + overall_status=ExecutedStageResult.Status.FAILED, + message=f"Stage marked as 'must apply' but was not applicable to any of the evaluated groups: {api_groups}." + ) + failure_result.finalize_result(datetime.datetime.now(), [], {}) + 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.") + + def _execute_tests_from_parsed_spec(self, + parsed_spec: ParsedAPISpec, + summary: TestSummary, + categories: Optional[List[str]] = None, + tags: Optional[List[str]] = None, + custom_test_cases_dir: Optional[str] = None + ) -> TestSummary: + """基于已解析的API规范对象执行测试用例。""" + # Restore the original start of the method body, the rest of the method should be intact from before. + if custom_test_cases_dir and (not self.test_case_registry or not hasattr(self.test_case_registry, 'test_cases_dir') or self.test_case_registry.test_cases_dir != custom_test_cases_dir): + self.logger.info(f"Re-initializing TestCaseRegistry from _execute_tests_from_parsed_spec with new directory: {custom_test_cases_dir}") + try: + # Assuming TestCaseRegistry can be re-initialized or its directory updated. + # If TestCaseRegistry is loaded in __init__, this might need adjustment + # For now, let's assume direct re-init is possible if dir changes. + self.test_case_registry = TestCaseRegistry() + self.test_case_registry.discover_and_load_test_cases(custom_test_cases_dir) + self.logger.info(f"TestCaseRegistry (re)initialized, found {len(self.test_case_registry.get_all_test_case_classes())} test case classes.") + except Exception as e: + self.logger.error(f"Failed to re-initialize TestCaseRegistry from _execute_tests_from_parsed_spec: {e}", exc_info=True) + # summary.finalize_summary() # Finalize might be premature here + return summary # Early exit if registry fails + + endpoints_to_test: List[Union[YAPIEndpoint, SwaggerEndpoint]] = [] + if isinstance(parsed_spec, ParsedYAPISpec): + endpoints_to_test = parsed_spec.endpoints + if categories: + # Ensure YAPIEndpoint has 'category_name' if this filter is used. + endpoints_to_test = [ep for ep in endpoints_to_test if hasattr(ep, 'category_name') and ep.category_name in categories] + elif isinstance(parsed_spec, ParsedSwaggerSpec): + endpoints_to_test = parsed_spec.endpoints + if tags: + # Ensure SwaggerEndpoint has 'tags' attribute for this filter. + endpoints_to_test = [ep for ep in endpoints_to_test if hasattr(ep, 'tags') and isinstance(ep.tags, list) and any(tag in ep.tags for tag in tags)] + else: + self.logger.warning(f"Unknown parsed_spec type: {type(parsed_spec)}. Cannot filter endpoints.") + # summary.finalize_summary() # Finalize might be premature + return summary + + current_total_defined = summary.total_endpoints_defined + summary.set_total_endpoints_defined(current_total_defined + len(endpoints_to_test)) + + total_applicable_tcs_for_this_run = 0 + if self.test_case_registry: + for endpoint_spec_obj in endpoints_to_test: + total_applicable_tcs_for_this_run += len( + self.test_case_registry.get_applicable_test_cases( + endpoint_spec_obj.method.upper(), endpoint_spec_obj.path + ) + ) + current_total_applicable = summary.total_test_cases_applicable + summary.set_total_test_cases_applicable(current_total_applicable + total_applicable_tcs_for_this_run) + + for endpoint in endpoints_to_test: + # global_api_spec 应该是包含完整定义的 ParsedYAPISpec/ParsedSwaggerSpec 对象 + # 而不是其内部的 .spec 字典,因为 _execute_single_test_case 需要这个对象 + result = self.run_test_for_endpoint(endpoint, global_api_spec=parsed_spec) + summary.add_endpoint_result(result) + + return summary diff --git a/flask_app.py b/flask_app.py new file mode 100644 index 0000000..e0cc041 --- /dev/null +++ b/flask_app.py @@ -0,0 +1,219 @@ +import os +import sys +import json +import logging +import argparse +import traceback # 用于更详细的错误日志 +from pathlib import Path +from flask import Flask, request, jsonify, send_from_directory +from flask_cors import CORS # 用于处理跨域请求 + +# 将ddms_compliance_suite的父目录添加到sys.path +# 假设flask_app.py与ddms_compliance_suite目录在同一级别,或者ddms_compliance_suite在其PYTHONPATH中 +# 如果 ddms_compliance_suite 是一个已安装的包,则不需要这个 +# current_dir = os.path.dirname(os.path.abspath(__file__)) +# project_root = os.path.dirname(current_dir) # 假设项目根目录是上一级 +# sys.path.insert(0, project_root) +# 或者更具体地添加包含ddms_compliance_suite的目录 +# sys.path.insert(0, os.path.join(project_root, 'ddms_compliance_suite')) + +from ddms_compliance_suite.test_orchestrator import APITestOrchestrator, TestSummary +from ddms_compliance_suite.input_parser.parser import InputParser, ParsedYAPISpec, ParsedSwaggerSpec +# 从 run_api_tests.py 导入辅助函数 (如果它们被重构为可导入的) +# 为了简单起见,我们可能会直接在 flask_app.py 中重新实现一些逻辑或直接调用Orchestrator + +app = Flask(__name__, static_folder='static', static_url_path='') +CORS(app) # 允许所有来源的跨域请求,生产环境中应配置更严格的规则 + +# 配置日志 +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger(__name__) + +# --- 辅助函数 --- +def get_orchestrator_from_config(config: dict) -> APITestOrchestrator: + """根据配置字典实例化APITestOrchestrator""" + return APITestOrchestrator( + base_url=config.get('base_url', ''), + custom_test_cases_dir=config.get('custom_test_cases_dir'), + llm_api_key=config.get('llm_api_key'), + llm_base_url=config.get('llm_base_url'), + llm_model_name=config.get('llm_model_name'), + use_llm_for_request_body=config.get('use_llm_for_request_body', False), + use_llm_for_path_params=config.get('use_llm_for_path_params', False), + use_llm_for_query_params=config.get('use_llm_for_query_params', False), + use_llm_for_headers=config.get('use_llm_for_headers', False), + output_dir=config.get('output_dir') # 虽然Orchestrator内部可能不直接用它保存,但可以传入 + ) + +# --- API 端点 --- +@app.route('/') +def serve_index(): + return send_from_directory(app.static_folder, 'index.html') + +@app.route('/run-tests', methods=['POST']) +def run_tests_endpoint(): + try: + config_data = request.json + if not config_data: + return jsonify({"error": "Request body must be JSON"}), 400 + + logger.info(f"接收到测试运行请求: {config_data}") + + # 校验必需参数 + if not config_data.get('base_url'): + return jsonify({"error": "'base_url' is required"}), 400 + if not config_data.get('yapi_file_path') and not config_data.get('swagger_file_path'): + return jsonify({"error": "Either 'yapi_file_path' or 'swagger_file_path' is required"}), 400 + + orchestrator = get_orchestrator_from_config(config_data) + summary = TestSummary() # 为本次运行创建新的摘要 + + parsed_spec = None + api_spec_type = "" + + if config_data.get('yapi_file_path'): + api_spec_type = "YAPI" + yapi_path = config_data['yapi_file_path'] + if not os.path.isabs(yapi_path): + yapi_path = os.path.join(os.getcwd(), yapi_path) # 假设相对路径相对于服务器工作目录 + if not os.path.exists(yapi_path): + return jsonify({"error": f"YAPI file not found: {yapi_path}"}), 400 + logger.info(f"解析YAPI文件: {yapi_path}") + parsed_spec = orchestrator.parser.parse_yapi_spec(yapi_path) + if not parsed_spec: + logger.error(f"解析YAPI文件失败: {yapi_path}") + return jsonify({"error": f"Failed to parse YAPI file: {yapi_path}"}), 500 + + elif config_data.get('swagger_file_path'): + api_spec_type = "Swagger/OpenAPI" + swagger_path = config_data['swagger_file_path'] + if not os.path.isabs(swagger_path): + swagger_path = os.path.join(os.getcwd(), swagger_path) # 假设相对路径 + if not os.path.exists(swagger_path): + return jsonify({"error": f"Swagger file not found: {swagger_path}"}), 400 + logger.info(f"解析Swagger/OpenAPI文件: {swagger_path}") + parsed_spec = orchestrator.parser.parse_swagger_spec(swagger_path) + if not parsed_spec: + logger.error(f"解析Swagger文件失败: {swagger_path}") + return jsonify({"error": f"Failed to parse Swagger file: {swagger_path}"}), 500 + + # 执行测试用例 + logger.info(f"开始从已解析的 {api_spec_type} 规范执行测试用例...") + summary = orchestrator._execute_tests_from_parsed_spec( + parsed_spec=parsed_spec, + summary=summary, + categories=config_data.get('categories'), # 逗号分隔的字符串,需要转为列表 + tags=config_data.get('tags'), # 同上 + custom_test_cases_dir=config_data.get('custom_test_cases_dir') + ) + logger.info("测试用例执行完成。") + + # 执行场景测试 (如果指定了目录) + scenarios_dir = config_data.get('scenarios_dir') + if scenarios_dir and parsed_spec: + if not os.path.isabs(scenarios_dir): + scenarios_dir = os.path.join(os.getcwd(), scenarios_dir) + logger.info(f"开始执行API场景测试,目录: {scenarios_dir}") + orchestrator.run_scenarios_from_spec( + scenarios_dir=scenarios_dir, + parsed_spec=parsed_spec, + summary=summary + ) + logger.info("API场景测试执行完毕。") + + summary.finalize_summary() # 最终确定摘要,计算总时长等 + # summary.print_summary_to_console() # 后端服务通常不直接打印到控制台 + + # 可以在这里决定如何保存报告,例如保存到 output_dir (如果提供) + output_dir_path_str = config_data.get('output_dir') + main_report_file_path_str = "" + api_calls_output_path_str = "" + api_calls_filename = "api_call_details.md" + + if output_dir_path_str: + output_path = Path(output_dir_path_str) + output_path.mkdir(parents=True, exist_ok=True) + main_report_file_path = output_path / f"summary_report.json" # 默认保存为json + main_report_file_path_str = str(main_report_file_path) + with open(main_report_file_path, 'w', encoding='utf-8') as f: + f.write(summary.to_json(pretty=True)) + logger.info(f"主测试报告已保存到: {main_report_file_path}") + + # 保存API调用详情 + api_calls_output_path_str = str(output_path) + # (需要从 run_api_tests.py 移植 save_api_call_details_to_file 或类似功能) + # 暂时跳过保存 api_call_details 文件,因为 orchestrator.get_api_call_details() 需要被调用 + # 并且保存逻辑也需要移植。 + # save_api_call_details_to_file(orchestrator.get_api_call_details(), api_calls_output_path_str, api_calls_filename) + + return jsonify({ + "message": "测试执行完成。", + "summary": summary.to_dict(), + "report_file": main_report_file_path_str, # 报告文件路径(如果保存了) + # "api_calls_file": api_calls_output_path_str + "/" + api_calls_filename # API调用详情文件路径 + }), 200 + + except Exception as e: + logger.error(f"执行测试时发生错误: {e}\n{traceback.format_exc()}") + return jsonify({"error": f"执行测试时发生内部错误: {str(e)}"}), 500 + +@app.route('/list-yapi-categories', methods=['POST']) +def list_yapi_categories_endpoint(): + try: + data = request.json + yapi_file = data.get('yapi_file_path') + if not yapi_file: + return jsonify({"error": "'yapi_file_path' is required"}), 400 + + if not os.path.isabs(yapi_file): + yapi_file = os.path.join(os.getcwd(), yapi_file) + if not os.path.exists(yapi_file): + return jsonify({"error": f"YAPI file not found: {yapi_file}"}), 400 + + parser = InputParser() + parsed_yapi = parser.parse_yapi_spec(yapi_file) + if not parsed_yapi or not parsed_yapi.categories: + return jsonify({"error": "Failed to parse YAPI categories or no categories found"}), 500 + + categories_list = [ + {"name": cat.get('name', '未命名'), "description": cat.get('desc', '无描述')} + for cat in parsed_yapi.categories + ] + return jsonify(categories_list), 200 + except Exception as e: + logger.error(f"列出YAPI分类时出错: {e}\n{traceback.format_exc()}") + return jsonify({"error": f"处理YAPI分类列表时出错: {str(e)}"}), 500 + +@app.route('/list-swagger-tags', methods=['POST']) +def list_swagger_tags_endpoint(): + try: + data = request.json + swagger_file = data.get('swagger_file_path') + if not swagger_file: + return jsonify({"error": "'swagger_file_path' is required"}), 400 + + if not os.path.isabs(swagger_file): + swagger_file = os.path.join(os.getcwd(), swagger_file) + if not os.path.exists(swagger_file): + return jsonify({"error": f"Swagger file not found: {swagger_file}"}), 400 + + parser = InputParser() + parsed_swagger = parser.parse_swagger_spec(swagger_file) + if not parsed_swagger or not parsed_swagger.tags: + return jsonify({"error": "Failed to parse Swagger tags or no tags found"}), 500 + + tags_list = [ + {"name": tag.get('name', '未命名'), "description": tag.get('description', '无描述')} + for tag in parsed_swagger.tags + ] + return jsonify(tags_list), 200 + except Exception as e: + logger.error(f"列出Swagger标签时出错: {e}\n{traceback.format_exc()}") + return jsonify({"error": f"处理Swagger标签列表时出错: {str(e)}"}), 500 + +if __name__ == '__main__': + # 注意:在生产环境中,应使用Gunicorn或uWSGI等WSGI服务器运行Flask应用 + app.run(debug=True, host='0.0.0.0', port=5050) \ No newline at end of file diff --git a/log.txt b/log.txt index d8e62bf..2fef84e 100644 --- a/log.txt +++ b/log.txt @@ -1,3008 +1,12 @@ -2025-06-01 00:34:02,812 - __main__ - DEBUG - 已启用详细日志模式 -2025-06-01 00:34:02,812 - __main__ - INFO - 主输出目录设置为: /Users/zpc01/workspace/zzlh/compliance -2025-06-01 00:34:02,812 - ddms_compliance_suite.test_case_registry - INFO - 开始从目录 './custom_testcases' 及其子目录发现测试用例... -2025-06-01 00:34:02,812 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: basic_checks 从 ./custom_testcases/basic_checks.py -2025-06-01 00:34:02,812 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-STATUS-001' (基本状态码 200 检查) 来自类 'StatusCode200Check' (路径: ./custom_testcases/basic_checks.py) -2025-06-01 00:34:02,813 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: basic_api_sanity_check_case 从 ./custom_testcases/setup_checks/basic_api_sanity_check_case.py -2025-06-01 00:34:02,813 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: https_mandatory_case 从 ./custom_testcases/compliance_catalog/security/https_mandatory_case.py -2025-06-01 00:34:02,813 - 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-01 00:34:02,813 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: url_llm_checks 从 ./custom_testcases/compliance_catalog/normative_spec/url_llm_checks.py -2025-06-01 00:34:02,814 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: http_method_usage_case 从 ./custom_testcases/compliance_catalog/normative_spec/http_method_usage_case.py -2025-06-01 00:34:02,814 - 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-01 00:34:02,814 - 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-01 00:34:02,815 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: type_mismatch_body_case 从 ./custom_testcases/compliance_catalog/error_handling/type_mismatch_body_case.py -2025-06-01 00:34:02,815 - 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-01 00:34:02,815 - 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-01 00:34:02,815 - 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-01 00:34:02,815 - 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-01 00:34:02,815 - 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-01 00:34:02,816 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: schema_validation_case 从 ./custom_testcases/compliance_catalog/core_functionality/schema_validation_case.py -2025-06-01 00:34:02,816 - 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-01 00:34:02,816 - ddms_compliance_suite.test_case_registry - INFO - 已根据 execution_order (主要) 和类名 (次要) 对 7 个测试用例类进行了排序。 -2025-06-01 00:34:02,816 - ddms_compliance_suite.test_case_registry - INFO - 测试用例发现完成。总共注册了 7 个独特的测试用例 (基于ID)。发现并排序了 7 个测试用例类。 -2025-06-01 00:34:02,816 - ddms_compliance_suite.llm_utils.llm_service - INFO - LLMService initialized for model 'qwen-plus' at https://dashscope.aliyuncs.com/compatible-mode/v1 -2025-06-01 00:34:02,816 - ddms_compliance_suite.test_orchestrator - INFO - LLMService initialized successfully with model: qwen-plus. -2025-06-01 00:34:02,816 - __main__ - INFO - 从YAPI文件运行测试: assets/doc/井筒API示例_simple.json -2025-06-01 00:34:02,816 - ddms_compliance_suite.test_orchestrator - INFO - 从YAPI文件加载API定义: assets/doc/井筒API示例_simple.json -2025-06-01 00:34:02,816 - ddms_compliance_suite.input_parser.parser - INFO - Parsing YAPI spec from: assets/doc/井筒API示例_simple.json -2025-06-01 00:34:02,816 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,816 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-01 00:34:02,817 - 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-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-01 00:34:02,817 - 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-01 00:34:02,817 - 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-01 00:34:02,817 - 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-01 00:34:02,817 - 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-01 00:34:02,817 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version} (数据推送接口) -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}'。 -2025-06-01 00:34:02,817 - 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-01 00:34:02,817 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:02,817 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:02,817 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:02,817 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:02,817 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:02,817 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:02,817 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:02,817 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:02,818 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:02,818 - 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-01 00:34:02,818 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 初始化。 -2025-06-01 00:34:02,818 - 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-01 00:34:02,818 - 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-01 00:34:02,818 - 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-01 00:34:02,818 - 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-01 00:34:02,818 - 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-01 00:34:02,818 - ddms_compliance_suite.test_orchestrator - INFO - Attempting LLM generation for request body of 'post__api_dms_dms_instance_code_v1_message_push_schema_version_135716' with schema... -2025-06-01 00:34:02,818 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLMService.generate_data_from_schema: 使用的JSON 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": { - "type": "string" - }, - "type": "array" - }, - "symbol": { - "description": "运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL", - "type": "string" - } - }, - "type": "object" - }, - "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": { - "type": "string" - }, - "type": "array" - }, - "symbol": { - "description": "运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL", - "type": "string" - } - }, - "type": "object" - }, - "sort": { - "additionalProperties": { - "description": "排序字段,key=字段名,value=排序方式(ASC、DESC)", - "type": "string" - }, - "description": "排序字段,key=字段名,value=排序方式(ASC、DESC)", - "type": "object", - "properties": {} - } - }, - "type": "object" - } - }, - "type": "object" -} -2025-06-01 00:34:02,818 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLM API Request Payload: -{ - "model": "qwen-plus", - "messages": [ - { - "role": "system", - "content": "你是一个API测试数据生成助手。你的任务是根据用户提供的JSON Schema和额外指令,生成一个符合该Schema的JSON对象。请确保你的输出严格是一个JSON对象,不包含任何额外的解释、注释或Markdown标记。" - }, - { - "role": "user", - "content": "请为以下JSON Schema生成一个有效的JSON对象实例:\n\n```json\n{\n \"properties\": {\n \"isSearchCount\": {\n \"default\": true,\n \"description\": \"是否统计总条数\",\n \"type\": \"boolean\"\n },\n \"query\": {\n \"description\": \"查询条件\",\n \"properties\": {\n \"dataRegions\": {\n \"description\": \"数据域,如:JD、DG、TL\",\n \"items\": {\n \"description\": \"数据域,如:JD、DG、TL\",\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"fields\": {\n \"description\": \"查询的字段\",\n \"items\": {\n \"description\": \"查询的字段\",\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"filter\": {\n \"description\": \"筛选器\",\n \"properties\": {\n \"key\": {\n \"description\": \"条件项\",\n \"type\": \"string\"\n },\n \"logic\": {\n \"description\": \"逻辑操作符,可选值为:AND、OR\",\n \"type\": \"string\"\n },\n \"realValue\": {\n \"description\": \"条件值\",\n \"items\": {\n \"description\": \"条件值\",\n \"type\": \"object\",\n \"properties\": {}\n },\n \"type\": \"array\"\n },\n \"singleValue\": {\n \"type\": \"object\",\n \"writeOnly\": true,\n \"properties\": {}\n },\n \"subFilter\": {\n \"description\": \"子条件\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"symbol\": {\n \"description\": \"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"groupFields\": {\n \"description\": \"分组字段group by\",\n \"items\": {\n \"description\": \"分组字段group by\",\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"groupFilter\": {\n \"description\": \"筛选器\",\n \"properties\": {\n \"key\": {\n \"description\": \"条件项\",\n \"type\": \"string\"\n },\n \"logic\": {\n \"description\": \"逻辑操作符,可选值为:AND、OR\",\n \"type\": \"string\"\n },\n \"realValue\": {\n \"description\": \"条件值\",\n \"items\": {\n \"description\": \"条件值\",\n \"type\": \"object\",\n \"properties\": {}\n },\n \"type\": \"array\"\n },\n \"singleValue\": {\n \"type\": \"object\",\n \"writeOnly\": true,\n \"properties\": {}\n },\n \"subFilter\": {\n \"description\": \"子条件\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"symbol\": {\n \"description\": \"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"sort\": {\n \"additionalProperties\": {\n \"description\": \"排序字段,key=字段名,value=排序方式(ASC、DESC)\",\n \"type\": \"string\"\n },\n \"description\": \"排序字段,key=字段名,value=排序方式(ASC、DESC)\",\n \"type\": \"object\",\n \"properties\": {}\n }\n },\n \"type\": \"object\"\n }\n },\n \"type\": \"object\"\n}\n```\n" - } - ], - "max_tokens": 1024, - "temperature": 0.1 -} -2025-06-01 00:34:09,772 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLM API Response: -{ - "choices": [ - { - "message": { - "role": "assistant", - "content": "{\n \"isSearchCount\": true,\n \"query\": {\n \"dataRegions\": [\"JD\", \"DG\"],\n \"fields\": [\"field1\", \"field2\"],\n \"filter\": {\n \"key\": \"conditionKey\",\n \"logic\": \"AND\",\n \"realValue\": [\n {\n \"value1\": \"example\"\n }\n ],\n \"subFilter\": [\"subCondition1\", \"subCondition2\"],\n \"symbol\": \"=\"\n },\n \"groupFields\": [\"groupField1\"],\n \"groupFilter\": {\n \"key\": \"groupConditionKey\",\n \"logic\": \"OR\",\n \"realValue\": [\n {\n \"value1\": \"exampleGroup\"\n }\n ],\n \"subFilter\": [\"subGroupCondition1\"],\n \"symbol\": \">\"\n },\n \"sort\": {\n \"field1\": \"ASC\",\n \"field2\": \"DESC\"\n }\n }\n}" - }, - "finish_reason": "stop", - "index": 0, - "logprobs": null - } - ], - "object": "chat.completion", - "usage": { - "prompt_tokens": 934, - "completion_tokens": 198, - "total_tokens": 1132, - "prompt_tokens_details": { - "cached_tokens": 0 - } - }, - "created": 1748709250, - "system_fingerprint": null, - "model": "qwen-plus", - "id": "chatcmpl-82416078-7690-9322-a573-55887d3da569" -} -2025-06-01 00:34:09,773 - ddms_compliance_suite.llm_utils.llm_service - INFO - 成功从LLM生成并解析了数据。 -2025-06-01 00:34:09,773 - 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-01 00:34:09,773 - 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-01 00:34:09,773 - 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-01 00:34:09,830 - 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-01 00:34:09,830 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 -2025-06-01 00:34:09,830 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 -2025-06-01 00:34:09,830 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-01 00:34:09,830 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:09,830 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:09,830 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:09,830 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:09,830 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:09,831 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:09,831 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,831 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,831 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,831 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-01 00:34:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-01 00:34:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:09,831 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:09,831 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:09,831 - 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-01 00:34:09,831 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 初始化。 -2025-06-01 00:34:09,831 - 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-01 00:34:09,831 - 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-01 00:34:09,831 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,832 - 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-01 00:34:09,873 - testcase.TC-CORE-FUNC-001 - INFO - 响应包含JSON体,但在API规范中未找到针对状态码 200 的JSON schema。跳过schema验证。 -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:09,874 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:09,874 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:09,874 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,874 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,874 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,874 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:09,874 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:09,874 - 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-01 00:34:09,874 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 初始化。 -2025-06-01 00:34:09,874 - 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-01 00:34:09,874 - 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-01 00:34:09,874 - 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-01 00:34:09,874 - 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-01 00:34:09,874 - 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-01 00:34:09,874 - 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-01 00:34:09,874 - 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-01 00:34:09,874 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,875 - 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-01 00:34:09,913 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:09,913 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:09,913 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:09,913 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,913 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,913 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,913 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:09,913 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:09,913 - 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-01 00:34:09,913 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. -2025-06-01 00:34:09,913 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: No suitable simple type field found for query parameters. -2025-06-01 00:34:09,913 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No suitable simple type query parameter found for type mismatch test. -2025-06-01 00:34:09,913 - 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-01 00:34:09,913 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - 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-01 00:34:09,914 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. -2025-06-01 00:34:09,914 - 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-01 00:34:09,914 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:09,914 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: -2025-06-01 00:34:09,940 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Skipped type mismatch (query) validation: No target query parameter was identified. -2025-06-01 00:34:09,940 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.025227069854736328 -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4001-QUERY' 执行成功。 -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 通过 -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:09,940 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:09,940 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:09,940 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,940 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,940 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,940 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:09,940 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:09,940 - 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-01 00:34:09,940 - 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-01 00:34:09,940 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json -2025-06-01 00:34:09,940 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... -2025-06-01 00:34:09,940 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=isSearchCount, Type=boolean -2025-06-01 00:34:09,940 - 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-01 00:34:09,940 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): isSearchCount, Original Type: boolean -2025-06-01 00:34:09,940 - 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-01 00:34:09,940 - 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-01 00:34:09,940 - 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-01 00:34:09,940 - 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-01 00:34:09,940 - 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-01 00:34:09,940 - 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-01 00:34:09,940 - 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-01 00:34:09,940 - 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-01 00:34:09,940 - 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-01 00:34:09,940 - 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-01 00:34:09,940 - 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-01 00:34:09,940 - 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-01 00:34:09,940 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 isSearchCount (键 'isSearchCount') 处设置值为 'not-a-boolean' -2025-06-01 00:34:09,941 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. -2025-06-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - 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-01 00:34:09,941 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. -2025-06-01 00:34:09,941 - 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-01 00:34:09,941 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:09,941 - 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: 480' -d '{"isSearchCount": true, "query": {"dataRegions": ["JD", "DG"], "fields": ["field1", "field2"], "filter": {"key": "conditionKey", "logic": "AND", "realValue": [{"value1": "example"}], "subFilter": ["subCondition1", "subCondition2"], "symbol": "="}, "groupFields": ["groupField1"], "groupFilter": {"key": "groupConditionKey", "logic": "OR", "realValue": [{"value1": "exampleGroup"}], "subFilter": ["subGroupCondition1"], "symbol": ">"}, "sort": {"field1": "ASC", "field2": "DESC"}}}' --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: 480\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["JD", "DG"], "fields": ["field1", "field2"], "filter": {"key": "conditionKey", "logic": "AND", "realValue": [{"value1": "example"}], "subFilter": ["subCondition1", "subCondition2"], "symbol": "="}, "groupFields": ["groupField1"], "groupFilter": {"key": "groupConditionKey", "logic": "OR", "realValue": [{"value1": "exampleGroup"}], "subFilter": ["subGroupCondition1"], "symbol": ">"}, "sort": {"field1": "ASC", "field2": "DESC"}}}\' --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' -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 -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-01 00:34:09,967 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '84'. (Field: body.isSearchCount) -2025-06-01 00:34:09,967 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.026129961013793945 -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:09,968 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:09,968 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:09,968 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,968 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,968 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,968 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:09,968 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:09,968 - 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-01 00:34:09,968 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['isSearchCount', 'query'] -2025-06-01 00:34:09,968 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 -2025-06-01 00:34:09,968 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. -2025-06-01 00:34:09,968 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 -2025-06-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,969 - 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-01 00:34:09,994 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:09,995 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:09,995 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:09,995 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,995 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,995 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,995 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:09,995 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:09,995 - 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-01 00:34:09,995 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. -2025-06-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,995 - 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-01 00:34:09,996 - 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-01 00:34:09,996 - 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-01 00:34:09,996 - 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-01 00:34:09,996 - 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-01 00:34:09,996 - 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-01 00:34:09,996 - 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-01 00:34:09,996 - 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-01 00:34:09,996 - 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-01 00:34:09,996 - 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-01 00:34:09,996 - 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-01 00:34:09,996 - 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-01 00:34:09,996 - 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-01 00:34:10,027 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 -2025-06-01 00:34:10,027 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 -2025-06-01 00:34:10,027 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 -2025-06-01 00:34:10,027 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 测试完成,最终状态: 失败 -2025-06-01 00:34:10,027 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} (地质单元列表查询) -2025-06-01 00:34:10,027 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:10,027 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:10,027 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:10,027 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:10,027 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:10,027 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:10,027 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}'。 -2025-06-01 00:34:10,027 - 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-01 00:34:10,027 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-01 00:34:10,028 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:10,028 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:10,028 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:10,028 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:10,028 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:10,028 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:10,028 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:10,028 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:10,028 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:10,028 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:10,028 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:10,028 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:10,028 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-01 00:34:10,028 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-01 00:34:10,028 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-01 00:34:10,028 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-01 00:34:10,028 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:10,028 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:10,028 - 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-01 00:34:10,028 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 初始化。 -2025-06-01 00:34:10,028 - 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-01 00:34:10,028 - 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-01 00:34:10,028 - 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-01 00:34:10,028 - 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-01 00:34:10,028 - 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-01 00:34:10,028 - 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-01 00:34:10,028 - ddms_compliance_suite.test_orchestrator - INFO - Attempting LLM generation for request body of 'post__api_dms_dms_instance_code_v1_cd_geo_unit_version_135751' with schema... -2025-06-01 00:34:10,028 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLMService.generate_data_from_schema: 使用的JSON 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": { - "type": "string" - }, - "type": "array" - }, - "symbol": { - "description": "运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL", - "type": "string" - } - }, - "type": "object" - }, - "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": { - "type": "string" - }, - "type": "array" - }, - "symbol": { - "description": "运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL", - "type": "string" - } - }, - "type": "object" - }, - "sort": { - "additionalProperties": { - "description": "排序字段,key=字段名,value=排序方式(ASC、DESC)", - "type": "string" - }, - "description": "排序字段,key=字段名,value=排序方式(ASC、DESC)", - "type": "object", - "properties": {} - } - }, - "type": "object" - } - }, - "type": "object" -} -2025-06-01 00:34:10,028 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLM API Request Payload: -{ - "model": "qwen-plus", - "messages": [ - { - "role": "system", - "content": "你是一个API测试数据生成助手。你的任务是根据用户提供的JSON Schema和额外指令,生成一个符合该Schema的JSON对象。请确保你的输出严格是一个JSON对象,不包含任何额外的解释、注释或Markdown标记。" - }, - { - "role": "user", - "content": "请为以下JSON Schema生成一个有效的JSON对象实例:\n\n```json\n{\n \"properties\": {\n \"isSearchCount\": {\n \"default\": true,\n \"description\": \"是否统计总条数\",\n \"type\": \"boolean\"\n },\n \"query\": {\n \"description\": \"查询条件\",\n \"properties\": {\n \"dataRegions\": {\n \"description\": \"数据域,如:JD、DG、TL\",\n \"items\": {\n \"description\": \"数据域,如:JD、DG、TL\",\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"fields\": {\n \"description\": \"查询的字段\",\n \"items\": {\n \"description\": \"查询的字段\",\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"filter\": {\n \"description\": \"筛选器\",\n \"properties\": {\n \"key\": {\n \"description\": \"条件项\",\n \"type\": \"string\"\n },\n \"logic\": {\n \"description\": \"逻辑操作符,可选值为:AND、OR\",\n \"type\": \"string\"\n },\n \"realValue\": {\n \"description\": \"条件值\",\n \"items\": {\n \"description\": \"条件值\",\n \"type\": \"object\",\n \"properties\": {}\n },\n \"type\": \"array\"\n },\n \"singleValue\": {\n \"type\": \"object\",\n \"writeOnly\": true,\n \"properties\": {}\n },\n \"subFilter\": {\n \"description\": \"子条件\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"symbol\": {\n \"description\": \"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"groupFields\": {\n \"description\": \"分组字段group by\",\n \"items\": {\n \"description\": \"分组字段group by\",\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"groupFilter\": {\n \"description\": \"筛选器\",\n \"properties\": {\n \"key\": {\n \"description\": \"条件项\",\n \"type\": \"string\"\n },\n \"logic\": {\n \"description\": \"逻辑操作符,可选值为:AND、OR\",\n \"type\": \"string\"\n },\n \"realValue\": {\n \"description\": \"条件值\",\n \"items\": {\n \"description\": \"条件值\",\n \"type\": \"object\",\n \"properties\": {}\n },\n \"type\": \"array\"\n },\n \"singleValue\": {\n \"type\": \"object\",\n \"writeOnly\": true,\n \"properties\": {}\n },\n \"subFilter\": {\n \"description\": \"子条件\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"symbol\": {\n \"description\": \"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"sort\": {\n \"additionalProperties\": {\n \"description\": \"排序字段,key=字段名,value=排序方式(ASC、DESC)\",\n \"type\": \"string\"\n },\n \"description\": \"排序字段,key=字段名,value=排序方式(ASC、DESC)\",\n \"type\": \"object\",\n \"properties\": {}\n }\n },\n \"type\": \"object\"\n }\n },\n \"type\": \"object\"\n}\n```\n" - } - ], - "max_tokens": 1024, - "temperature": 0.1 -} -2025-06-01 00:34:21,089 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLM API Response: -{ - "choices": [ - { - "message": { - "role": "assistant", - "content": "{\n \"isSearchCount\": true,\n \"query\": {\n \"dataRegions\": [\"JD\", \"DG\"],\n \"fields\": [\"field1\", \"field2\"],\n \"filter\": {\n \"key\": \"conditionKey\",\n \"logic\": \"AND\",\n \"realValue\": [{\"valueKey\": \"value1\"}],\n \"subFilter\": [\"subCondition1\", \"subCondition2\"],\n \"symbol\": \"=\"\n },\n \"groupFields\": [\"groupField1\"],\n \"groupFilter\": {\n \"key\": \"groupConditionKey\",\n \"logic\": \"OR\",\n \"realValue\": [{\"groupValueKey\": \"groupValue1\"}],\n \"subFilter\": [\"groupSubCondition1\"],\n \"symbol\": \">\"\n },\n \"sort\": {\n \"field1\": \"ASC\",\n \"field2\": \"DESC\"\n }\n }\n}" - }, - "finish_reason": "stop", - "index": 0, - "logprobs": null - } - ], - "object": "chat.completion", - "usage": { - "prompt_tokens": 934, - "completion_tokens": 187, - "total_tokens": 1121, - "prompt_tokens_details": { - "cached_tokens": 0 - } - }, - "created": 1748709261, - "system_fingerprint": null, - "model": "qwen-plus", - "id": "chatcmpl-07421a42-85bd-9e97-9d29-2ad6d6858ce7" -} -2025-06-01 00:34:21,091 - ddms_compliance_suite.llm_utils.llm_service - INFO - 成功从LLM生成并解析了数据。 -2025-06-01 00:34:21,091 - 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-01 00:34:21,091 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-01 00:34:21,091 - 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-01 00:34:21,140 - 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-01 00:34:21,140 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 -2025-06-01 00:34:21,140 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 -2025-06-01 00:34:21,140 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-01 00:34:21,141 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:21,141 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:21,141 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:21,141 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:21,141 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:21,141 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:21,141 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,141 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,141 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,141 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,141 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:21,141 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:21,141 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-01 00:34:21,141 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-01 00:34:21,141 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-01 00:34:21,141 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-01 00:34:21,141 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:21,142 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:21,142 - 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-01 00:34:21,142 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 初始化。 -2025-06-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,142 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - 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-01 00:34:21,143 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-01 00:34:21,143 - 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 -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' -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: 487' -d '{"isSearchCount": true, "query": {"dataRegions": ["JD", "DG"], "fields": ["field1", "field2"], "filter": {"key": "conditionKey", "logic": "AND", "realValue": [{"valueKey": "value1"}], "subFilter": ["subCondition1", "subCondition2"], "symbol": "="}, "groupFields": ["groupField1"], "groupFilter": {"key": "groupConditionKey", "logic": "OR", "realValue": [{"groupValueKey": "groupValue1"}], "subFilter": ["groupSubCondition1"], "symbol": ">"}, "sort": {"field1": "ASC", "field2": "DESC"}}}' --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: 487\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["JD", "DG"], "fields": ["field1", "field2"], "filter": {"key": "conditionKey", "logic": "AND", "realValue": [{"valueKey": "value1"}], "subFilter": ["subCondition1", "subCondition2"], "symbol": "="}, "groupFields": ["groupField1"], "groupFilter": {"key": "groupConditionKey", "logic": "OR", "realValue": [{"groupValueKey": "groupValue1"}], "subFilter": ["groupSubCondition1"], "symbol": ">"}, "sort": {"field1": "ASC", "field2": "DESC"}}}\' --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-01 00:34:21,170 - testcase.TC-CORE-FUNC-001 - INFO - 响应包含JSON体,但在API规范中未找到针对状态码 200 的JSON schema。跳过schema验证。 -2025-06-01 00:34:21,170 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 -2025-06-01 00:34:21,170 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 -2025-06-01 00:34:21,170 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-01 00:34:21,170 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:21,170 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:21,170 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:21,170 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:21,170 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:21,170 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:21,170 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,171 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,171 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,171 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,171 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:21,171 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:21,171 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-01 00:34:21,171 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-01 00:34:21,171 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-01 00:34:21,171 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-01 00:34:21,171 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:21,171 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:21,171 - 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-01 00:34:21,171 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 初始化。 -2025-06-01 00:34:21,171 - 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-01 00:34:21,171 - 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-01 00:34:21,171 - 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-01 00:34:21,171 - 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-01 00:34:21,171 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,172 - 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-01 00:34:21,173 - 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-01 00:34:21,173 - 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-01 00:34:21,173 - 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-01 00:34:21,173 - 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-01 00:34:21,173 - 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-01 00:34:21,173 - 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-01 00:34:21,173 - 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-01 00:34:21,173 - 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-01 00:34:21,173 - 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-01 00:34:21,173 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-01 00:34:21,173 - 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-01 00:34:21,173 - 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-01 00:34:21,199 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 -2025-06-01 00:34:21,199 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 -2025-06-01 00:34:21,199 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 -2025-06-01 00:34:21,199 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-01 00:34:21,200 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:21,200 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:21,200 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:21,200 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:21,200 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:21,200 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:21,200 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,200 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,200 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,200 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,200 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:21,200 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:21,201 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-01 00:34:21,201 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-01 00:34:21,201 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-01 00:34:21,201 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-01 00:34:21,201 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:21,201 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:21,201 - 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-01 00:34:21,201 - 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-01 00:34:21,201 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. -2025-06-01 00:34:21,201 - testcase.TC-ERROR-4001-QUERY - DEBUG - _find_first_simple_type_parameter: Checking query parameter 'pageNo'. -2025-06-01 00:34:21,201 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: Found simple type query parameter 'pageNo' (type: string) via its 'schema'. -2025-06-01 00:34:21,201 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Target for type mismatch (query): Param='pageNo', Path='pageNo', Type='string' -2025-06-01 00:34:21,201 - 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-01 00:34:21,201 - 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-01 00:34:21,201 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,202 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Generated mismatched value '12345' for original type 'string' at query path 'pageNo'. -2025-06-01 00:34:21,203 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 pageNo (键 'pageNo') 处设置值为 '12345' -2025-06-01 00:34:21,203 - 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-01 00:34:21,203 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:21,203 - 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-01 00:34:21,203 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-01 00:34:21,203 - 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-01 00:34:21,203 - 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-01 00:34:21,203 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. -2025-06-01 00:34:21,203 - 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-01 00:34:21,203 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:21,203 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: -2025-06-01 00:34:21,233 - testcase.TC-ERROR-4001-QUERY - WARNING - TC-ERROR-4001-QUERY: Failed. 当查询参数 'pageNo' (路径: 'pageNo') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '61'. (Query param: pageNo) -2025-06-01 00:34:21,233 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.029006004333496094 -2025-06-01 00:34:21,233 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-QUERY' 执行失败。 -2025-06-01 00:34:21,233 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 失败 -2025-06-01 00:34:21,233 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-01 00:34:21,234 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:21,234 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:21,234 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:21,234 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:21,234 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:21,234 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:21,234 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,234 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,234 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,234 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,234 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:21,234 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:21,234 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-01 00:34:21,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-01 00:34:21,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-01 00:34:21,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-01 00:34:21,235 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:21,235 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:21,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-01 00:34:21,235 - 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-01 00:34:21,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-01 00:34:21,235 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json -2025-06-01 00:34:21,235 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... -2025-06-01 00:34:21,235 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=isSearchCount, Type=boolean -2025-06-01 00:34:21,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-01 00:34:21,235 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): isSearchCount, Original Type: boolean -2025-06-01 00:34:21,235 - 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-01 00:34:21,235 - 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-01 00:34:21,235 - 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-01 00:34:21,235 - 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-01 00:34:21,235 - 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-01 00:34:21,235 - 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-01 00:34:21,235 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,236 - 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-01 00:34:21,237 - 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-01 00:34:21,237 - 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-01 00:34:21,237 - 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-01 00:34:21,237 - 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-01 00:34:21,237 - 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-01 00:34:21,237 - 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-01 00:34:21,237 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:21,237 - 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-01 00:34:21,237 - 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-01 00:34:21,237 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 isSearchCount (键 'isSearchCount') 处设置值为 'not-a-boolean' -2025-06-01 00:34:21,237 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. -2025-06-01 00:34:21,237 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-01 00:34:21,237 - 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-01 00:34:21,237 - 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-01 00:34:21,237 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. -2025-06-01 00:34:21,237 - 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-01 00:34:21,237 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:21,237 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: -2025-06-01 00:34:21,262 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '16'. (Field: body.isSearchCount) -2025-06-01 00:34:21,263 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.024942874908447266 -2025-06-01 00:34:21,263 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 -2025-06-01 00:34:21,263 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 -2025-06-01 00:34:21,263 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-01 00:34:21,263 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:21,263 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:21,263 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:21,263 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:21,263 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:21,263 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:21,263 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,264 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,264 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,264 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,264 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:21,264 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:21,264 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-01 00:34:21,264 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-01 00:34:21,264 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-01 00:34:21,264 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-01 00:34:21,264 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:21,264 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:21,264 - 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-01 00:34:21,264 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['isSearchCount', 'query'] -2025-06-01 00:34:21,265 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 -2025-06-01 00:34:21,265 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. -2025-06-01 00:34:21,265 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 -2025-06-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,265 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - 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-01 00:34:21,266 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-01 00:34:21,266 - 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' -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=12345&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=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-01 00:34:21,291 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 -2025-06-01 00:34:21,291 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 -2025-06-01 00:34:21,291 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 -2025-06-01 00:34:21,292 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' -2025-06-01 00:34:21,292 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:21,292 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:21,292 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:21,292 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:21,292 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:21,292 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:21,292 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,292 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,292 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,292 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:21,292 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:21,292 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:21,292 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... -2025-06-01 00:34:21,292 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... -2025-06-01 00:34:21,292 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... -2025-06-01 00:34:21,293 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... -2025-06-01 00:34:21,293 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:21,293 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:21,293 - 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-01 00:34:21,293 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. -2025-06-01 00:34:21,293 - 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-01 00:34:21,293 - 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-01 00:34:21,293 - 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-01 00:34:21,293 - 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-01 00:34:21,293 - 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-01 00:34:21,293 - 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-01 00:34:21,293 - 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-01 00:34:21,293 - 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-01 00:34:21,293 - 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-01 00:34:21,293 - 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-01 00:34:21,293 - 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-01 00:34:21,293 - 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-01 00:34:21,293 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - 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-01 00:34:21,294 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code', 'version': '1.0.0'} -2025-06-01 00:34:21,294 - 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-01 00:34:21,319 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 -2025-06-01 00:34:21,319 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 测试完成,最终状态: 失败 -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据修改) -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:21,320 - 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-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:21,320 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:21,320 - 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-01 00:34:21,321 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-01 00:34:21,321 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:21,321 - 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-01 00:34:21,321 - 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-01 00:34:21,321 - 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-01 00:34:21,321 - 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-01 00:34:21,321 - 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-01 00:34:21,321 - ddms_compliance_suite.test_orchestrator - INFO - Attempting LLM generation for request body of 'put__api_dms_dms_instance_code_v1_cd_geo_unit_135749' with schema... -2025-06-01 00:34:21,321 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLMService.generate_data_from_schema: 使用的JSON Schema: -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "type": "object", - "properties": { - "id": { - "type": "string", - "required": true - }, - "version": { - "type": "string" - } - }, - "required": [ - "id", - "version" - ] -} -2025-06-01 00:34:21,321 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLM API Request Payload: -{ - "model": "qwen-plus", - "messages": [ - { - "role": "system", - "content": "你是一个API测试数据生成助手。你的任务是根据用户提供的JSON Schema和额外指令,生成一个符合该Schema的JSON对象。请确保你的输出严格是一个JSON对象,不包含任何额外的解释、注释或Markdown标记。" - }, - { - "role": "user", - "content": "请为以下JSON Schema生成一个有效的JSON对象实例:\n\n```json\n{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"required\": true\n },\n \"version\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"version\"\n ]\n}\n```\n" - } - ], - "max_tokens": 1024, - "temperature": 0.1 -} -2025-06-01 00:34:22,799 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLM API Response: -{ - "choices": [ - { - "message": { - "role": "assistant", - "content": "{\n \"id\": \"12345\",\n \"version\": \"1.0\"\n}" - }, - "finish_reason": "stop", - "index": 0, - "logprobs": null - } - ], - "object": "chat.completion", - "usage": { - "prompt_tokens": 164, - "completion_tokens": 22, - "total_tokens": 186, - "prompt_tokens_details": { - "cached_tokens": 0 - } - }, - "created": 1748709263, - "system_fingerprint": null, - "model": "qwen-plus", - "id": "chatcmpl-cc9043f2-1322-9f50-8f0c-a88a1d534791" -} -2025-06-01 00:34:22,800 - ddms_compliance_suite.llm_utils.llm_service - INFO - 成功从LLM生成并解析了数据。 -2025-06-01 00:34:22,800 - 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-01 00:34:22,800 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:22,800 - 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-01 00:34:22,849 - 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-01 00:34:22,849 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 -2025-06-01 00:34:22,849 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 -2025-06-01 00:34:22,849 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:22,849 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:22,849 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:22,849 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:22,849 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:22,849 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:22,849 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:22,849 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:22,849 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:22,849 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:22,849 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:22,849 - 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-01 00:34:22,849 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-01 00:34:22,849 - 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-01 00:34:22,849 - 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-01 00:34:22,849 - 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-01 00:34:22,849 - 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-01 00:34:22,849 - 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-01 00:34:22,850 - 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-01 00:34:22,850 - 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-01 00:34:22,850 - 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-01 00:34:22,850 - 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-01 00:34:22,850 - 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-01 00:34:22,850 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:22,850 - 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-01 00:34:22,876 - testcase.TC-CORE-FUNC-001 - INFO - 将根据路径 'responses.200.content.application/json.schema' 的schema验证响应体。 -2025-06-01 00:34:22,880 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 -2025-06-01 00:34:22,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 -2025-06-01 00:34:22,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:22,880 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:22,880 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:22,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:22,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:22,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:22,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:22,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:22,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:22,880 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:22,880 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:22,880 - 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-01 00:34:22,880 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-01 00:34:22,880 - 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-01 00:34:22,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-01 00:34:22,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-01 00:34:22,880 - 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-01 00:34:22,880 - 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-01 00:34:22,880 - 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-01 00:34:22,880 - 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-01 00:34:22,880 - 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-01 00:34:22,880 - 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-01 00:34:22,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-01 00:34:22,881 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:22,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-01 00:34:22,881 - 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-01 00:34:22,905 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 -2025-06-01 00:34:22,905 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 -2025-06-01 00:34:22,905 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 -2025-06-01 00:34:22,905 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:22,905 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:22,905 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:22,905 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:22,905 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:22,906 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:22,906 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:22,906 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:22,906 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:22,906 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:22,906 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:22,906 - 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-01 00:34:22,906 - 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-01 00:34:22,906 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. -2025-06-01 00:34:22,906 - testcase.TC-ERROR-4001-QUERY - DEBUG - _find_first_simple_type_parameter: Checking query parameter 'id'. -2025-06-01 00:34:22,906 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: Found simple type query parameter 'id' (type: string) via its 'schema'. -2025-06-01 00:34:22,906 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Target for type mismatch (query): Param='id', Path='id', Type='string' -2025-06-01 00:34:22,906 - 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-01 00:34:22,906 - 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-01 00:34:22,906 - 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-01 00:34:22,906 - 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-01 00:34:22,906 - 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-01 00:34:22,906 - 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-01 00:34:22,906 - 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-01 00:34:22,906 - 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-01 00:34:22,906 - 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-01 00:34:22,906 - 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-01 00:34:22,906 - 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-01 00:34:22,906 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Generated mismatched value '12345' for original type 'string' at query path 'id'. -2025-06-01 00:34:22,906 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 id (键 'id') 处设置值为 '12345' -2025-06-01 00:34:22,906 - 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-01 00:34:22,906 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:22,906 - 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-01 00:34:22,906 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:22,906 - 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-01 00:34:22,906 - 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-01 00:34:22,906 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. -2025-06-01 00:34:22,906 - 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-01 00:34:22,906 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:22,906 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: -2025-06-01 00:34:22,928 - testcase.TC-ERROR-4001-QUERY - WARNING - TC-ERROR-4001-QUERY: Failed. 当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '50'. (Query param: id) -2025-06-01 00:34:22,928 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.02186870574951172 -2025-06-01 00:34:22,928 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-QUERY' 执行失败。 -2025-06-01 00:34:22,928 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 失败 -2025-06-01 00:34:22,928 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:22,928 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:22,928 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:22,928 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:22,928 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:22,928 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:22,928 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:22,929 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:22,929 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:22,929 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:22,929 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:22,929 - 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-01 00:34:22,929 - 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-01 00:34:22,929 - 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-01 00:34:22,929 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json -2025-06-01 00:34:22,929 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... -2025-06-01 00:34:22,929 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=id, Type=string -2025-06-01 00:34:22,929 - 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-01 00:34:22,929 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): id, Original Type: string -2025-06-01 00:34:22,929 - 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-01 00:34:22,929 - 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-01 00:34:22,929 - 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-01 00:34:22,929 - 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-01 00:34:22,929 - 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-01 00:34:22,929 - 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-01 00:34:22,929 - 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-01 00:34:22,929 - 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-01 00:34:22,929 - 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-01 00:34:22,929 - 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-01 00:34:22,929 - 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-01 00:34:22,929 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:22,929 - 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-01 00:34:22,929 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value '12345' for original type 'string' at path 'id'. -2025-06-01 00:34:22,929 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 id (键 'id') 处设置值为 '12345' -2025-06-01 00:34:22,929 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. -2025-06-01 00:34:22,929 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:22,929 - 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-01 00:34:22,929 - 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-01 00:34:22,929 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. -2025-06-01 00:34:22,929 - 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-01 00:34:22,929 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:22,929 - 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' -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 -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: 33' -d '{"id": "12345", "version": "1.0"}' --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: 33\' -d \'{"id": "12345", "version": "1.0"}\' --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: 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' -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=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: 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' -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=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: 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-01 00:34:22,960 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'id' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '17'. (Field: body.id) -2025-06-01 00:34:22,960 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.03026294708251953 -2025-06-01 00:34:22,960 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 -2025-06-01 00:34:22,960 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 -2025-06-01 00:34:22,960 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:22,960 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:22,960 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:22,960 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:22,960 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:22,960 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:22,960 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:22,960 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:22,960 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:22,960 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:22,961 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:22,961 - 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-01 00:34:22,961 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: ['id', 'version'], 属性: ['id', 'version'] -2025-06-01 00:34:22,961 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 策略1: 在路径 root 找到可直接移除的必填字段: 'id' -2025-06-01 00:34:22,961 - testcase.TC-ERROR-4003-BODY - INFO - Found a removable field path in 'request body' schema: 'id' -2025-06-01 00:34:22,961 - 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-01 00:34:22,961 - 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-01 00:34:22,961 - 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-01 00:34:22,961 - 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-01 00:34:22,961 - 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-01 00:34:22,961 - 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-01 00:34:22,961 - 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-01 00:34:22,961 - 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-01 00:34:22,961 - 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-01 00:34:22,961 - 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-01 00:34:22,961 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 从路径 'id' 成功移除字段 'id' (原值: 'example_string')。 -2025-06-01 00:34:22,961 - testcase.TC-ERROR-4003-BODY - INFO - 为进行必填字段缺失测试,已通过工具方法从请求体中移除字段路径 'id'。 -2025-06-01 00:34:22,961 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:22,961 - 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-01 00:34:22,985 - 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-01 00:34:22,985 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 -2025-06-01 00:34:22,985 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 -2025-06-01 00:34:22,985 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:22,985 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:22,985 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:22,985 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:22,985 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:22,986 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:22,986 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:22,986 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:22,986 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:22,986 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:22,986 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:22,986 - 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-01 00:34:22,986 - testcase.TC-ERROR-4003-QUERY - INFO - Found required 'query' parameter: 'id'. -2025-06-01 00:34:22,986 - 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-01 00:34:22,986 - 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-01 00:34:22,986 - 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-01 00:34:22,986 - 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-01 00:34:22,986 - 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-01 00:34:22,986 - 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-01 00:34:22,986 - 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-01 00:34:22,986 - 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-01 00:34:22,986 - 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-01 00:34:22,986 - 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-01 00:34:22,993 - 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-01 00:34:22,993 - testcase.TC-ERROR-4003-QUERY - INFO - 为进行必填查询参数缺失测试,已从查询参数中移除 'id' (原值: 'dsid')。 -2025-06-01 00:34:22,993 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:22,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-01 00:34:23,015 - testcase.TC-ERROR-4003-QUERY - WARNING - TC-ERROR-4003-QUERY: Failed. 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '47'. (Removed query param: id) -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4003-QUERY' 执行失败。 -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 失败 -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 测试完成,最终状态: 失败 -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据删除) -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:23,016 - 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-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:23,016 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:23,016 - 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-01 00:34:23,017 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-01 00:34:23,017 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:23,017 - 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-01 00:34:23,017 - 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-01 00:34:23,017 - 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-01 00:34:23,017 - 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-01 00:34:23,017 - 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-01 00:34:23,017 - ddms_compliance_suite.test_orchestrator - INFO - Attempting LLM generation for request body of 'delete__api_dms_dms_instance_code_v1_cd_geo_unit_135750' with schema... -2025-06-01 00:34:23,017 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLMService.generate_data_from_schema: 使用的JSON Schema: -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "type": "object", - "properties": { - "version": { - "type": "string", - "title": "版本号" - }, - "data": { - "type": "array", - "items": { - "type": "string" - }, - "title": "主键id数据集" - } - } -} -2025-06-01 00:34:23,017 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLM API Request Payload: -{ - "model": "qwen-plus", - "messages": [ - { - "role": "system", - "content": "你是一个API测试数据生成助手。你的任务是根据用户提供的JSON Schema和额外指令,生成一个符合该Schema的JSON对象。请确保你的输出严格是一个JSON对象,不包含任何额外的解释、注释或Markdown标记。" - }, - { - "role": "user", - "content": "请为以下JSON Schema生成一个有效的JSON对象实例:\n\n```json\n{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"version\": {\n \"type\": \"string\",\n \"title\": \"版本号\"\n },\n \"data\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"主键id数据集\"\n }\n }\n}\n```\n" - } - ], - "max_tokens": 1024, - "temperature": 0.1 -} -2025-06-01 00:34:24,407 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLM API Response: -{ - "choices": [ - { - "message": { - "role": "assistant", - "content": "{\n \"version\": \"1.0.0\",\n \"data\": [\"id1\", \"id2\", \"id3\"]\n}" - }, - "finish_reason": "stop", - "index": 0, - "logprobs": null - } - ], - "object": "chat.completion", - "usage": { - "prompt_tokens": 176, - "completion_tokens": 29, - "total_tokens": 205, - "prompt_tokens_details": { - "cached_tokens": 0 - } - }, - "created": 1748709264, - "system_fingerprint": null, - "model": "qwen-plus", - "id": "chatcmpl-4815ef00-1728-930c-8fe7-7b973e67525b" -} -2025-06-01 00:34:24,408 - ddms_compliance_suite.llm_utils.llm_service - INFO - 成功从LLM生成并解析了数据。 -2025-06-01 00:34:24,408 - 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-01 00:34:24,408 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:24,408 - 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-01 00:34:24,454 - 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-01 00:34:24,455 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 -2025-06-01 00:34:24,455 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 -2025-06-01 00:34:24,455 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:24,455 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:24,455 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:24,455 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:24,455 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:24,455 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:24,455 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:24,455 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:24,455 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:24,455 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:24,456 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:24,456 - 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-01 00:34:24,456 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-01 00:34:24,456 - 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-01 00:34:24,456 - 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-01 00:34:24,456 - 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-01 00:34:24,456 - 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-01 00:34:24,456 - 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-01 00:34:24,456 - 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-01 00:34:24,456 - 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-01 00:34:24,456 - 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-01 00:34:24,456 - 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-01 00:34:24,456 - 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-01 00:34:24,456 - 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-01 00:34:24,456 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:24,456 - 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-01 00:34:24,484 - testcase.TC-CORE-FUNC-001 - INFO - 将根据路径 'responses.200.content.application/json.schema' 的schema验证响应体。 -2025-06-01 00:34:24,484 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 -2025-06-01 00:34:24,484 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 -2025-06-01 00:34:24,484 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:24,484 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:24,484 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:24,484 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:24,484 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:24,484 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:24,484 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:24,484 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:24,484 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:24,485 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:24,485 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:24,485 - 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-01 00:34:24,485 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-01 00:34:24,485 - 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-01 00:34:24,485 - 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-01 00:34:24,485 - 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-01 00:34:24,485 - 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-01 00:34:24,485 - 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-01 00:34:24,485 - 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-01 00:34:24,485 - 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-01 00:34:24,485 - 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-01 00:34:24,485 - 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-01 00:34:24,485 - 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-01 00:34:24,485 - 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-01 00:34:24,485 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:24,485 - 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-01 00:34:24,485 - 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-01 00:34:24,512 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 -2025-06-01 00:34:24,512 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 -2025-06-01 00:34:24,512 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 -2025-06-01 00:34:24,512 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:24,512 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:24,512 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:24,512 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:24,512 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:24,512 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:24,512 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:24,512 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:24,513 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:24,513 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:24,513 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:24,513 - 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-01 00:34:24,513 - 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-01 00:34:24,513 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. -2025-06-01 00:34:24,513 - testcase.TC-ERROR-4001-QUERY - DEBUG - _find_first_simple_type_parameter: Checking query parameter 'id'. -2025-06-01 00:34:24,513 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: Found simple type query parameter 'id' (type: string) via its 'schema'. -2025-06-01 00:34:24,513 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Target for type mismatch (query): Param='id', Path='id', Type='string' -2025-06-01 00:34:24,513 - 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-01 00:34:24,513 - 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-01 00:34:24,513 - 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-01 00:34:24,513 - 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-01 00:34:24,513 - 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-01 00:34:24,513 - 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-01 00:34:24,513 - 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-01 00:34:24,513 - 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-01 00:34:24,513 - 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-01 00:34:24,513 - 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-01 00:34:24,513 - 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-01 00:34:24,513 - 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-01 00:34:24,513 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Generated mismatched value '12345' for original type 'string' at query path 'id'. -2025-06-01 00:34:24,513 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 id (键 'id') 处设置值为 '12345' -2025-06-01 00:34:24,513 - 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-01 00:34:24,513 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:24,513 - 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-01 00:34:24,513 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:24,513 - 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-01 00:34:24,513 - 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-01 00:34:24,513 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. -2025-06-01 00:34:24,513 - 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-01 00:34:24,513 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:24,513 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: -2025-06-01 00:34:24,537 - testcase.TC-ERROR-4001-QUERY - WARNING - TC-ERROR-4001-QUERY: Failed. 当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '26'. (Query param: id) -2025-06-01 00:34:24,537 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.023127079010009766 -2025-06-01 00:34:24,537 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-QUERY' 执行失败。 -2025-06-01 00:34:24,537 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 失败 -2025-06-01 00:34:24,537 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:24,537 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:24,537 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:24,537 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:24,537 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:24,537 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:24,537 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:24,537 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:24,537 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:24,537 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:24,537 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:24,537 - 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-01 00:34:24,537 - 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-01 00:34:24,537 - 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-01 00:34:24,537 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json -2025-06-01 00:34:24,537 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... -2025-06-01 00:34:24,537 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=version, Type=string -2025-06-01 00:34:24,537 - 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-01 00:34:24,538 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): version, Original Type: string -2025-06-01 00:34:24,538 - 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-01 00:34:24,538 - 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-01 00:34:24,538 - 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-01 00:34:24,538 - 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-01 00:34:24,538 - 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-01 00:34:24,538 - 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-01 00:34:24,538 - 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-01 00:34:24,538 - 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-01 00:34:24,538 - 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-01 00:34:24,538 - 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-01 00:34:24,538 - 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-01 00:34:24,538 - 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-01 00:34:24,538 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:24,538 - 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-01 00:34:24,538 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value '12345' for original type 'string' at path 'version'. -2025-06-01 00:34:24,538 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 version (键 'version') 处设置值为 '12345' -2025-06-01 00:34:24,538 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. -2025-06-01 00:34:24,538 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:24,538 - 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-01 00:34:24,538 - 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-01 00:34:24,538 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. -2025-06-01 00:34:24,538 - 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-01 00:34:24,538 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:24,538 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: -2025-06-01 00:34:24,561 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '63'. (Field: body.version) -2025-06-01 00:34:24,562 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.02292180061340332 -2025-06-01 00:34:24,562 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 -2025-06-01 00:34:24,562 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 -2025-06-01 00:34:24,562 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:24,562 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:24,562 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:24,562 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:24,562 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:24,562 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:24,562 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:24,562 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:24,562 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:24,562 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:24,562 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:24,562 - 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-01 00:34:24,562 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['version', 'data'] -2025-06-01 00:34:24,562 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 -2025-06-01 00:34:24,562 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. -2025-06-01 00:34:24,562 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 -2025-06-01 00:34:24,562 - 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-01 00:34:24,562 - 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-01 00:34:24,562 - 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-01 00:34:24,563 - 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-01 00:34:24,563 - 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-01 00:34:24,563 - 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-01 00:34:24,563 - 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-01 00:34:24,563 - 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-01 00:34:24,563 - 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-01 00:34:24,563 - 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-01 00:34:24,563 - 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-01 00:34:24,563 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:24,563 - 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-01 00:34:24,587 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 -2025-06-01 00:34:24,587 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 -2025-06-01 00:34:24,587 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 -2025-06-01 00:34:24,587 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:24,587 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:24,587 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:24,587 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:24,587 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:24,587 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:24,587 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... -2025-06-01 00:34:24,587 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... -2025-06-01 00:34:24,587 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... -2025-06-01 00:34:24,587 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:24,587 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:24,588 - 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-01 00:34:24,588 - testcase.TC-ERROR-4003-QUERY - INFO - Found required 'query' parameter: 'id'. -2025-06-01 00:34:24,588 - 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-01 00:34:24,588 - 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-01 00:34:24,588 - 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-01 00:34:24,588 - 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-01 00:34:24,588 - 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-01 00:34:24,588 - 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-01 00:34:24,588 - 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-01 00:34:24,588 - 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-01 00:34:24,588 - 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-01 00:34:24,588 - 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-01 00:34:24,588 - 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-01 00:34:24,588 - 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-01 00:34:24,588 - testcase.TC-ERROR-4003-QUERY - INFO - 为进行必填查询参数缺失测试,已从查询参数中移除 'id' (原值: 'dsid')。 -2025-06-01 00:34:24,588 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:24,588 - 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\'' -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 -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' -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: 51' -d '{"version": "1.0.0", "data": ["id1", "id2", "id3"]}' --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: 51\' -d \'{"version": "1.0.0", "data": ["id1", "id2", "id3"]}\' --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\'' -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\'' -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=12345' -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=12345\'' -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: 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 (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-01 00:34:24,625 - testcase.TC-ERROR-4003-QUERY - WARNING - TC-ERROR-4003-QUERY: Failed. 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '73'. (Removed query param: id) -2025-06-01 00:34:24,625 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4003-QUERY' 执行失败。 -2025-06-01 00:34:24,625 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 失败 -2025-06-01 00:34:24,625 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 测试完成,最终状态: 失败 -2025-06-01 00:34:24,625 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据添加) -2025-06-01 00:34:24,625 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:24,625 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-CORE-FUNC-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:24,625 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:24,625 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:24,625 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:24,625 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:24,625 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 -2025-06-01 00:34:24,625 - 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-01 00:34:24,626 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:24,626 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:24,626 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:24,626 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:24,626 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:24,626 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:24,626 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-01 00:34:24,626 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-01 00:34:24,626 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:24,626 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:24,627 - 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-01 00:34:24,627 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-01 00:34:24,627 - ddms_compliance_suite.test_orchestrator - INFO - 开始执行测试用例 'TC-STATUS-001' (基本状态码 200 检查) for endpoint 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:24,627 - 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-01 00:34:24,627 - 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-01 00:34:24,627 - 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-01 00:34:24,627 - 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-01 00:34:24,627 - ddms_compliance_suite.test_orchestrator - INFO - Attempting LLM generation for request body of 'post__api_dms_dms_instance_code_v1_cd_geo_unit_135748' with schema... -2025-06-01 00:34:24,627 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLMService.generate_data_from_schema: 使用的JSON 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": "交换模型数据集" - } - } -} -2025-06-01 00:34:24,627 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLM API Request Payload: -{ - "model": "qwen-plus", - "messages": [ - { - "role": "system", - "content": "你是一个API测试数据生成助手。你的任务是根据用户提供的JSON Schema和额外指令,生成一个符合该Schema的JSON对象。请确保你的输出严格是一个JSON对象,不包含任何额外的解释、注释或Markdown标记。" - }, - { - "role": "user", - "content": "请为以下JSON Schema生成一个有效的JSON对象实例:\n\n```json\n{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"version\": {\n \"type\": \"string\",\n \"title\": \"交换模型版本号\"\n },\n \"data\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"bsflag\": {\n \"type\": \"number\",\n \"title\": \"必填字段删除标记\"\n },\n \"wellCommonName\": {\n \"type\": \"string\"\n },\n \"wellId\": {\n \"type\": \"string\"\n },\n \"dataRegion\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"bsflag\",\n \"wellCommonName\",\n \"wellId\",\n \"dataRegion\"\n ]\n },\n \"title\": \"交换模型数据集\"\n }\n }\n}\n```\n" - } - ], - "max_tokens": 1024, - "temperature": 0.1 -} -2025-06-01 00:34:30,046 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLM API Response: -{ - "choices": [ - { - "message": { - "role": "assistant", - "content": "{\n \"version\": \"1.0\",\n \"data\": [\n {\n \"bsflag\": 0,\n \"wellCommonName\": \"Well_A\",\n \"wellId\": \"WID_001\",\n \"dataRegion\": \"Region_X\"\n },\n {\n \"bsflag\": 1,\n \"wellCommonName\": \"Well_B\",\n \"wellId\": \"WID_002\",\n \"dataRegion\": \"Region_Y\"\n }\n ]\n}" - }, - "finish_reason": "stop", - "index": 0, - "logprobs": null - } - ], - "object": "chat.completion", - "usage": { - "prompt_tokens": 284, - "completion_tokens": 106, - "total_tokens": 390, - "prompt_tokens_details": { - "cached_tokens": 0 - } - }, - "created": 1748709270, - "system_fingerprint": null, - "model": "qwen-plus", - "id": "chatcmpl-5273179a-ac4f-9517-b57e-5331be807e17" -} -2025-06-01 00:34:30,046 - ddms_compliance_suite.llm_utils.llm_service - INFO - 成功从LLM生成并解析了数据。 -2025-06-01 00:34:30,046 - 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-01 00:34:30,046 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:30,046 - 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-01 00:34:30,089 - 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-01 00:34:30,090 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 -2025-06-01 00:34:30,090 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 -2025-06-01 00:34:30,090 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-CORE-FUNC-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:30,090 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:30,090 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:30,090 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:30,090 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:30,090 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:30,090 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-01 00:34:30,090 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-01 00:34:30,090 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:30,090 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:30,090 - 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-01 00:34:30,090 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-01 00:34:30,090 - 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-01 00:34:30,090 - 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-01 00:34:30,090 - 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-01 00:34:30,090 - 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-01 00:34:30,090 - 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-01 00:34:30,090 - 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-01 00:34:30,090 - 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-01 00:34:30,090 - 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-01 00:34:30,090 - 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-01 00:34:30,091 - 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-01 00:34:30,091 - 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-01 00:34:30,091 - 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-01 00:34:30,091 - 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-01 00:34:30,091 - 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-01 00:34:30,091 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:30,091 - 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-01 00:34:30,115 - testcase.TC-CORE-FUNC-001 - INFO - 响应包含JSON体,但在API规范中未找到针对状态码 200 的JSON schema。跳过schema验证。 -2025-06-01 00:34:30,115 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 -2025-06-01 00:34:30,115 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 -2025-06-01 00:34:30,115 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:30,115 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:30,115 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:30,115 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:30,115 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:30,115 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:30,115 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-01 00:34:30,115 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-01 00:34:30,115 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:30,115 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:30,116 - 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-01 00:34:30,116 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 -2025-06-01 00:34:30,116 - 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-01 00:34:30,116 - 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-01 00:34:30,116 - 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-01 00:34:30,116 - 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-01 00:34:30,116 - 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-01 00:34:30,116 - 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-01 00:34:30,116 - 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-01 00:34:30,116 - 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-01 00:34:30,116 - 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-01 00:34:30,116 - 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-01 00:34:30,116 - 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-01 00:34:30,116 - 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-01 00:34:30,116 - 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-01 00:34:30,116 - 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-01 00:34:30,116 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:30,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 -2025-06-01 00:34:30,116 - 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-01 00:34:30,139 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 -2025-06-01 00:34:30,139 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 -2025-06-01 00:34:30,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 -2025-06-01 00:34:30,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:30,139 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:30,139 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:30,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:30,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:30,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:30,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-01 00:34:30,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-01 00:34:30,139 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:30,139 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:30,139 - 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-01 00:34:30,139 - 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-01 00:34:30,139 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. -2025-06-01 00:34:30,139 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: No suitable simple type field found for query parameters. -2025-06-01 00:34:30,139 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No suitable simple type query parameter found for type mismatch test. -2025-06-01 00:34:30,139 - 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-01 00:34:30,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-01 00:34:30,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-01 00:34:30,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-01 00:34:30,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-01 00:34:30,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-01 00:34:30,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-01 00:34:30,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-01 00:34:30,140 - 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-01 00:34:30,140 - 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-01 00:34:30,140 - 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-01 00:34:30,140 - 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-01 00:34:30,140 - 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-01 00:34:30,140 - 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-01 00:34:30,140 - 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-01 00:34:30,140 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:30,140 - 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-01 00:34:30,140 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:30,140 - 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-01 00:34:30,140 - 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-01 00:34:30,140 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. -2025-06-01 00:34:30,140 - 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-01 00:34:30,140 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:30,140 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: -2025-06-01 00:34:30,162 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Skipped type mismatch (query) validation: No target query parameter was identified. -2025-06-01 00:34:30,162 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.021913766860961914 -2025-06-01 00:34:30,162 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4001-QUERY' 执行成功。 -2025-06-01 00:34:30,162 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 通过 -2025-06-01 00:34:30,162 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4001-BODY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:30,162 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:30,162 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:30,162 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:30,162 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:30,162 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:30,162 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-01 00:34:30,162 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-01 00:34:30,162 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:30,162 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:30,162 - 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-01 00:34:30,162 - 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-01 00:34:30,162 - 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-01 00:34:30,162 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json -2025-06-01 00:34:30,162 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... -2025-06-01 00:34:30,162 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=version, Type=string -2025-06-01 00:34:30,162 - 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-01 00:34:30,162 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): version, Original Type: string -2025-06-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:30,163 - 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-01 00:34:30,163 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Generated mismatched value '12345' for original type 'string' at path 'version'. -2025-06-01 00:34:30,163 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 version (键 'version') 处设置值为 '12345' -2025-06-01 00:34:30,163 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. -2025-06-01 00:34:30,163 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:30,163 - 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-01 00:34:30,163 - 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-01 00:34:30,163 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. -2025-06-01 00:34:30,163 - 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-01 00:34:30,163 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:30,163 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: -2025-06-01 00:34:30,190 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '100'. (Field: body.version) -2025-06-01 00:34:30,191 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.027024030685424805 -2025-06-01 00:34:30,191 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 -2025-06-01 00:34:30,191 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 -2025-06-01 00:34:30,191 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-BODY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:30,191 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:30,191 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:30,191 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:30,191 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:30,191 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:30,191 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-01 00:34:30,191 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-01 00:34:30,191 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:30,191 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:30,191 - 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-01 00:34:30,191 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['version', 'data'] -2025-06-01 00:34:30,191 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 策略2: 在数组属性 'data' (路径 root) 的元素内找到必填字段: 'bsflag'. 路径: ['data', 0, 'bsflag'] -2025-06-01 00:34:30,191 - testcase.TC-ERROR-4003-BODY - INFO - Found a removable field path in 'request body' schema: 'data.0.bsflag' -2025-06-01 00:34:30,192 - 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-01 00:34:30,192 - 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-01 00:34:30,192 - 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-01 00:34:30,192 - 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-01 00:34:30,192 - 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-01 00:34:30,192 - 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-01 00:34:30,192 - 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-01 00:34:30,192 - 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-01 00:34:30,192 - 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-01 00:34:30,192 - 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-01 00:34:30,192 - 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-01 00:34:30,192 - 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-01 00:34:30,192 - 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-01 00:34:30,192 - 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-01 00:34:30,192 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 从路径 'data.0.bsflag' 成功移除字段 'bsflag' (原值: '0.0')。 -2025-06-01 00:34:30,192 - testcase.TC-ERROR-4003-BODY - INFO - 为进行必填字段缺失测试,已通过工具方法从请求体中移除字段路径 'data.0.bsflag'。 -2025-06-01 00:34:30,192 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:30,192 - 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-01 00:34:30,221 - testcase.TC-ERROR-4003-BODY - WARNING - TC-ERROR-4003-BODY: Failed. 当移除必填请求体字段 'data.0.bsflag' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '24'. (Removed field: body.data.0.bsflag) -2025-06-01 00:34:30,221 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4003-BODY' 执行失败。 -2025-06-01 00:34:30,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 失败 -2025-06-01 00:34:30,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-ERROR-4003-QUERY' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' -2025-06-01 00:34:30,221 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:30,221 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:30,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:30,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:30,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:30,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... -2025-06-01 00:34:30,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... -2025-06-01 00:34:30,221 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... -2025-06-01 00:34:30,221 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:30,222 - 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-01 00:34:30,222 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. -2025-06-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - 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-01 00:34:30,222 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} -2025-06-01 00:34:30,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 -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: 208' -d '{"version": "1.0", "data": [{"bsflag": 0, "wellCommonName": "Well_A", "wellId": "WID_001", "dataRegion": "Region_X"}, {"bsflag": 1, "wellCommonName": "Well_B", "wellId": "WID_002", "dataRegion": "Region_Y"}]}' --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: 208\' -d \'{"version": "1.0", "data": [{"bsflag": 0, "wellCommonName": "Well_A", "wellId": "WID_001", "dataRegion": "Region_X"}, {"bsflag": 1, "wellCommonName": "Well_B", "wellId": "WID_002", "dataRegion": "Region_Y"}]}\' --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 -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 -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 -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 -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 (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-01 00:34:30,247 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 -2025-06-01 00:34:30,247 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 -2025-06-01 00:34:30,248 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 -2025-06-01 00:34:30,248 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 测试完成,最终状态: 失败 -2025-06-01 00:34:30,248 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id} (地质单元查询详情) -2025-06-01 00:34:30,248 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-01 00:34:30,248 - 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-01 00:34:30,248 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}'。 -2025-06-01 00:34:30,248 - 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-01 00:34:30,248 - 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-01 00:34:30,248 - 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-01 00:34:30,248 - 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-01 00:34:30,248 - 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-01 00:34:30,248 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-01 00:34:30,248 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:30,248 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:30,248 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:30,248 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:30,248 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:30,248 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:30,249 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:30,249 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:30,249 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:30,249 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:30,249 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:30,249 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:30,249 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-01 00:34:30,249 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:30,249 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:30,249 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:30,249 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:30,249 - 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-01 00:34:30,249 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 初始化。 -2025-06-01 00:34:30,249 - 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-01 00:34:30,249 - 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-01 00:34:30,249 - 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-01 00:34:30,249 - 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-01 00:34:30,249 - 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-01 00:34:30,249 - ddms_compliance_suite.test_orchestrator - INFO - Attempting LLM generation for request body of 'get__api_dms_dms_instance_code_v1_cd_geo_unit_version_id_135752' with schema... -2025-06-01 00:34:30,250 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLMService.generate_data_from_schema: 使用的JSON 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": { - "type": "string" - }, - "type": "array" - }, - "symbol": { - "description": "运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL", - "type": "string" - } - }, - "type": "object" - }, - "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": { - "type": "string" - }, - "type": "array" - }, - "symbol": { - "description": "运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL", - "type": "string" - } - }, - "type": "object" - }, - "sort": { - "additionalProperties": { - "description": "排序字段,key=字段名,value=排序方式(ASC、DESC)", - "type": "string" - }, - "description": "排序字段,key=字段名,value=排序方式(ASC、DESC)", - "type": "object", - "properties": {} - } - }, - "type": "object" - } - }, - "type": "object" -} -2025-06-01 00:34:30,250 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLM API Request Payload: -{ - "model": "qwen-plus", - "messages": [ - { - "role": "system", - "content": "你是一个API测试数据生成助手。你的任务是根据用户提供的JSON Schema和额外指令,生成一个符合该Schema的JSON对象。请确保你的输出严格是一个JSON对象,不包含任何额外的解释、注释或Markdown标记。" - }, - { - "role": "user", - "content": "请为以下JSON Schema生成一个有效的JSON对象实例:\n\n```json\n{\n \"properties\": {\n \"isSearchCount\": {\n \"default\": true,\n \"description\": \"是否统计总条数\",\n \"type\": \"boolean\"\n },\n \"query\": {\n \"description\": \"查询条件\",\n \"properties\": {\n \"dataRegions\": {\n \"description\": \"数据域,如:JD、DG、TL\",\n \"items\": {\n \"description\": \"数据域,如:JD、DG、TL\",\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"fields\": {\n \"description\": \"查询的字段\",\n \"items\": {\n \"description\": \"查询的字段\",\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"filter\": {\n \"description\": \"筛选器\",\n \"properties\": {\n \"key\": {\n \"description\": \"条件项\",\n \"type\": \"string\"\n },\n \"logic\": {\n \"description\": \"逻辑操作符,可选值为:AND、OR\",\n \"type\": \"string\"\n },\n \"realValue\": {\n \"description\": \"条件值\",\n \"items\": {\n \"description\": \"条件值\",\n \"type\": \"object\",\n \"properties\": {}\n },\n \"type\": \"array\"\n },\n \"singleValue\": {\n \"type\": \"object\",\n \"writeOnly\": true,\n \"properties\": {}\n },\n \"subFilter\": {\n \"description\": \"子条件\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"symbol\": {\n \"description\": \"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"groupFields\": {\n \"description\": \"分组字段group by\",\n \"items\": {\n \"description\": \"分组字段group by\",\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"groupFilter\": {\n \"description\": \"筛选器\",\n \"properties\": {\n \"key\": {\n \"description\": \"条件项\",\n \"type\": \"string\"\n },\n \"logic\": {\n \"description\": \"逻辑操作符,可选值为:AND、OR\",\n \"type\": \"string\"\n },\n \"realValue\": {\n \"description\": \"条件值\",\n \"items\": {\n \"description\": \"条件值\",\n \"type\": \"object\",\n \"properties\": {}\n },\n \"type\": \"array\"\n },\n \"singleValue\": {\n \"type\": \"object\",\n \"writeOnly\": true,\n \"properties\": {}\n },\n \"subFilter\": {\n \"description\": \"子条件\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"symbol\": {\n \"description\": \"运算符,可选值为:>、>=、<、<=、>、<、=、<>、!=、IN、NOTIN、LIKE、IS;当运算符为 IS 时,条件值只能为NULL或NOT NULL\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"sort\": {\n \"additionalProperties\": {\n \"description\": \"排序字段,key=字段名,value=排序方式(ASC、DESC)\",\n \"type\": \"string\"\n },\n \"description\": \"排序字段,key=字段名,value=排序方式(ASC、DESC)\",\n \"type\": \"object\",\n \"properties\": {}\n }\n },\n \"type\": \"object\"\n }\n },\n \"type\": \"object\"\n}\n```\n" - } - ], - "max_tokens": 1024, - "temperature": 0.1 -} -2025-06-01 00:34:37,851 - ddms_compliance_suite.llm_utils.llm_service - DEBUG - LLM API Response: -{ - "choices": [ - { - "message": { - "role": "assistant", - "content": "{\n \"isSearchCount\": true,\n \"query\": {\n \"dataRegions\": [\"JD\", \"DG\"],\n \"fields\": [\"field1\", \"field2\"],\n \"filter\": {\n \"key\": \"conditionKey\",\n \"logic\": \"AND\",\n \"realValue\": [\n {\n \"value1\": \"example\"\n }\n ],\n \"subFilter\": [\"subCondition1\", \"subCondition2\"],\n \"symbol\": \"=\"\n },\n \"groupFields\": [\"groupField1\"],\n \"groupFilter\": {\n \"key\": \"groupConditionKey\",\n \"logic\": \"OR\",\n \"realValue\": [\n {\n \"value1\": \"exampleGroup\"\n }\n ],\n \"subFilter\": [\"subGroupCondition1\"],\n \"symbol\": \">\"\n },\n \"sort\": {\n \"field1\": \"ASC\",\n \"field2\": \"DESC\"\n }\n }\n}" - }, - "finish_reason": "stop", - "index": 0, - "logprobs": null - } - ], - "object": "chat.completion", - "usage": { - "prompt_tokens": 934, - "completion_tokens": 198, - "total_tokens": 1132, - "prompt_tokens_details": { - "cached_tokens": 0 - } - }, - "created": 1748709278, - "system_fingerprint": null, - "model": "qwen-plus", - "id": "chatcmpl-5d7d0d7c-0b26-9ec7-9737-ff8f3e952009" -} -2025-06-01 00:34:37,852 - ddms_compliance_suite.llm_utils.llm_service - INFO - 成功从LLM生成并解析了数据。 -2025-06-01 00:34:37,852 - 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-01 00:34:37,852 - 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-01 00:34:37,852 - 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-01 00:34:37,890 - 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-01 00:34:37,891 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 -2025-06-01 00:34:37,891 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 -2025-06-01 00:34:37,891 - 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-01 00:34:37,891 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:37,891 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:37,891 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:37,891 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:37,891 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:37,891 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:37,891 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,891 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,891 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,891 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,891 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:37,891 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:37,891 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-01 00:34:37,891 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:37,891 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:37,891 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:37,891 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:37,891 - 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-01 00:34:37,891 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 初始化。 -2025-06-01 00:34:37,891 - 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-01 00:34:37,891 - 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-01 00:34:37,891 - 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-01 00:34:37,891 - 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-01 00:34:37,891 - 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-01 00:34:37,891 - 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-01 00:34:37,891 - 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-01 00:34:37,891 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,892 - 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-01 00:34:37,916 - testcase.TC-CORE-FUNC-001 - INFO - 将根据路径 'responses.200.content.application/json.schema' 的schema验证响应体。 -2025-06-01 00:34:37,916 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 -2025-06-01 00:34:37,917 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 -2025-06-01 00:34:37,917 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' -2025-06-01 00:34:37,917 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:37,917 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:37,917 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:37,917 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:37,917 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:37,917 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:37,917 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,917 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,917 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,917 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,917 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:37,917 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:37,917 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-01 00:34:37,917 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:37,917 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:37,917 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:37,917 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:37,917 - 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-01 00:34:37,917 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 初始化。 -2025-06-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,917 - 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-01 00:34:37,918 - 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-01 00:34:37,918 - 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-01 00:34:37,918 - 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-01 00:34:37,918 - 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-01 00:34:37,944 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 -2025-06-01 00:34:37,944 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 -2025-06-01 00:34:37,944 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 -2025-06-01 00:34:37,944 - 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-01 00:34:37,944 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:37,944 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:37,944 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:37,944 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:37,944 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:37,944 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:37,944 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,944 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,944 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,944 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,944 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:37,944 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:37,944 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-01 00:34:37,944 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:37,944 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:37,944 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:37,944 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Initializing: Looking for a simple type query parameter for type mismatch test. -2025-06-01 00:34:37,944 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: No suitable simple type field found for query parameters. -2025-06-01 00:34:37,944 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] No suitable simple type query parameter found for type mismatch test. -2025-06-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,944 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - 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-01 00:34:37,945 - testcase.TC-ERROR-4001-QUERY - DEBUG - Test case 'TC-ERROR-4001-QUERY' did not modify the URL via modify_request_url hook. -2025-06-01 00:34:37,945 - 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-01 00:34:37,945 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:37,945 - 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: 480' -d '{"isSearchCount": true, "query": {"dataRegions": ["JD", "DG"], "fields": ["field1", "field2"], "filter": {"key": "conditionKey", "logic": "AND", "realValue": [{"value1": "example"}], "subFilter": ["subCondition1", "subCondition2"], "symbol": "="}, "groupFields": ["groupField1"], "groupFilter": {"key": "groupConditionKey", "logic": "OR", "realValue": [{"value1": "exampleGroup"}], "subFilter": ["subGroupCondition1"], "symbol": ">"}, "sort": {"field1": "ASC", "field2": "DESC"}}}' --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: 480\' -d \'{"isSearchCount": true, "query": {"dataRegions": ["JD", "DG"], "fields": ["field1", "field2"], "filter": {"key": "conditionKey", "logic": "AND", "realValue": [{"value1": "example"}], "subFilter": ["subCondition1", "subCondition2"], "symbol": "="}, "groupFields": ["groupField1"], "groupFilter": {"key": "groupConditionKey", "logic": "OR", "realValue": [{"value1": "exampleGroup"}], "subFilter": ["subGroupCondition1"], "symbol": ">"}, "sort": {"field1": "ASC", "field2": "DESC"}}}\' --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 -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-01 00:34:37,976 - testcase.TC-ERROR-4001-QUERY - INFO - [TC-ERROR-4001-QUERY] Skipped type mismatch (query) validation: No target query parameter was identified. -2025-06-01 00:34:37,976 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.031141042709350586 -2025-06-01 00:34:37,976 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4001-QUERY' 执行成功。 -2025-06-01 00:34:37,976 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 通过 -2025-06-01 00:34:37,976 - 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-01 00:34:37,977 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:37,977 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:37,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:37,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:37,977 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:37,977 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:37,977 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,977 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,977 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,977 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:37,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:37,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:37,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-01 00:34:37,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:37,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:37,977 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:37,977 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json -2025-06-01 00:34:37,977 - testcase.TC-ERROR-4001-BODY - DEBUG - _find_simple_type_field_in_schema: Searching for simple type field in 'request body' schema... -2025-06-01 00:34:37,977 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=isSearchCount, Type=boolean -2025-06-01 00:34:37,977 - 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-01 00:34:37,977 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): isSearchCount, Original Type: boolean -2025-06-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,977 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 isSearchCount (键 'isSearchCount') 处设置值为 'not-a-boolean' -2025-06-01 00:34:37,978 - testcase.TC-ERROR-4001-BODY - DEBUG - [TC-ERROR-4001-BODY] Successfully set mismatched value at path using util_set_value_at_path. -2025-06-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - 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-01 00:34:37,978 - testcase.TC-ERROR-4001-BODY - DEBUG - Test case 'TC-ERROR-4001-BODY' did not modify the URL via modify_request_url hook. -2025-06-01 00:34:37,978 - 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-01 00:34:37,978 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] -2025-06-01 00:34:37,978 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: -2025-06-01 00:34:38,012 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '82'. (Field: body.isSearchCount) -2025-06-01 00:34:38,012 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.03336024284362793 -2025-06-01 00:34:38,012 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 -2025-06-01 00:34:38,012 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 -2025-06-01 00:34:38,012 - 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-01 00:34:38,012 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:38,012 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:38,012 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:38,012 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:38,012 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:38,012 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:38,012 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:38,012 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:38,012 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:38,012 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:38,012 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:38,012 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:38,012 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-01 00:34:38,012 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:38,012 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:38,012 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:38,012 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:38,012 - 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-01 00:34:38,012 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['isSearchCount', 'query'] -2025-06-01 00:34:38,012 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 -2025-06-01 00:34:38,012 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. -2025-06-01 00:34:38,012 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 -2025-06-01 00:34:38,012 - 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-01 00:34:38,012 - 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-01 00:34:38,012 - 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-01 00:34:38,012 - 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-01 00:34:38,012 - 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-01 00:34:38,012 - 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-01 00:34:38,012 - 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-01 00:34:38,012 - 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-01 00:34:38,012 - 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-01 00:34:38,012 - 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-01 00:34:38,012 - 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-01 00:34:38,012 - 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-01 00:34:38,012 - 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-01 00:34:38,012 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,013 - 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-01 00:34:38,038 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 -2025-06-01 00:34:38,038 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 -2025-06-01 00:34:38,038 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 -2025-06-01 00:34:38,038 - 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-01 00:34:38,038 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. -2025-06-01 00:34:38,038 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] -2025-06-01 00:34:38,038 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... -2025-06-01 00:34:38,038 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... -2025-06-01 00:34:38,038 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput -2025-06-01 00:34:38,038 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO -2025-06-01 00:34:38,038 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:38,038 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:38,038 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO -2025-06-01 00:34:38,038 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO -2025-06-01 00:34:38,038 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... -2025-06-01 00:34:38,038 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... -2025-06-01 00:34:38,038 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... -2025-06-01 00:34:38,038 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... -2025-06-01 00:34:38,038 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... -2025-06-01 00:34:38,038 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... -2025-06-01 00:34:38,038 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 -2025-06-01 00:34:38,038 - 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-01 00:34:38,038 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. -2025-06-01 00:34:38,038 - 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-01 00:34:38,038 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,039 - 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-01 00:34:38,063 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 -2025-06-01 00:34:38,063 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 -2025-06-01 00:34:38,063 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 -2025-06-01 00:34:38,063 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{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: 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' -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 -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' - -===== 测试运行摘要 ===== -开始时间: 2025-06-01T00:34:02.816967 -结束时间: 2025-06-01T00:34:38.063887 -总耗时: 35.25 秒 - ---- 端点统计 --- -定义的端点总数: 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') 为 '84'. - 端点: 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强制策略。 -2025-06-01 00:34:38,066 - __main__ - INFO - 测试结果已保存为JSON: test_reportllm.json -2025-06-01 00:34:38,066 - __main__ - INFO - API调用详情将以 Markdown 格式保存到目录 '.' (使用默认文件名 'api_call_details.md') -2025-06-01 00:34:38,069 - __main__ - INFO - API调用详情已保存为 Markdown: api_call_details.md -2025-06-01 00:34:38,070 - __main__ - INFO - 部分测试失败或出错,请检查报告。 - - 测试用例失败: TC-ERROR-4001-QUERY (Error Code 4001 - Query Parameter Type Mismatch Validation) - - 验证点: 当查询参数 'pageNo' (路径: 'pageNo') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '61'. - - 测试用例失败: TC-ERROR-4001-BODY (Error Code 4001 - Request Body Type Mismatch Validation) - - 验证点: 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '16'. - 端点: 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') 为 '50'. - - 测试用例失败: TC-ERROR-4001-BODY (Error Code 4001 - Request Body Type Mismatch Validation) - - 验证点: 当请求体字段 'id' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '17'. - - 测试用例失败: TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) - - 验证点: 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '47'. - 端点: DELETE /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') 为 '26'. - - 测试用例失败: TC-ERROR-4001-BODY (Error Code 4001 - Request Body Type Mismatch Validation) - - 验证点: 当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '63'. - - 测试用例失败: TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) - - 验证点: 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '73'. - 端点: 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') 为 '100'. - - 测试用例失败: TC-ERROR-4003-BODY (Error Code 4003 - Missing Required Request Body Field Validation) - - 验证点: 当移除必填请求体字段 'data.0.bsflag' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '24'. - 端点: 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') 为 '82'. +2025-06-05 13:57:37,937 - __main__ - DEBUG - 已启用详细日志模式 +2025-06-05 13:57:37,938 - __main__ - INFO - 主输出目录设置为: /Users/zpc01/workspace/zzlh/compliance +Traceback (most recent call last): + File "/Users/zpc01/workspace/zzlh/compliance/run_api_tests.py", line 520, in + main() + File "/Users/zpc01/workspace/zzlh/compliance/run_api_tests.py", line 402, in main + orchestrator = APITestOrchestrator( + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/zpc01/workspace/zzlh/compliance/ddms_compliance_suite/test_orchestrator.py", line 414, in __init__ + self.api_caller = APICaller(base_url=self.base_url) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: APICaller.__init__() got an unexpected keyword argument 'base_url' diff --git a/log_stage.txt b/log_stage.txt new file mode 100644 index 0000000..9dff9f4 --- /dev/null +++ b/log_stage.txt @@ -0,0 +1,2660 @@ +2025-06-05 15:17:29,039 - __main__ - DEBUG - 已启用详细日志模式 +2025-06-05 15:17:29,039 - __main__ - INFO - 主输出目录设置为: /Users/zpc01/workspace/zzlh/compliance/test_reports +2025-06-05 15:17:29,039 - ddms_compliance_suite.test_orchestrator - INFO - 正在从目录加载自定义测试用例: ./custom_testcases +2025-06-05 15:17:29,039 - ddms_compliance_suite.test_case_registry - INFO - 开始从目录 './custom_testcases' 及其子目录发现测试用例... +2025-06-05 15:17:29,039 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: basic_checks 从 ./custom_testcases/basic_checks.py +2025-06-05 15:17:29,039 - ddms_compliance_suite.test_case_registry - INFO - 已注册测试用例: 'TC-STATUS-001' (基本状态码 200 检查) 来自类 'StatusCode200Check' (路径: ./custom_testcases/basic_checks.py) +2025-06-05 15:17:29,039 - 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:17:29,040 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: https_mandatory_case 从 ./custom_testcases/compliance_catalog/security/https_mandatory_case.py +2025-06-05 15:17:29,040 - 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:17:29,040 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: url_llm_checks 从 ./custom_testcases/compliance_catalog/normative_spec/url_llm_checks.py +2025-06-05 15:17:29,040 - 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:17:29,040 - 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:17:29,040 - 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:17:29,040 - 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:17:29,040 - 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:17:29,040 - 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:17:29,040 - 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:17:29,040 - 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:17:29,040 - 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:17:29,041 - ddms_compliance_suite.test_case_registry - DEBUG - 成功导入模块: schema_validation_case 从 ./custom_testcases/compliance_catalog/core_functionality/schema_validation_case.py +2025-06-05 15:17:29,041 - 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:17:29,041 - ddms_compliance_suite.test_case_registry - INFO - 已根据 execution_order (主要) 和类名 (次要) 对 7 个测试用例类进行了排序。 +2025-06-05 15:17:29,041 - ddms_compliance_suite.test_case_registry - INFO - 测试用例发现完成。总共注册了 7 个独特的测试用例 (基于ID)。发现并排序了 7 个测试用例类。 +2025-06-05 15:17:29,041 - ddms_compliance_suite.test_orchestrator - INFO - 加载了 7 个自定义测试用例。 +2025-06-05 15:17:29,041 - ddms_compliance_suite.test_orchestrator - INFO - 未提供API场景目录,跳过加载场景测试。 +2025-06-05 15:17:29,041 - ddms_compliance_suite.test_orchestrator - INFO - APITestOrchestrator: 尝试从目录加载API测试阶段: ./custom_stages +2025-06-05 15:17:29,041 - ddms_compliance_suite.stage_registry - INFO - StageRegistry: 开始从目录 './custom_stages' 加载测试阶段... +2025-06-05 15:17:29,041 - ddms_compliance_suite.stage_registry - INFO - StageRegistry: 开始从目录 './custom_stages' 及其子目录发现测试阶段... +2025-06-05 15:17:29,041 - ddms_compliance_suite.stage_registry - DEBUG - StageRegistry: 成功导入模块: keyword_driven_crud_stage 从 ./custom_stages/keyword_driven_crud_stage.py +2025-06-05 15:17:29,041 - 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:17:29,041 - ddms_compliance_suite.stage_registry - INFO - StageRegistry: 加载完成。共加载 1 个测试阶段。 +2025-06-05 15:17:29,041 - ddms_compliance_suite.test_orchestrator - INFO - APITestOrchestrator: StageRegistry 初始化完毕。加载的API测试阶段数量: 1 +2025-06-05 15:17:29,041 - 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:17:29,041 - ddms_compliance_suite.test_orchestrator - INFO - LLMService initialized successfully with model: qwen-plus. +2025-06-05 15:17:29,041 - __main__ - INFO - 从YAPI文件运行测试: ./assets/doc/井筒API示例_simple.json +2025-06-05 15:17:29,041 - ddms_compliance_suite.test_orchestrator - INFO - 准备从YAPI文件运行测试用例: ./assets/doc/井筒API示例_simple.json +2025-06-05 15:17:29,041 - ddms_compliance_suite.input_parser.parser - INFO - Parsing YAPI spec from: ./assets/doc/井筒API示例_simple.json +2025-06-05 15:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 15:17:29,042 - 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:17:29,042 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 15:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 15:17:29,042 - 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:17:29,042 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 15:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 15:17:29,042 - 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:17:29,042 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 15:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version} (数据推送接口) +2025-06-05 15:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - 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:17:29,042 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,042 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,042 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,042 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,042 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,042 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,042 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,042 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,042 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,043 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,043 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,043 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 15:17:29,043 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 15:17:29,043 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,043 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,043 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,043 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,043 - 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:17:29,043 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 初始化。 +2025-06-05 15:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,043 - 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:17:29,098 - 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:17:29,098 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 +2025-06-05 15:17:29,098 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 +2025-06-05 15:17:29,098 - 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:17:29,098 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,098 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,098 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,098 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,098 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,099 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,099 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,099 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,099 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,099 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,099 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,099 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 15:17:29,099 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 15:17:29,099 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,099 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,099 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,099 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,099 - 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:17:29,123 - testcase.TC-CORE-FUNC-001 - INFO - 响应包含JSON体,但在API规范中未找到针对状态码 200 的JSON schema。跳过schema验证。 +2025-06-05 15:17:29,123 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 +2025-06-05 15:17:29,123 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 +2025-06-05 15:17:29,123 - 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:17:29,124 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,124 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,124 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,124 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,124 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,124 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,124 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,124 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 15:17:29,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 15:17:29,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,124 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,124 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,124 - 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:17:29,124 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 初始化。 +2025-06-05 15:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,124 - 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:17:29,142 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 +2025-06-05 15:17:29,142 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 +2025-06-05 15:17:29,142 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 +2025-06-05 15:17:29,142 - 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:17:29,142 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,142 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,142 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,142 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,142 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,142 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,142 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,142 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,142 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,142 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,142 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,143 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 15:17:29,143 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 15:17:29,143 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,143 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,143 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,143 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,143 - 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:17:29,143 - 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:17:29,143 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: No suitable simple type field found for query parameters. +2025-06-05 15:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - 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:17:29,143 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,143 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 15:17:29,173 - 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:17:29,173 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.029902935028076172 +2025-06-05 15:17:29,173 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4001-QUERY' 执行成功。 +2025-06-05 15:17:29,173 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 通过 +2025-06-05 15:17:29,173 - 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:17:29,173 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,173 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,173 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,173 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,173 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,173 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,173 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,173 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,173 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,173 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,173 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,174 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 15:17:29,174 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 15:17:29,174 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,174 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,174 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,174 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,174 - 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:17:29,174 - 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:17:29,174 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json +2025-06-05 15:17:29,174 - 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:17:29,174 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=isSearchCount, Type=boolean +2025-06-05 15:17:29,174 - 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:17:29,174 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): isSearchCount, Original Type: boolean +2025-06-05 15:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,174 - 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:17:29,174 - 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:17:29,174 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 isSearchCount (键 'isSearchCount') 处设置值为 'not-a-boolean' +2025-06-05 15:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - 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:17:29,174 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,174 - 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 +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' +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:17:29,194 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '49'. (Field: body.isSearchCount) +2025-06-05 15:17:29,194 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.020064115524291992 +2025-06-05 15:17:29,194 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 +2025-06-05 15:17:29,194 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 +2025-06-05 15:17:29,194 - 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:17:29,195 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,195 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,195 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,195 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,195 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,195 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,195 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,195 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,195 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,195 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,195 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,195 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 15:17:29,195 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 15:17:29,195 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,195 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,195 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,195 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,195 - 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:17:29,195 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['isSearchCount', 'query'] +2025-06-05 15:17:29,195 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 +2025-06-05 15:17:29,195 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. +2025-06-05 15:17:29,195 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 +2025-06-05 15:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,195 - 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:17:29,228 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 +2025-06-05 15:17:29,228 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 +2025-06-05 15:17:29,228 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 +2025-06-05 15:17:29,228 - 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:17:29,229 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,229 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,229 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,229 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,229 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,229 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,229 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,229 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,229 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,229 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,229 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,229 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('schema') 的 schema... +2025-06-05 15:17:29,229 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('version') 的 schema... +2025-06-05 15:17:29,229 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,229 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,229 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,229 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,229 - 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:17:29,229 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. +2025-06-05 15:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,229 - 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:17:29,230 - 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:17:29,255 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 +2025-06-05 15:17:29,255 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 +2025-06-05 15:17:29,255 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 +2025-06-05 15:17:29,255 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}' 测试完成,最终状态: 失败 +2025-06-05 15:17:29,255 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version} (地质单元列表查询) +2025-06-05 15:17:29,255 - 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:17:29,255 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,256 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,256 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,256 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,256 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,256 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,256 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,256 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,256 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,256 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,256 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,256 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,256 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 15:17:29,256 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 15:17:29,256 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 15:17:29,256 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 15:17:29,256 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,256 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,256 - 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:17:29,256 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 初始化。 +2025-06-05 15:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,256 - 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:17:29,274 - 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:17:29,274 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 +2025-06-05 15:17:29,274 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 +2025-06-05 15:17:29,274 - 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:17:29,274 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,274 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,274 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,274 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,274 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,274 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,274 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,274 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,274 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,274 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,274 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,274 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,274 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 15:17:29,274 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 15:17:29,274 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 15:17:29,274 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 15:17:29,274 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,274 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,274 - 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:17:29,275 - 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:17:29,275 - 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:17:29,275 - 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:17:29,275 - 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:17:29,275 - 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:17:29,275 - 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:17:29,275 - 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:17:29,275 - 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 +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' +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:17:29,293 - testcase.TC-CORE-FUNC-001 - INFO - 响应包含JSON体,但在API规范中未找到针对状态码 200 的JSON schema。跳过schema验证。 +2025-06-05 15:17:29,293 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 +2025-06-05 15:17:29,293 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 +2025-06-05 15:17:29,293 - 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:17:29,293 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,293 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,293 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,293 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,293 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,293 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,293 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,293 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,293 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,293 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,293 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,293 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,293 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 15:17:29,293 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 15:17:29,293 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 15:17:29,293 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 15:17:29,293 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,293 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,293 - 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:17:29,293 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 初始化。 +2025-06-05 15:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,293 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,294 - 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:17:29,311 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 +2025-06-05 15:17:29,312 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 +2025-06-05 15:17:29,312 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 +2025-06-05 15:17:29,312 - 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:17:29,312 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,312 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,312 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,312 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,312 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,312 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,312 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,312 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,312 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,312 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,312 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,312 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,312 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 15:17:29,312 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 15:17:29,312 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 15:17:29,312 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 15:17:29,312 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,312 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - testcase.TC-ERROR-4001-QUERY - DEBUG - _find_first_simple_type_parameter: Checking query parameter 'pageNo'. +2025-06-05 15:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 pageNo (键 'pageNo') 处设置值为 '12345' +2025-06-05 15:17:29,312 - 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:17:29,312 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - 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:17:29,312 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,312 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 15:17:29,332 - testcase.TC-ERROR-4001-QUERY - WARNING - TC-ERROR-4001-QUERY: Failed. 当查询参数 'pageNo' (路径: 'pageNo') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '77'. (Query param: pageNo) +2025-06-05 15:17:29,332 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.019673824310302734 +2025-06-05 15:17:29,332 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-QUERY' 执行失败。 +2025-06-05 15:17:29,332 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 失败 +2025-06-05 15:17:29,332 - 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:17:29,332 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,332 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,332 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,332 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,332 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,332 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,332 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,332 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,332 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,332 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,332 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,332 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,332 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 15:17:29,332 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 15:17:29,332 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 15:17:29,332 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 15:17:29,332 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,332 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,332 - 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:17:29,332 - 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:17:29,332 - 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:17:29,332 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json +2025-06-05 15:17:29,332 - 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:17:29,332 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=isSearchCount, Type=boolean +2025-06-05 15:17:29,332 - 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:17:29,332 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): isSearchCount, Original Type: boolean +2025-06-05 15:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,333 - 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:17:29,333 - 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:17:29,333 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 isSearchCount (键 'isSearchCount') 处设置值为 'not-a-boolean' +2025-06-05 15:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - 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:17:29,333 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,333 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 15:17:29,349 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '43'. (Field: body.isSearchCount) +2025-06-05 15:17:29,349 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.01635885238647461 +2025-06-05 15:17:29,350 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 +2025-06-05 15:17:29,350 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 +2025-06-05 15:17:29,350 - 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:17:29,350 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,350 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,350 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,350 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,350 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,350 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,350 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,350 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,350 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,350 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,350 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,350 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,350 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 15:17:29,350 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 15:17:29,350 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 15:17:29,350 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 15:17:29,350 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,350 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,350 - 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:17:29,350 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['isSearchCount', 'query'] +2025-06-05 15:17:29,350 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 +2025-06-05 15:17:29,350 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. +2025-06-05 15:17:29,350 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 +2025-06-05 15:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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:17:29,350 - 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' +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=12345&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=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:17:29,372 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 +2025-06-05 15:17:29,372 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 +2025-06-05 15:17:29,372 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 +2025-06-05 15:17:29,372 - 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:17:29,372 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,372 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,372 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,372 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,372 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,372 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,372 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,372 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,372 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,372 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,372 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,372 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,372 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('pageNo') 的 schema... +2025-06-05 15:17:29,372 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('pageSize') 的 schema... +2025-06-05 15:17:29,372 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('tenant-id') 的 schema... +2025-06-05 15:17:29,372 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[5] ('Authorization') 的 schema... +2025-06-05 15:17:29,372 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,372 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,372 - 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:17:29,372 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. +2025-06-05 15:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,372 - 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:17:29,387 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}' 测试完成,最终状态: 失败 +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据修改) +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 15:17:29,387 - 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:17:29,387 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 15:17:29,387 - 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:17:29,387 - 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:17:29,387 - 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:17:29,387 - 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:17:29,387 - 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:17:29,387 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,387 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,387 - 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:17:29,387 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 15:17:29,387 - 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:17:29,387 - 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:17:29,388 - 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:17:29,388 - 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:17:29,388 - 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:17:29,388 - 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:17:29,388 - 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:17:29,388 - 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:17:29,388 - 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:17:29,388 - 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:17:29,388 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,388 - 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:17:29,403 - 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:17:29,403 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 +2025-06-05 15:17:29,403 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 +2025-06-05 15:17:29,403 - 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:17:29,403 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,403 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,403 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,403 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,403 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,403 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,403 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,403 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,403 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,403 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,403 - 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:17:29,403 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 15:17:29,403 - 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:17:29,403 - 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:17:29,403 - 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:17:29,403 - 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:17:29,403 - 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:17:29,403 - 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:17:29,403 - 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:17:29,403 - 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:17:29,403 - 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:17:29,403 - 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:17:29,403 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,403 - 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:17:29,419 - testcase.TC-CORE-FUNC-001 - INFO - 将根据路径 'responses.200.content.application/json.schema' 的schema验证响应体。 +2025-06-05 15:17:29,421 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 +2025-06-05 15:17:29,421 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 +2025-06-05 15:17:29,421 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 15:17:29,421 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,421 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,421 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,421 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,421 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,421 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,421 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,421 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,421 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,421 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,421 - 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:17:29,421 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 15:17:29,421 - 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:17:29,421 - 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:17:29,421 - 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:17:29,421 - 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:17:29,421 - 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:17:29,421 - 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:17:29,421 - 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:17:29,421 - 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:17:29,421 - 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:17:29,421 - 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:17:29,421 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,421 - 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:17:29,421 - 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:17:29,435 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 +2025-06-05 15:17:29,436 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 +2025-06-05 15:17:29,436 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 +2025-06-05 15:17:29,436 - 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:17:29,436 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,436 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,436 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,436 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,436 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,436 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,436 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,436 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,436 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,436 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - testcase.TC-ERROR-4001-QUERY - DEBUG - _find_first_simple_type_parameter: Checking query parameter 'id'. +2025-06-05 15:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 id (键 'id') 处设置值为 '12345' +2025-06-05 15:17:29,436 - 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:17:29,436 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,436 - 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:17:29,436 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - 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:17:29,436 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,436 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 15:17:29,450 - testcase.TC-ERROR-4001-QUERY - WARNING - TC-ERROR-4001-QUERY: Failed. 当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '6'. (Query param: id) +2025-06-05 15:17:29,450 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.013731241226196289 +2025-06-05 15:17:29,450 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-QUERY' 执行失败。 +2025-06-05 15:17:29,450 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 失败 +2025-06-05 15:17:29,450 - 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:17:29,450 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,450 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,450 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,450 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,450 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,450 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,450 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,450 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,450 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,450 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,450 - 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:17:29,450 - 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:17:29,450 - 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:17:29,450 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json +2025-06-05 15:17:29,450 - 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:17:29,450 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=id, Type=string +2025-06-05 15:17:29,450 - 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:17:29,450 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): id, Original Type: string +2025-06-05 15:17:29,450 - 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:17:29,450 - 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:17:29,450 - 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:17:29,450 - 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:17:29,450 - 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:17:29,450 - 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:17:29,450 - 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:17:29,450 - 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:17:29,450 - 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:17:29,450 - 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:17:29,450 - 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:17:29,450 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,450 - 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:17:29,450 - 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:17:29,450 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 id (键 'id') 处设置值为 '12345' +2025-06-05 15:17:29,450 - 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:17:29,450 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,450 - 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:17:29,450 - 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:17:29,450 - 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:17:29,450 - 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:17:29,450 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,450 - 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' +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 -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' +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=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: 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' +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=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: 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' +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=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: 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:17:29,464 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'id' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '2'. (Field: body.id) +2025-06-05 15:17:29,464 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.013657093048095703 +2025-06-05 15:17:29,464 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 +2025-06-05 15:17:29,464 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 +2025-06-05 15:17:29,464 - 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:17:29,464 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,464 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,464 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,464 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,464 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,464 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,464 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,464 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,464 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,464 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,464 - 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:17:29,464 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: ['id', 'version'], 属性: ['id', 'version'] +2025-06-05 15:17:29,464 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 策略1: 在路径 root 找到可直接移除的必填字段: 'id' +2025-06-05 15:17:29,464 - testcase.TC-ERROR-4003-BODY - INFO - Found a removable field path in 'request body' schema: 'id' +2025-06-05 15:17:29,464 - 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:17:29,464 - 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:17:29,464 - 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:17:29,464 - 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:17:29,464 - 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:17:29,464 - 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:17:29,464 - 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:17:29,464 - 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:17:29,464 - 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:17:29,464 - 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:17:29,464 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 从路径 'id' 成功移除字段 'id' (原值: 'example_string')。 +2025-06-05 15:17:29,464 - testcase.TC-ERROR-4003-BODY - INFO - 为进行必填字段缺失测试,已通过工具方法从请求体中移除字段路径 'id'。 +2025-06-05 15:17:29,464 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,464 - 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:17:29,481 - 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:17:29,481 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 +2025-06-05 15:17:29,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 +2025-06-05 15:17:29,481 - 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:17:29,481 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,481 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,481 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,481 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,481 - 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:17:29,481 - testcase.TC-ERROR-4003-QUERY - INFO - Found required 'query' parameter: 'id'. +2025-06-05 15:17:29,481 - 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:17:29,481 - 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:17:29,481 - 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:17:29,481 - 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:17:29,481 - 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:17:29,481 - 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:17:29,481 - 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:17:29,481 - 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:17:29,481 - 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:17:29,481 - 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:17:29,481 - 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:17:29,481 - testcase.TC-ERROR-4003-QUERY - INFO - 为进行必填查询参数缺失测试,已从查询参数中移除 'id' (原值: 'dsid')。 +2025-06-05 15:17:29,481 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,481 - 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:17:29,495 - testcase.TC-ERROR-4003-QUERY - WARNING - TC-ERROR-4003-QUERY: Failed. 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '26'. (Removed query param: id) +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4003-QUERY' 执行失败。 +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 失败 +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit' 测试完成,最终状态: 失败 +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据删除) +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 15:17:29,495 - 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:17:29,495 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 15:17:29,495 - 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:17:29,495 - 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:17:29,495 - 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:17:29,495 - 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:17:29,495 - 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:17:29,495 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,495 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,495 - 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:17:29,495 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 15:17:29,495 - 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:17:29,495 - 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:17:29,495 - 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:17:29,495 - 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:17:29,495 - 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:17:29,495 - 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:17:29,495 - 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:17:29,495 - 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:17:29,495 - 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:17:29,495 - 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:17:29,495 - 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:17:29,495 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,495 - 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:17:29,514 - 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:17:29,514 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 +2025-06-05 15:17:29,514 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 +2025-06-05 15:17:29,514 - 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:17:29,514 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,514 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,514 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,514 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,514 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,514 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,514 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,514 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,514 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,514 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,514 - 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:17:29,514 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 15:17:29,514 - 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:17:29,514 - 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:17:29,514 - 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:17:29,514 - 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:17:29,514 - 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:17:29,514 - 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:17:29,514 - 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:17:29,514 - 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:17:29,514 - 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:17:29,514 - 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:17:29,514 - 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:17:29,514 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,514 - 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:17:29,528 - testcase.TC-CORE-FUNC-001 - INFO - 将根据路径 'responses.200.content.application/json.schema' 的schema验证响应体。 +2025-06-05 15:17:29,528 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 +2025-06-05 15:17:29,528 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 +2025-06-05 15:17:29,528 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 15:17:29,528 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,528 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,528 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,528 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,528 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,528 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,528 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,528 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,528 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,528 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,528 - 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:17:29,528 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 15:17:29,529 - 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:17:29,529 - 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:17:29,529 - 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:17:29,529 - 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:17:29,529 - 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:17:29,529 - 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:17:29,529 - 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:17:29,529 - 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:17:29,529 - 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:17:29,529 - 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:17:29,529 - 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:17:29,529 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,529 - 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:17:29,529 - 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:17:29,543 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 +2025-06-05 15:17:29,543 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 +2025-06-05 15:17:29,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 +2025-06-05 15:17:29,543 - 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:17:29,543 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,543 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,543 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,543 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - testcase.TC-ERROR-4001-QUERY - DEBUG - _find_first_simple_type_parameter: Checking query parameter 'id'. +2025-06-05 15:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 id (键 'id') 处设置值为 '12345' +2025-06-05 15:17:29,543 - 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:17:29,543 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,543 - 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:17:29,543 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - 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:17:29,543 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,543 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 15:17:29,558 - testcase.TC-ERROR-4001-QUERY - WARNING - TC-ERROR-4001-QUERY: Failed. 当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '11'. (Query param: id) +2025-06-05 15:17:29,558 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.014497041702270508 +2025-06-05 15:17:29,558 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-QUERY' 执行失败。 +2025-06-05 15:17:29,558 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 失败 +2025-06-05 15:17:29,558 - 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:17:29,558 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,558 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,558 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,558 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,558 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,558 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,558 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,558 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,558 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,558 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,558 - 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:17:29,558 - 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:17:29,558 - 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:17:29,558 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json +2025-06-05 15:17:29,558 - 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:17:29,558 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=version, Type=string +2025-06-05 15:17:29,558 - 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:17:29,558 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): version, Original Type: string +2025-06-05 15:17:29,558 - 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:17:29,558 - 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:17:29,558 - 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:17:29,558 - 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:17:29,558 - 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:17:29,558 - 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:17:29,558 - 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:17:29,558 - 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:17:29,558 - 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:17:29,558 - 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:17:29,558 - 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:17:29,558 - 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:17:29,558 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,558 - 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:17:29,558 - 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:17:29,558 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 version (键 'version') 处设置值为 '12345' +2025-06-05 15:17:29,558 - 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:17:29,558 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,558 - 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:17:29,558 - 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:17:29,558 - 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:17:29,558 - 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:17:29,558 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,558 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 15:17:29,574 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '80'. (Field: body.version) +2025-06-05 15:17:29,574 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.015690326690673828 +2025-06-05 15:17:29,574 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 +2025-06-05 15:17:29,574 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 +2025-06-05 15:17:29,574 - 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:17:29,574 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,574 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,574 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,574 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,574 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,574 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,574 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,574 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,574 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,574 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,574 - 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:17:29,574 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['version', 'data'] +2025-06-05 15:17:29,574 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 +2025-06-05 15:17:29,574 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. +2025-06-05 15:17:29,574 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 +2025-06-05 15:17:29,574 - 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:17:29,574 - 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:17:29,574 - 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:17:29,574 - 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:17:29,574 - 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:17:29,574 - 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:17:29,574 - 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:17:29,574 - 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:17:29,574 - 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:17:29,574 - 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:17:29,574 - 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:17:29,574 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,574 - 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:17:29,589 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 +2025-06-05 15:17:29,589 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 +2025-06-05 15:17:29,589 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 +2025-06-05 15:17:29,589 - 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:17:29,589 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,589 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,589 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,589 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,590 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,590 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('id') 的 schema... +2025-06-05 15:17:29,590 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('tenant-id') 的 schema... +2025-06-05 15:17:29,590 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('Authorization') 的 schema... +2025-06-05 15:17:29,590 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,590 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,590 - 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:17:29,590 - testcase.TC-ERROR-4003-QUERY - INFO - Found required 'query' parameter: 'id'. +2025-06-05 15:17:29,590 - 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:17:29,590 - 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:17:29,590 - 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:17:29,590 - 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:17:29,590 - 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:17:29,590 - 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:17:29,590 - 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:17:29,590 - 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:17:29,590 - 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:17:29,590 - 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:17:29,590 - 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:17:29,590 - 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:17:29,590 - testcase.TC-ERROR-4003-QUERY - INFO - 为进行必填查询参数缺失测试,已从查询参数中移除 'id' (原值: 'dsid')。 +2025-06-05 15:17:29,590 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,590 - 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\'' +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 +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' +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\'' +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\'' +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\'' +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=12345' +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=12345\'' +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: 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 (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:17:29,609 - testcase.TC-ERROR-4003-QUERY - WARNING - TC-ERROR-4003-QUERY: Failed. 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '63'. (Removed query param: id) +2025-06-05 15:17:29,609 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4003-QUERY' 执行失败。 +2025-06-05 15:17:29,609 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 失败 +2025-06-05 15:17:29,610 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit' 测试完成,最终状态: 失败 +2025-06-05 15:17:29,610 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: POST /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据添加) +2025-06-05 15:17:29,610 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-STATUS-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 15:17:29,610 - 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:17:29,610 - ddms_compliance_suite.test_case_registry - DEBUG - 测试用例 'TC-SECURITY-001' 适用于端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit'。 +2025-06-05 15:17:29,610 - 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:17:29,610 - 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:17:29,610 - 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:17:29,610 - 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:17:29,610 - 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:17:29,610 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-STATUS-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 15:17:29,610 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,610 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,610 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,610 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,610 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,610 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 15:17:29,610 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 15:17:29,610 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,610 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,610 - 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:17:29,610 - testcase.TC-STATUS-001 - INFO - 测试用例 TC-STATUS-001 (基本状态码 200 检查) 已针对端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 15:17:29,610 - 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:17:29,611 - 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:17:29,611 - 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:17:29,611 - 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:17:29,611 - 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:17:29,611 - 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:17:29,611 - 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:17:29,611 - 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:17:29,611 - 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:17:29,611 - 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:17:29,611 - 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:17:29,611 - 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:17:29,611 - 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:17:29,611 - 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:17:29,611 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,611 - 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:17:29,625 - 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:17:29,625 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 +2025-06-05 15:17:29,625 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 +2025-06-05 15:17:29,625 - 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:17:29,625 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,625 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,625 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,625 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,625 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,625 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 15:17:29,625 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 15:17:29,626 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,626 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,626 - 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:17:29,626 - testcase.TC-CORE-FUNC-001 - INFO - 测试用例 'TC-CORE-FUNC-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 15:17:29,626 - 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:17:29,626 - 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:17:29,626 - 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:17:29,626 - 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:17:29,626 - 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:17:29,626 - 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:17:29,626 - 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:17:29,626 - 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:17:29,626 - 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:17:29,626 - 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:17:29,626 - 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:17:29,626 - 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:17:29,626 - 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:17:29,626 - 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:17:29,626 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,626 - 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:17:29,642 - testcase.TC-CORE-FUNC-001 - INFO - 响应包含JSON体,但在API规范中未找到针对状态码 200 的JSON schema。跳过schema验证。 +2025-06-05 15:17:29,642 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 +2025-06-05 15:17:29,642 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 +2025-06-05 15:17:29,642 - ddms_compliance_suite.test_orchestrator - DEBUG - 准备执行测试用例 'TC-SECURITY-001' for 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' +2025-06-05 15:17:29,642 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,642 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,642 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,642 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,642 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,642 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 15:17:29,642 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 15:17:29,643 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,643 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,643 - 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:17:29,643 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 初始化。 +2025-06-05 15:17:29,643 - 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:17:29,643 - 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:17:29,643 - 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:17:29,643 - 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:17:29,643 - 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:17:29,643 - 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:17:29,643 - 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:17:29,643 - 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:17:29,643 - 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:17:29,643 - 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:17:29,643 - 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:17:29,643 - 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:17:29,643 - 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:17:29,643 - 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:17:29,643 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,643 - 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:17:29,643 - 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:17:29,657 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 +2025-06-05 15:17:29,657 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 +2025-06-05 15:17:29,657 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 +2025-06-05 15:17:29,657 - 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:17:29,657 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,658 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,658 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,658 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,658 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,658 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 15:17:29,658 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 15:17:29,658 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,658 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,658 - 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:17:29,658 - 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:17:29,658 - 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:17:29,658 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: No suitable simple type field found for query parameters. +2025-06-05 15:17:29,658 - 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:17:29,658 - 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:17:29,658 - 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:17:29,658 - 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:17:29,658 - 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:17:29,658 - 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:17:29,658 - 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:17:29,658 - 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:17:29,658 - 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:17:29,658 - 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:17:29,659 - 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:17:29,659 - 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:17:29,659 - 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:17:29,659 - 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:17:29,659 - 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:17:29,659 - 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:17:29,659 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,659 - 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:17:29,659 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,659 - 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:17:29,659 - 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:17:29,659 - 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:17:29,659 - 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:17:29,659 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,659 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 15:17:29,676 - 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:17:29,676 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.01654195785522461 +2025-06-05 15:17:29,676 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4001-QUERY' 执行成功。 +2025-06-05 15:17:29,676 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 通过 +2025-06-05 15:17:29,676 - 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:17:29,676 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,676 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,676 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,676 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,676 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,676 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 15:17:29,676 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 15:17:29,677 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,677 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,677 - 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:17:29,677 - 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:17:29,677 - 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:17:29,677 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json +2025-06-05 15:17:29,677 - 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:17:29,677 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=version, Type=string +2025-06-05 15:17:29,677 - 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:17:29,677 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): version, Original Type: string +2025-06-05 15:17:29,677 - 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:17:29,677 - 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:17:29,677 - 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:17:29,677 - 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:17:29,677 - 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:17:29,677 - 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:17:29,677 - 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:17:29,677 - 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:17:29,677 - 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:17:29,677 - 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:17:29,677 - 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:17:29,677 - 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:17:29,678 - 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:17:29,678 - 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:17:29,678 - 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:17:29,678 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,678 - 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:17:29,678 - 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:17:29,678 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 version (键 'version') 处设置值为 '12345' +2025-06-05 15:17:29,678 - 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:17:29,678 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,678 - 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:17:29,678 - 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:17:29,678 - 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:17:29,678 - 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:17:29,678 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,678 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 15:17:29,692 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '10'. (Field: body.version) +2025-06-05 15:17:29,693 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.014215946197509766 +2025-06-05 15:17:29,693 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 +2025-06-05 15:17:29,693 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 +2025-06-05 15:17:29,693 - 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:17:29,693 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,693 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,693 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,693 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,693 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,693 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 15:17:29,693 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 15:17:29,693 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,693 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,693 - 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:17:29,693 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['version', 'data'] +2025-06-05 15:17:29,694 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 策略2: 在数组属性 'data' (路径 root) 的元素内找到必填字段: 'bsflag'. 路径: ['data', 0, 'bsflag'] +2025-06-05 15:17:29,694 - testcase.TC-ERROR-4003-BODY - INFO - Found a removable field path in 'request body' schema: 'data.0.bsflag' +2025-06-05 15:17:29,694 - 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:17:29,694 - 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:17:29,694 - 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:17:29,694 - 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:17:29,694 - 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:17:29,694 - 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:17:29,694 - 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:17:29,694 - 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:17:29,694 - 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:17:29,694 - 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:17:29,694 - 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:17:29,694 - 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:17:29,694 - 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:17:29,694 - 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:17:29,694 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 从路径 'data.0.bsflag' 成功移除字段 'bsflag' (原值: '0.0')。 +2025-06-05 15:17:29,694 - testcase.TC-ERROR-4003-BODY - INFO - 为进行必填字段缺失测试,已通过工具方法从请求体中移除字段路径 'data.0.bsflag'。 +2025-06-05 15:17:29,694 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,694 - 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:17:29,713 - testcase.TC-ERROR-4003-BODY - WARNING - TC-ERROR-4003-BODY: Failed. 当移除必填请求体字段 'data.0.bsflag' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '16'. (Removed field: body.data.0.bsflag) +2025-06-05 15:17:29,713 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4003-BODY' 执行失败。 +2025-06-05 15:17:29,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 失败 +2025-06-05 15:17:29,713 - 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:17:29,713 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,713 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('tenant-id') 的 schema... +2025-06-05 15:17:29,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('Authorization') 的 schema... +2025-06-05 15:17:29,713 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '201' content 'application/json' 的 schema... +2025-06-05 15:17:29,713 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,714 - 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:17:29,714 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. +2025-06-05 15:17:29,714 - 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:17:29,714 - 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:17:29,714 - 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:17:29,714 - 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:17:29,714 - 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:17:29,714 - 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:17:29,714 - 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:17:29,714 - 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:17:29,714 - 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:17:29,714 - 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:17:29,714 - 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:17:29,714 - 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:17:29,714 - 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:17:29,714 - 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:17:29,714 - 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:17:29,714 - ddms_compliance_suite.test_orchestrator - DEBUG - Path parameters to be substituted: {'dms_instance_code': 'example_dms_instance_code'} +2025-06-05 15:17:29,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 +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 +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 -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 -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 -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 -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 (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:17:29,730 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 +2025-06-05 15:17:29,730 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 +2025-06-05 15:17:29,730 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 +2025-06-05 15:17:29,730 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'POST /api/dms/{dms_instance_code}/v1/cd_geo_unit' 测试完成,最终状态: 失败 +2025-06-05 15:17:29,730 - ddms_compliance_suite.test_orchestrator - INFO - 开始为端点测试: GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id} (地质单元查询详情) +2025-06-05 15:17:29,730 - 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:17:29,730 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,731 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,731 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,731 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,731 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,731 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,731 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,731 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,731 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,731 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,731 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,731 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,731 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 15:17:29,731 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,731 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,731 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,731 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,731 - 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:17:29,746 - 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:17:29,746 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-STATUS-001' 执行成功。 +2025-06-05 15:17:29,746 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-STATUS-001' 执行完毕,状态: 通过 +2025-06-05 15:17:29,746 - 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:17:29,746 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,746 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,746 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,746 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,746 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,746 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,746 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,746 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,746 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,746 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,746 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,746 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,746 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 15:17:29,746 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,746 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,746 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,746 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,746 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,747 - 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:17:29,762 - testcase.TC-CORE-FUNC-001 - INFO - 将根据路径 'responses.200.content.application/json.schema' 的schema验证响应体。 +2025-06-05 15:17:29,762 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-CORE-FUNC-001' 执行成功。 +2025-06-05 15:17:29,762 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-CORE-FUNC-001' 执行完毕,状态: 通过 +2025-06-05 15:17:29,762 - 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:17:29,762 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,762 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,762 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,762 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,762 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,762 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,762 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,762 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,762 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,762 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,762 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,762 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,762 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 15:17:29,762 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,762 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,762 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,762 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,762 - 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:17:29,762 - testcase.TC-SECURITY-001 - INFO - 测试用例 'TC-SECURITY-001' 已为端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 初始化。 +2025-06-05 15:17:29,762 - 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:17:29,762 - 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:17:29,762 - 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:17:29,762 - 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:17:29,762 - 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:17:29,762 - 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:17:29,762 - 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:17:29,762 - 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:17:29,762 - 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:17:29,762 - 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:17:29,762 - 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:17:29,762 - 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:17:29,762 - 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:17:29,762 - 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:17:29,762 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,763 - 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:17:29,777 - testcase.TC-SECURITY-001 - ERROR - 安全漏洞:API允许通过HTTP成功响应 (200)。 +2025-06-05 15:17:29,777 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-SECURITY-001' 执行失败。 +2025-06-05 15:17:29,777 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-SECURITY-001' 执行完毕,状态: 失败 +2025-06-05 15:17:29,777 - 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:17:29,777 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,777 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,777 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,777 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,777 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,777 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,777 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,777 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,777 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,777 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,777 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,777 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,777 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 15:17:29,777 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,777 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,777 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,777 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - testcase.TC-ERROR-4001-QUERY - INFO - _find_first_simple_type_parameter: No suitable simple type field found for query parameters. +2025-06-05 15:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - 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:17:29,777 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,778 - 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:17:29,778 - 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:17:29,778 - 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:17:29,778 - 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:17:29,778 - 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:17:29,778 - 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:17:29,778 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,778 - 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 +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 -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:17:29,793 - 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:17:29,793 - testcase.TC-ERROR-4001-QUERY - DEBUG - Hook: check_performance, elapsed: 0.01556706428527832 +2025-06-05 15:17:29,793 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4001-QUERY' 执行成功。 +2025-06-05 15:17:29,793 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-QUERY' 执行完毕,状态: 通过 +2025-06-05 15:17:29,793 - 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:17:29,793 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,793 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,793 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,793 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,793 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,793 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,793 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,794 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,794 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,794 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,794 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,794 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,794 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 15:17:29,794 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,794 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,794 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,794 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - testcase.TC-ERROR-4001-BODY - DEBUG - Found request body schema under content type: application/json +2025-06-05 15:17:29,794 - 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:17:29,794 - testcase.TC-ERROR-4001-BODY - INFO - Found simple type field: Path=isSearchCount, Type=boolean +2025-06-05 15:17:29,794 - 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:17:29,794 - testcase.TC-ERROR-4001-BODY - INFO - [TC-ERROR-4001-BODY] Target field for type mismatch (body): isSearchCount, Original Type: boolean +2025-06-05 15:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: generate_headers, current keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,794 - 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:17:29,794 - 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:17:29,794 - ddms_compliance_suite.utils.schema_utils - INFO - [Util] 在路径 isSearchCount (键 'isSearchCount') 处设置值为 'not-a-boolean' +2025-06-05 15:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - 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:17:29,794 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_headers, header keys: ['tenant-id', 'Content-Type', 'Accept'] +2025-06-05 15:17:29,794 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: validate_request_body, body type: +2025-06-05 15:17:29,813 - testcase.TC-ERROR-4001-BODY - WARNING - TC-ERROR-4001-BODY: Failed. 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '11'. (Field: body.isSearchCount) +2025-06-05 15:17:29,813 - testcase.TC-ERROR-4001-BODY - DEBUG - Hook: check_performance, elapsed: 0.018306970596313477 +2025-06-05 15:17:29,813 - ddms_compliance_suite.test_orchestrator - DEBUG -  ❌ 测试用例 'TC-ERROR-4001-BODY' 执行失败。 +2025-06-05 15:17:29,813 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4001-BODY' 执行完毕,状态: 失败 +2025-06-05 15:17:29,813 - 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:17:29,813 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,813 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,813 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,813 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,813 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,813 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,813 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,813 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,813 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,813 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,813 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,813 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,813 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 15:17:29,813 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,813 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,813 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,813 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,813 - 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:17:29,813 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 递归查找路径: [], 当前层级必填字段: [], 属性: ['isSearchCount', 'query'] +2025-06-05 15:17:29,813 - ddms_compliance_suite.utils.schema_utils - DEBUG - [Util] 在路径 root 未通过任何策略找到可移除的必填字段。 +2025-06-05 15:17:29,813 - testcase.TC-ERROR-4003-BODY - INFO - No removable (required) field path found in 'request body' schema. +2025-06-05 15:17:29,813 - testcase.TC-ERROR-4003-BODY - INFO - 在请求体 schema 中未找到可用于测试 "必填字段缺失" 的字段(通过基类方法)。 +2025-06-05 15:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,813 - 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:17:29,827 - testcase.TC-ERROR-4003-BODY - INFO - 由于未识别到可移除的必填请求体字段,跳过此测试用例的验证。 +2025-06-05 15:17:29,827 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-BODY' 执行成功。 +2025-06-05 15:17:29,827 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-BODY' 执行完毕,状态: 通过 +2025-06-05 15:17:29,827 - 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:17:29,828 - ddms_compliance_suite.test_orchestrator - DEBUG - Successfully converted/retrieved global_api_spec (type: ) to dict using .spec attribute. +2025-06-05 15:17:29,828 - ddms_compliance_suite.test_orchestrator - DEBUG - global_spec_dict keys for $ref resolution: ['yapi_categories'] +2025-06-05 15:17:29,828 - ddms_compliance_suite.test_orchestrator - DEBUG - 开始为 endpoint_spec_dict (来自 ) 中的 schemas 进行 $ref 解析... +2025-06-05 15:17:29,828 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 requestBody content 'application/json' 的 schema... +2025-06-05 15:17:29,828 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/RdbQueryPageInput +2025-06-05 15:17:29,828 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/QueryVO +2025-06-05 15:17:29,828 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,828 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,828 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,828 - ddms_compliance_suite.utils.schema_utils - DEBUG - 因 discard_refs=True,丢弃 '$ref': #/components/schemas/FilterVO +2025-06-05 15:17:29,828 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[0] ('dms_instance_code') 的 schema... +2025-06-05 15:17:29,828 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[1] ('version') 的 schema... +2025-06-05 15:17:29,828 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[2] ('id') 的 schema... +2025-06-05 15:17:29,828 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[3] ('tenant-id') 的 schema... +2025-06-05 15:17:29,828 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 parameters[4] ('Authorization') 的 schema... +2025-06-05 15:17:29,828 - ddms_compliance_suite.test_orchestrator - DEBUG - 正在解析 responses '200' content 'application/json' 的 schema... +2025-06-05 15:17:29,828 - ddms_compliance_suite.test_orchestrator - INFO - Endpoint spec (来自 ) 中的 schemas $ref 解析完成。 +2025-06-05 15:17:29,828 - 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:17:29,828 - testcase.TC-ERROR-4003-QUERY - INFO - No required 'query' parameter found in endpoint_spec. +2025-06-05 15:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,828 - 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:17:29,842 - testcase.TC-ERROR-4003-QUERY - INFO - 由于未识别到可移除的必填查询参数,跳过此测试用例。 +2025-06-05 15:17:29,842 - ddms_compliance_suite.test_orchestrator - DEBUG -  ✅ 测试用例 'TC-ERROR-4003-QUERY' 执行成功。 +2025-06-05 15:17:29,842 - ddms_compliance_suite.test_orchestrator - DEBUG - 测试用例 'TC-ERROR-4003-QUERY' 执行完毕,状态: 通过 +2025-06-05 15:17:29,842 - ddms_compliance_suite.test_orchestrator - INFO - 端点 'GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}' 测试完成,最终状态: 失败 +2025-06-05 15:17:29,842 - __main__ - INFO - 开始执行API测试阶段 (Stages),目录: ./custom_stages +2025-06-05 15:17:29,842 - ddms_compliance_suite.test_orchestrator - INFO - Starting API Test Stage execution... +2025-06-05 15:17:29,842 - ddms_compliance_suite.test_orchestrator - INFO - Evaluating test stages against 2 API group(s): ['公共分类', '地质单元'] +2025-06-05 15:17:29,842 - 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:17:29,842 - 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:17:29,842 - 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:17:29,842 - ddms_compliance_suite.test_orchestrator - WARNING - API group '公共分类' provided, but cannot determine group details or filter APIs for spec type . +2025-06-05 15:17:29,842 - 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:17:29,842 - 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:17:29,842 - 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:17:29,842 - 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:17:29,842 - 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:17:29,842 - 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:17:29,842 - 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:17:29,842 - ddms_compliance_suite.test_orchestrator - DEBUG - Checking applicability of stage 'keyword_driven_crud_example' for API group '公共分类'... +2025-06-05 15:17:29,842 - 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:17:29,842 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['添加', '新建', '创建']', method='POST' +2025-06-05 15:17:29,842 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元数据添加', MatchedText='地质单元数据添加' (for resource='地质单元', action='['添加', '新建', '创建']', method='POST') +2025-06-05 15:17:29,842 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['列表查询', '查询列表', '获取列表', '分页查询']', method='POST' +2025-06-05 15:17:29,842 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元列表查询', MatchedText='地质单元列表查询' (for resource='地质单元', action='['列表查询', '查询列表', '获取列表', '分页查询']', method='POST') +2025-06-05 15:17:29,842 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['查询详情', '获取详情', '根据ID获取']', method='GET' +2025-06-05 15:17:29,842 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元查询详情', MatchedText='地质单元查询详情' (for resource='地质单元', action='['查询详情', '获取详情', '根据ID获取']', method='GET') +2025-06-05 15:17:29,842 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['修改', '更新']', method='PUT' +2025-06-05 15:17:29,842 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元数据修改', MatchedText='地质单元数据修改' (for resource='地质单元', action='['修改', '更新']', method='PUT') +2025-06-05 15:17:29,842 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['删除']', method='DELETE' +2025-06-05 15:17:29,842 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元数据删除', MatchedText='地质单元数据删除' (for resource='地质单元', action='['删除']', method='DELETE') +2025-06-05 15:17:29,842 - 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:17:29,842 - ddms_compliance_suite.test_orchestrator - INFO - Test Stage 'keyword_driven_crud_example' is APPLICABLE to API group '公共分类'. Executing... +2025-06-05 15:17:29,842 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling before_stage for stage 'keyword_driven_crud_example'. Context: {} +2025-06-05 15:17:29,842 - 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:17:29,843 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Initial stage context: {'unique_resource_name': 'Test_地质单元_1749107849_c58675', 'updated_resource_name': 'Test_地质单元_1749107849_c58675_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} +2025-06-05 15:17:29,843 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling before_step for stage 'keyword_driven_crud_example', step 'Add New 地质单元'. Context: {'unique_resource_name': 'Test_地质单元_1749107849_c58675', 'updated_resource_name': 'Test_地质单元_1749107849_c58675_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} +2025-06-05 15:17:29,843 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Executing before_step for step 'Add New 地质单元' in stage 'keyword_driven_crud_example' +2025-06-05 15:17:29,843 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Looking up endpoint key='地质单元数据添加', group='公共分类' +2025-06-05 15:17:29,843 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': 正在从 global_api_spec 中查找操作,键: '地质单元数据添加', API组: '公共分类' +2025-06-05 15:17:29,843 - 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:17:29,843 - 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:17:29,843 - 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:17:29,843 - 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:17:29,843 - 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:17:29,843 - 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:17:29,843 - 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:17:29,843 - 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:17:29,843 - 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:17:29,843 - 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:17:29,843 - 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:17:29,843 - 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:17:29,843 - 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:17:29,843 - 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:17:29,843 - 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:17:29,843 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' +2025-06-05 15:17:29,843 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 '1.0.0' (路径: 'api_version') +2025-06-05 15:17:29,843 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' +2025-06-05 15:17:29,843 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 'Test_地质单元_1749107849_c58675' (路径: 'unique_resource_name') +2025-06-05 15:17:29,843 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'dms_instance_code' 来自模板 '{{stage_context.dms_instance_code}}' +2025-06-05 15:17:29,843 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 'your_dms_instance_code' (路径: 'dms_instance_code') +2025-06-05 15:17:29,843 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' +2025-06-05 15:17:29,843 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 '1.0.0' (路径: 'api_version') +2025-06-05 15:17:29,843 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' +2025-06-05 15:17:29,843 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 'Test_地质单元_1749107849_c58675' (路径: 'unique_resource_name') +2025-06-05 15:17:29,843 - 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:17:29,843 - 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:17:29,857 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Validating response. Status: 200 +2025-06-05 15:17:29,857 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Extracting outputs. Map: {} +2025-06-05 15:17:29,857 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling after_step for stage 'keyword_driven_crud_example', step 'Add New 地质单元'. +2025-06-05 15:17:29,857 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Executing after_step for step 'Add New 地质单元' in stage 'keyword_driven_crud_example' +2025-06-05 15:17:29,857 - 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_地质单元_1749107849_c58675', 'updated_resource_name': 'Test_地质单元_1749107849_c58675_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} +2025-06-05 15:17:29,857 - 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:17:29,857 - 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:17:29,857 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': 正在从 global_api_spec 中查找操作,键: '地质单元列表查询', API组: '公共分类' +2025-06-05 15:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - 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:17:29,857 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' +2025-06-05 15:17:29,857 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 'Test_地质单元_1749107849_c58675' (路径: 'unique_resource_name') +2025-06-05 15:17:29,857 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'dms_instance_code' 来自模板 '{{stage_context.dms_instance_code}}' +2025-06-05 15:17:29,857 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 'your_dms_instance_code' (路径: 'dms_instance_code') +2025-06-05 15:17:29,857 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' +2025-06-05 15:17:29,857 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 '1.0.0' (路径: 'api_version') +2025-06-05 15:17:29,857 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' +2025-06-05 15:17:29,857 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 'Test_地质单元_1749107849_c58675' (路径: 'unique_resource_name') +2025-06-05 15:17:29,857 - 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:17:29,857 - 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 +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' +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 +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_1749107849_c58675", "wellId": "ExampleWellID_1749107849", "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_1749107849_c58675", "wellId": "ExampleWellID_1749107849", "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:17:29,872 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Validating response. Status: 200 +2025-06-05 15:17:29,872 - 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:17:29,872 - 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_地质单元_1749107849_c58675' (字段: wellCommonName) 的资源。 +2025-06-05 15:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling after_step for stage 'keyword_driven_crud_example', step 'List and Find Created 地质单元'. +2025-06-05 15:17:29,872 - 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:17:29,872 - 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:17:29,872 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling after_stage for stage 'keyword_driven_crud_example'. +2025-06-05 15:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 结束阶段 'Keyword-Driven Generic CRUD Stage Example' (资源关键字: '地质单元'). API分组: '公共分类'. 最终状态: Status.FAILED. 最终上下文: {'unique_resource_name': 'Test_地质单元_1749107849_c58675', 'updated_resource_name': 'Test_地质单元_1749107849_c58675_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} +2025-06-05 15:17:29,872 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example' execution finished. API Group: '公共分类', Final Status: 失败, Duration: 0.03s +2025-06-05 15:17:29,872 - ddms_compliance_suite.test_orchestrator - WARNING - API group '地质单元' provided, but cannot determine group details or filter APIs for spec type . +2025-06-05 15:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - ddms_compliance_suite.test_orchestrator - DEBUG - Checking applicability of stage 'keyword_driven_crud_example' for API group '地质单元'... +2025-06-05 15:17:29,872 - 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:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['添加', '新建', '创建']', method='POST' +2025-06-05 15:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元数据添加', MatchedText='地质单元数据添加' (for resource='地质单元', action='['添加', '新建', '创建']', method='POST') +2025-06-05 15:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['列表查询', '查询列表', '获取列表', '分页查询']', method='POST' +2025-06-05 15:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元列表查询', MatchedText='地质单元列表查询' (for resource='地质单元', action='['列表查询', '查询列表', '获取列表', '分页查询']', method='POST') +2025-06-05 15:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['查询详情', '获取详情', '根据ID获取']', method='GET' +2025-06-05 15:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元查询详情', MatchedText='地质单元查询详情' (for resource='地质单元', action='['查询详情', '获取详情', '根据ID获取']', method='GET') +2025-06-05 15:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['修改', '更新']', method='PUT' +2025-06-05 15:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元数据修改', MatchedText='地质单元数据修改' (for resource='地质单元', action='['修改', '更新']', method='PUT') +2025-06-05 15:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Searching for op with resource='地质单元', actions='['删除']', method='DELETE' +2025-06-05 15:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Discovered endpoint: Key='地质单元数据删除', MatchedText='地质单元数据删除' (for resource='地质单元', action='['删除']', method='DELETE') +2025-06-05 15:17:29,872 - 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:17:29,872 - ddms_compliance_suite.test_orchestrator - INFO - Test Stage 'keyword_driven_crud_example' is APPLICABLE to API group '地质单元'. Executing... +2025-06-05 15:17:29,872 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling before_stage for stage 'keyword_driven_crud_example'. Context: {} +2025-06-05 15:17:29,872 - 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:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - Initial stage context: {'unique_resource_name': 'Test_地质单元_1749107849_e89a62', 'updated_resource_name': 'Test_地质单元_1749107849_e89a62_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} +2025-06-05 15:17:29,872 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling before_step for stage 'keyword_driven_crud_example', step 'Add New 地质单元'. Context: {'unique_resource_name': 'Test_地质单元_1749107849_e89a62', 'updated_resource_name': 'Test_地质单元_1749107849_e89a62_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} +2025-06-05 15:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Executing before_step for step 'Add New 地质单元' in stage 'keyword_driven_crud_example' +2025-06-05 15:17:29,872 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Looking up endpoint key='地质单元数据添加', group='地质单元' +2025-06-05 15:17:29,872 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': 正在从 global_api_spec 中查找操作,键: '地质单元数据添加', API组: '地质单元' +2025-06-05 15:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,872 - 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:17:29,873 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' +2025-06-05 15:17:29,873 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 '1.0.0' (路径: 'api_version') +2025-06-05 15:17:29,873 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' +2025-06-05 15:17:29,873 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 'Test_地质单元_1749107849_e89a62' (路径: 'unique_resource_name') +2025-06-05 15:17:29,873 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'dms_instance_code' 来自模板 '{{stage_context.dms_instance_code}}' +2025-06-05 15:17:29,873 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 'your_dms_instance_code' (路径: 'dms_instance_code') +2025-06-05 15:17:29,873 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' +2025-06-05 15:17:29,873 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 '1.0.0' (路径: 'api_version') +2025-06-05 15:17:29,873 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'Add New 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' +2025-06-05 15:17:29,873 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'Add New 地质单元'] 从上下文解析到值 'Test_地质单元_1749107849_e89a62' (路径: 'unique_resource_name') +2025-06-05 15:17:29,873 - 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:17:29,873 - 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:17:29,888 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Validating response. Status: 200 +2025-06-05 15:17:29,888 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'Add New 地质单元': Extracting outputs. Map: {} +2025-06-05 15:17:29,888 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling after_step for stage 'keyword_driven_crud_example', step 'Add New 地质单元'. +2025-06-05 15:17:29,888 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - DEBUG - Executing after_step for step 'Add New 地质单元' in stage 'keyword_driven_crud_example' +2025-06-05 15:17:29,888 - 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_地质单元_1749107849_e89a62', 'updated_resource_name': 'Test_地质单元_1749107849_e89a62_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} +2025-06-05 15:17:29,888 - 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:17:29,888 - 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:17:29,888 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 'keyword_driven_crud_example': 正在从 global_api_spec 中查找操作,键: '地质单元列表查询', API组: '地质单元' +2025-06-05 15:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - 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:17:29,889 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' +2025-06-05 15:17:29,889 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 'Test_地质单元_1749107849_e89a62' (路径: 'unique_resource_name') +2025-06-05 15:17:29,889 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'dms_instance_code' 来自模板 '{{stage_context.dms_instance_code}}' +2025-06-05 15:17:29,889 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 'your_dms_instance_code' (路径: 'dms_instance_code') +2025-06-05 15:17:29,889 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'api_version' 来自模板 '{{stage_context.api_version}}' +2025-06-05 15:17:29,889 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 '1.0.0' (路径: 'api_version') +2025-06-05 15:17:29,889 - ddms_compliance_suite.test_orchestrator - DEBUG - [阶段步骤 'List and Find Created 地质单元'] 解析上下文路径: 'unique_resource_name' 来自模板 '{{stage_context.unique_resource_name}}' +2025-06-05 15:17:29,889 - ddms_compliance_suite.test_orchestrator - INFO - [测试阶段步骤 'List and Find Created 地质单元'] 从上下文解析到值 'Test_地质单元_1749107849_e89a62' (路径: 'unique_resource_name') +2025-06-05 15:17:29,889 - 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:17:29,889 - 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:17:29,908 - ddms_compliance_suite.test_orchestrator - DEBUG - Stage 'keyword_driven_crud_example', Step 'List and Find Created 地质单元': Validating response. Status: 200 +2025-06-05 15:17:29,908 - 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:17:29,908 - 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_地质单元_1749107849_e89a62' (字段: wellCommonName) 的资源。 +2025-06-05 15:17:29,908 - 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:17:29,908 - 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:17:29,908 - 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:17:29,908 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling after_step for stage 'keyword_driven_crud_example', step 'List and Find Created 地质单元'. +2025-06-05 15:17:29,908 - 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:17:29,908 - 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:17:29,908 - ddms_compliance_suite.test_orchestrator - DEBUG - Calling after_stage for stage 'keyword_driven_crud_example'. +2025-06-05 15:17:29,908 - ddms_compliance_suite.stage_framework.KeywordDrivenCRUDStage - INFO - 结束阶段 'Keyword-Driven Generic CRUD Stage Example' (资源关键字: '地质单元'). API分组: '地质单元'. 最终状态: Status.FAILED. 最终上下文: {'unique_resource_name': 'Test_地质单元_1749107849_e89a62', 'updated_resource_name': 'Test_地质单元_1749107849_e89a62_UPDATED', 'dms_instance_code': 'your_dms_instance_code', 'api_version': '1.0.0'} +2025-06-05 15:17:29,908 - ddms_compliance_suite.test_orchestrator - INFO - Stage 'keyword_driven_crud_example' execution finished. API Group: '地质单元', Final Status: 失败, Duration: 0.04s +2025-06-05 15:17:29,908 - ddms_compliance_suite.test_orchestrator - INFO - API Test Stage execution processed. Considered 2 (stage_definition x api_group) combinations. +2025-06-05 15:17:29,908 - __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_1749107849_c58675"]}}}' --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_1749107849_c58675"]}}}\' --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_1749107849_e89a62", "wellId": "ExampleWellID_1749107849", "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_1749107849_e89a62", "wellId": "ExampleWellID_1749107849", "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_1749107849_e89a62"]}}}' --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_1749107849_e89a62"]}}}\' --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:17:29.042083 +结束时间: 2025-06-05T15:17:29.908800 +总耗时: 0.87 秒 + +--- 端点统计 --- +定义的端点总数: 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') 为 '49'. + 端点: 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') 为 '77'. + - 测试用例失败: TC-ERROR-4001-BODY (Error Code 4001 - Request Body Type Mismatch Validation) + - 验证点: 当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '43'. + 端点: 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') 为 '6'. + - 测试用例失败: TC-ERROR-4001-BODY (Error Code 4001 - Request Body Type Mismatch Validation) + - 验证点: 当请求体字段 'id' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '2'. + - 测试用例失败: TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) + - 验证点: 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '26'. + 端点: DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit (地质单元数据删除) - 状态: 失败 + - 测试用例失败: TC-SECURITY-001 (HTTPS Protocol Mandatory Verification) +2025-06-05 15:17:29,911 - __main__ - INFO - 测试结果已保存为JSON: test_reports/summary.json +2025-06-05 15:17:29,911 - __main__ - INFO - API调用详情将以 Markdown 格式保存到目录 'test_reports' (使用默认文件名 'api_call_details.md') +2025-06-05 15:17:29,916 - __main__ - INFO - API调用详情已保存为 Markdown: test_reports/api_call_details.md +2025-06-05 15:17:29,916 - __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') 为 '11'. + - 测试用例失败: TC-ERROR-4001-BODY (Error Code 4001 - Request Body Type Mismatch Validation) + - 验证点: 当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '80'. + - 测试用例失败: TC-ERROR-4003-QUERY (Error Code 4003 - Missing Required Query Parameter Validation) + - 验证点: 当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '63'. + 端点: 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') 为 '10'. + - 测试用例失败: TC-ERROR-4003-BODY (Error Code 4003 - Missing Required Request Body Field Validation) + - 验证点: 当移除必填请求体字段 'data.0.bsflag' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '16'. + 端点: 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') 为 '11'. + +--- API测试阶段 (Stage) 统计 --- +定义的API阶段总数: 1 +实际执行的API阶段数: 2 + 通过: 0 + 失败: 2 + 跳过: 0 + 阶段通过率: 0.00% + +--- 失败的API阶段摘要 --- + 阶段: keyword_driven_crud_example (Keyword-Driven Generic CRUD Stage Example) - 应用于分组: '公共分类' - 状态: 失败 + 阶段: keyword_driven_crud_example (Keyword-Driven Generic CRUD Stage Example) - 应用于分组: '地质单元' - 状态: 失败 diff --git a/mvp/custom_testcases/__pycache__/basic_checks.cpython-312.pyc b/mvp/custom_testcases/__pycache__/basic_checks.cpython-312.pyc deleted file mode 100644 index 827f95e83416e5b0645c481bc3758336d414b2f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3376 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 U{a31kIKFY_u|L8F!(|En4@mS46#xJL diff --git a/mvp/custom_testcases/compliance_catalog/error_handling/__pycache__/missing_required_field_body_case.cpython-312.pyc b/mvp/custom_testcases/compliance_catalog/error_handling/__pycache__/missing_required_field_body_case.cpython-312.pyc deleted file mode 100644 index 2f671c008d3d082c0204da0b2fe83f69a412d859..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9096 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 G2mcEYRy7F# diff --git a/mvp/custom_testcases/compliance_catalog/error_handling/__pycache__/type_mismatch_body_case.cpython-312.pyc b/mvp/custom_testcases/compliance_catalog/error_handling/__pycache__/type_mismatch_body_case.cpython-312.pyc deleted file mode 100644 index 00bdbd6f3cb6bc10635a214a878aee93b7da17ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11174 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 diff --git a/mvp/custom_testcases/compliance_catalog/error_handling/__pycache__/type_mismatch_query_param_case.cpython-312.pyc b/mvp/custom_testcases/compliance_catalog/error_handling/__pycache__/type_mismatch_query_param_case.cpython-312.pyc deleted file mode 100644 index daea819a75545de7ffbaa0ea6745555157642410..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11417 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 ASpWb4 diff --git a/mvp/custom_testcases/compliance_catalog/normative_spec/__pycache__/http_method_usage_case.cpython-312.pyc b/mvp/custom_testcases/compliance_catalog/normative_spec/__pycache__/http_method_usage_case.cpython-312.pyc deleted file mode 100644 index 46651f39bc9c11c35c2780373aa36c1bc20e7bb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmYjNyKWUR5Vd#rK9eXU6cqV_m7zEg2+fdI-WD{FI!u4Mz;4(Ebs3!_C0_8S#e9Q9}&4?Eo-@9mP>96 zS=dsRwvrXk{=$sxSdQ&PPV7`p?M%+>T+TULm38$am#M2%J@0f(a;Gq{A%#Z|iZR++9y0#yE8q2tP|_Ho$}q|>CP;PLT5Pnl-gK(h(BRNTIEYlWxd_U_M;G3c z9w1C|(lo;?Lq1#BAo$F#3E3YMZx8~Cwbu_1Mb1O7G>G-uEXDs0LJt_7ZE_1ui{c%v z(JCtA7NU2-(z2H{j|VN5G5W?rT)MUyP%VH05e_^Z^09U8VBksEp&2+md_eHC1kIARfV;>k!7lmL^Teq)KxQ7oNehcnnV<-F0QU6F+?T z@6W)0<@t;y&9|H4zGLh?z`we2Y96d*3x0euKT6aMKYb-mgq}onuv&|o^%XepYDx4HyRIq QlD2s=4dIh<&V82B7afr~#sB~S diff --git a/mvp/custom_testcases/compliance_catalog/security/__pycache__/https_mandatory_case.cpython-312.pyc b/mvp/custom_testcases/compliance_catalog/security/__pycache__/https_mandatory_case.cpython-312.pyc deleted file mode 100644 index de7f3e858cbbe7dd585aee29cc3fc932da2397eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6750 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 MGBYwV7BK@^0M^$xe*gdg diff --git a/run_api_tests.py b/run_api_tests.py index 1f94ece..05597a0 100644 --- a/run_api_tests.py +++ b/run_api_tests.py @@ -18,6 +18,7 @@ from typing import List, Optional from ddms_compliance_suite.api_caller.caller import APICallDetail from ddms_compliance_suite.test_orchestrator import APITestOrchestrator, TestSummary +from ddms_compliance_suite.input_parser.parser import ParsedAPISpec # 配置日志 logging.basicConfig( @@ -84,6 +85,12 @@ def parse_args(): default=False, help='是否启用LLM为API请求生成头部参数。') + # 新增:场景测试参数组 + scenario_group = parser.add_argument_group('API测试阶段 (Stage) 选项 (可选)') + scenario_group.add_argument('--stages-dir', + default=None, + help='存放自定义APIStage Python文件的目录路径。如果未提供,则不执行测试阶段。') + return parser.parse_args() def list_yapi_categories(yapi_file: str): @@ -402,31 +409,63 @@ def main(): use_llm_for_path_params=args.use_llm_for_path_params, use_llm_for_query_params=args.use_llm_for_query_params, use_llm_for_headers=args.use_llm_for_headers, - output_dir=str(output_directory) + output_dir=str(output_directory), + stages_dir=args.stages_dir # 将 stages_dir 传递给编排器 ) test_summary: Optional[TestSummary] = None + parsed_spec_for_scenarios: Optional[ParsedAPISpec] = None # 用于存储已解析的规范,供场景使用 try: if args.yapi: logger.info(f"从YAPI文件运行测试: {args.yapi}") - test_summary = orchestrator.run_tests_from_yapi( - yapi_file_path=args.yapi, + # orchestrator.run_tests_from_yapi 现在返回一个元组 + test_summary, parsed_spec_for_scenarios = orchestrator.run_tests_from_yapi( + yapi_file_path=args.yapi, categories=categories, custom_test_cases_dir=args.custom_test_cases_dir ) + if not parsed_spec_for_scenarios: # 检查解析是否成功 + # orchestrator 内部应该已经记录了具体的解析错误 + logger.error(f"YAPI文件 '{args.yapi}' 解析失败 (由编排器报告)。程序将退出。") + sys.exit(1) + elif args.swagger: logger.info(f"从Swagger文件运行测试: {args.swagger}") - test_summary = orchestrator.run_tests_from_swagger( - swagger_file_path=args.swagger, + # orchestrator.run_tests_from_swagger 现在返回一个元组 + test_summary, parsed_spec_for_scenarios = orchestrator.run_tests_from_swagger( + swagger_file_path=args.swagger, tags=tags, custom_test_cases_dir=args.custom_test_cases_dir ) + if not parsed_spec_for_scenarios: # 检查解析是否成功 + logger.error(f"Swagger文件 '{args.swagger}' 解析失败 (由编排器报告)。程序将退出。") + sys.exit(1) + # Deliberately not having an else here, as the initial check for yapi/swagger presence handles it. + # If test_summary remains None here, it implies neither --yapi nor --swagger was processed correctly + # or an unexpected path was taken, which should be caught by later checks or an error. + except Exception as e: - logger.error(f"执行测试时发生意外错误: {e}", exc_info=True) + logger.error(f"执行测试用例时发生意外错误: {e}", exc_info=True) sys.exit(1) if test_summary: + # 在保存单个测试用例结果之后,运行API测试阶段 (如果指定了目录) + if args.stages_dir and parsed_spec_for_scenarios: + logger.info(f"开始执行API测试阶段 (Stages),目录: {args.stages_dir}") + # 注意:这里假设 test_orchestrator.py 中已经有了 run_stages_from_spec 方法 + # 并且 APITestOrchestrator 的 __init__ 也接受 stages_dir + orchestrator.run_stages_from_spec( # 调用 run_stages_from_spec + # stages_dir is managed by orchestrator's __init__ + parsed_spec=parsed_spec_for_scenarios, # 使用之前解析的规范 + summary=test_summary # 将阶段结果添加到同一个摘要对象 + ) + logger.info("API测试阶段 (Stages) 执行完毕。") + # 阶段执行后,摘要已更新,重新最终确定和打印摘要 + test_summary.finalize_summary() # 重新计算总时长等 + test_summary.print_summary_to_console() # 打印包含阶段结果的更新摘要 + + # 保存主测试摘要 (现在可能包含测试阶段结果) save_results(test_summary, str(main_report_file_path), args.format) api_calls_output_path_str: Optional[str] = None @@ -486,4 +525,7 @@ if __name__ == '__main__': # python run_api_tests.py --base-url https://127.0.0.1:4523/m1/6389742-6086420-default --yapi assets/doc/井筒API示例_simple.json --custom-test-cases-dir ./custom_testcases \ # --verbose \ -# --output test_report.json \ No newline at end of file +# --output test_report.json + +# 示例:同时运行测试用例和场景 +# python run_api_tests.py --base-url http://127.0.0.1:8000 --swagger ./assets/doc/petstore_swagger.json --custom-test-cases-dir ./custom_testcases --stages-dir ./custom_stages -v -o reports/ \ No newline at end of file diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..1edf0ca --- /dev/null +++ b/static/index.html @@ -0,0 +1,96 @@ + + + + + + API 测试工具 + + + +
+

API 合规性测试

+ +
+

测试配置

+
+
+ + +
+ +
+ API 定义源 (选择一个) +
+ + + +
+
+
+ + + +
+
+
+ +
+ + +
+
+ + +
+
+ + +
+ +
+ LLM 配置 (可选) +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+

测试状态与结果

+
等待配置并运行测试...
+

+            
+        
+
+ + + + \ No newline at end of file diff --git a/static/script.js b/static/script.js new file mode 100644 index 0000000..cc0f23f --- /dev/null +++ b/static/script.js @@ -0,0 +1,140 @@ +document.addEventListener('DOMContentLoaded', () => { + const form = document.getElementById('test-config-form'); + const statusArea = document.getElementById('status-area'); + const resultsOutput = document.getElementById('results-output'); + const reportLinkArea = document.getElementById('report-link-area'); + + form.addEventListener('submit', async (event) => { + event.preventDefault(); + statusArea.textContent = '正在运行测试,请稍候...'; + resultsOutput.textContent = ''; + reportLinkArea.innerHTML = ''; + + const formData = new FormData(form); + const config = {}; + formData.forEach((value, key) => { + // 处理复选框 + if (key.startsWith('use_llm_for_')) { + config[key] = form.elements[key].checked; + } else if (value.trim() !== '') { // 只添加非空值 + config[key] = value.trim(); + } + }); + + // 如果复选框未被选中,FormData 不会包含它们,所以要确保它们是 false + ['use_llm_for_request_body', 'use_llm_for_path_params', 'use_llm_for_query_params', 'use_llm_for_headers'].forEach(key => { + if (!(key in config)) { + config[key] = false; + } + }); + + // 从 YAPI 分类和 Swagger 标签中获取选中的项 + const selectedYapiCategories = Array.from(document.querySelectorAll('#yapi-categories-container input[type="checkbox"]:checked')) + .map(cb => cb.value); + if (selectedYapiCategories.length > 0) { + config['categories'] = selectedYapiCategories.join(','); + } + + const selectedSwaggerTags = Array.from(document.querySelectorAll('#swagger-tags-container input[type="checkbox"]:checked')) + .map(cb => cb.value); + if (selectedSwaggerTags.length > 0) { + config['tags'] = selectedSwaggerTags.join(','); + } + + try { + const response = await fetch('/run-tests', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(config) + }); + + const result = await response.json(); + + if (response.ok) { + statusArea.textContent = `测试完成: ${result.message || '成功'}`; + resultsOutput.textContent = JSON.stringify(result.summary, null, 2); + if (result.report_file) { + reportLinkArea.innerHTML = `

测试报告已保存到: ${result.report_file}

`; + } + } else { + statusArea.textContent = `测试失败: ${result.error || '未知错误'}`; + resultsOutput.textContent = JSON.stringify(result, null, 2); + } + } catch (error) { + statusArea.textContent = '运行测试时发生网络错误或服务器内部错误。'; + resultsOutput.textContent = error.toString(); + console.error('运行测试出错:', error); + } + }); +}); + +async function fetchYapiCategories() { + const yapiFilePath = document.getElementById('yapi_file_path').value; + const container = document.getElementById('yapi-categories-container'); + container.innerHTML = '正在加载分类...'; + + if (!yapiFilePath) { + container.innerHTML = '

请输入YAPI文件路径。

'; + return; + } + + try { + const response = await fetch('/list-yapi-categories', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ yapi_file_path: yapiFilePath }) + }); + const categories = await response.json(); + if (response.ok) { + renderCheckboxes(container, categories, 'yapi_category'); + } else { + container.innerHTML = `

加载YAPI分类失败: ${categories.error || '未知错误'}

`; + } + } catch (error) { + container.innerHTML = `

请求YAPI分类时出错: ${error}

`; + } +} + +async function fetchSwaggerTags() { + const swaggerFilePath = document.getElementById('swagger_file_path').value; + const container = document.getElementById('swagger-tags-container'); + container.innerHTML = '正在加载标签...'; + + if (!swaggerFilePath) { + container.innerHTML = '

请输入Swagger文件路径。

'; + return; + } + + try { + const response = await fetch('/list-swagger-tags', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ swagger_file_path: swaggerFilePath }) + }); + const tags = await response.json(); + if (response.ok) { + renderCheckboxes(container, tags, 'swagger_tag'); + } else { + container.innerHTML = `

加载Swagger标签失败: ${tags.error || '未知错误'}

`; + } + } catch (error) { + container.innerHTML = `

请求Swagger标签时出错: ${error}

`; + } +} + +function renderCheckboxes(container, items, groupName) { + if (!items || items.length === 0) { + container.innerHTML = '

未找到任何项。

'; + return; + } + let html = items.map((item, index) => { + const id = `${groupName}_${index}`; + return `
+ + +
`; + }).join(''); + container.innerHTML = html; +} \ No newline at end of file diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..6b591f1 --- /dev/null +++ b/static/style.css @@ -0,0 +1,161 @@ +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 20px; + background-color: #f4f7f6; + color: #333; +} + +.container { + max-width: 900px; + margin: 0 auto; + background-color: #fff; + padding: 25px; + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0,0,0,0.1); +} + +h1 { + color: #2c3e50; + text-align: center; + margin-bottom: 25px; +} + +h2 { + color: #34495e; + border-bottom: 2px solid #ecf0f1; + padding-bottom: 10px; + margin-top: 30px; + margin-bottom: 20px; +} + +.form-group { + margin-bottom: 18px; +} + +.form-group label { + display: block; + margin-bottom: 6px; + font-weight: bold; + color: #555; +} + +.form-group input[type="text"], +.form-group input[type="password"], +.form-group input[type="url"] { + width: calc(100% - 22px); + padding: 10px; + border: 1px solid #ccc; + border-radius: 4px; + box-sizing: border-box; +} + +.form-group input[type="text"]:focus, +.form-group input[type="password"]:focus, +.form-group input[type="url"]:focus { + border-color: #3498db; + outline: none; +} + +.checkbox-group label { + font-weight: normal; + display: inline-block; + margin-left: 5px; +} +.checkbox-group input[type="checkbox"] { + margin-right: 5px; + vertical-align: middle; +} + +fieldset { + border: 1px solid #ddd; + padding: 15px; + border-radius: 4px; + margin-bottom: 20px; +} + +legend { + padding: 0 10px; + font-weight: bold; + color: #3498db; +} + +.action-button { + background-color: #3498db; + color: white; + padding: 8px 12px; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 0.9em; + margin-left: 10px; +} + +.action-button:hover { + background-color: #2980b9; +} + +.submit-button { + background-color: #2ecc71; + color: white; + padding: 12px 20px; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 1.1em; + display: block; + width: 100%; + margin-top: 20px; +} + +.submit-button:hover { + background-color: #27ae60; +} + +.results-section { + margin-top: 30px; +} + +#status-area { + font-weight: bold; + margin-bottom: 15px; + padding: 10px; + border-radius: 4px; + background-color: #ecf0f1; + border: 1px solid #bdc3c7; +} + +#results-output { + background-color: #2c3e50; + color: #ecf0f1; + padding: 15px; + border-radius: 4px; + white-space: pre-wrap; /* Allows wrapping and preserves whitespace */ + word-wrap: break-word; /* Breaks long words to prevent overflow */ + max-height: 500px; + overflow-y: auto; + font-family: "Courier New", Courier, monospace; +} + +#report-link-area p { + margin-top: 10px; + font-weight: bold; +} + +.categories-tags-container { + margin-top: 10px; + padding: 10px; + background-color: #f9f9f9; + border: 1px solid #eee; + border-radius: 4px; + max-height: 150px; + overflow-y: auto; +} + +.categories-tags-container div { + margin-bottom: 5px; +} +.categories-tags-container label { + font-weight: normal; +} \ No newline at end of file diff --git a/test_report.json b/test_report.json index 6a993e1..990924f 100644 --- a/test_report.json +++ b/test_report.json @@ -1,8 +1,8 @@ { "summary_metadata": { - "start_time": "2025-05-29T16:45:25.849307", - "end_time": "2025-05-29T16:45:26.621679", - "duration_seconds": "0.77" + "start_time": "2025-06-05T13:18:23.490837", + "end_time": null, + "duration_seconds": "0.00" }, "endpoint_stats": { "total_defined": 6, @@ -28,9 +28,9 @@ "endpoint_id": "POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}", "endpoint_name": "数据推送接口", "overall_status": "失败", - "duration_seconds": 0.195803, - "start_time": "2025-05-29T16:45:25.849631", - "end_time": "2025-05-29T16:45:26.045434", + "duration_seconds": 0.465053, + "start_time": "2025-06-05T13:18:23.491218", + "end_time": "2025-06-05T13:18:23.956271", "executed_test_cases": [ { "test_case_id": "TC-STATUS-001", @@ -38,8 +38,8 @@ "test_case_severity": "严重", "status": "通过", "message": "响应状态码为 200,符合预期 200。", - "duration_seconds": 0.06710091698914766, - "timestamp": "2025-05-29T16:45:25.916804", + "duration_seconds": 0.27044441597536206, + "timestamp": "2025-06-05T13:18:23.761746", "validation_points": [ { "passed": true, @@ -53,8 +53,8 @@ "test_case_severity": "严重", "status": "通过", "message": "Schema验证步骤完成(未发现问题,或schema不适用/未为此响应定义)。", - "duration_seconds": 0.024326875107362866, - "timestamp": "2025-05-29T16:45:25.941204", + "duration_seconds": 0.0601590839214623, + "timestamp": "2025-06-05T13:18:23.821970", "validation_points": [ { "passed": true, @@ -68,8 +68,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.019037832971662283, - "timestamp": "2025-05-29T16:45:25.960309", + "duration_seconds": 0.025706333806738257, + "timestamp": "2025-06-05T13:18:23.847743", "validation_points": [ { "status_code": 200 @@ -82,8 +82,8 @@ "test_case_severity": "中", "status": "通过", "message": "跳过测试:在查询参数中未找到合适的字段来测试类型不匹配。", - "duration_seconds": 0.0200852919369936, - "timestamp": "2025-05-29T16:45:25.980454", + "duration_seconds": 0.03199487505480647, + "timestamp": "2025-06-05T13:18:23.879789", "validation_points": [ { "passed": true, @@ -96,35 +96,28 @@ "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", "test_case_severity": "中", "status": "失败", - "message": "当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '44'.", - "duration_seconds": 0.02025704109109938, - "timestamp": "2025-05-29T16:45:26.000770", + "message": "当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '94'.", + "duration_seconds": 0.039490207796916366, + "timestamp": "2025-06-05T13:18:23.919334", "validation_points": [ { "status_code": 200, "response_body": { - "code": 44, - "message": "cupidatat ipsum exercitation", + "code": 94, + "message": "irure nulla fugiat sit", "data": { - "total": 84, + "total": 86, "list": [ { - "dsid": "56", - "dataRegion": "culpa et nisi", + "dsid": "39", + "dataRegion": "qui sed in", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { - "dsid": "22", - "dataRegion": "ea nulla in tempor proident", - "gasReleaseMon": null, - "gasReleaseYear": null, - "releaseGasCum": null - }, - { - "dsid": "69", - "dataRegion": "adipisicing dolore velit Excepteur", + "dsid": "87", + "dataRegion": "deserunt aute irure", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -147,8 +140,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。", - "duration_seconds": 0.02807041583582759, - "timestamp": "2025-05-29T16:45:26.028894", + "duration_seconds": 0.017872040858492255, + "timestamp": "2025-06-05T13:18:23.937261", "validation_points": [ { "passed": true, @@ -162,8 +155,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。", - "duration_seconds": 0.016444000182673335, - "timestamp": "2025-05-29T16:45:26.045394", + "duration_seconds": 0.01888895803131163, + "timestamp": "2025-06-05T13:18:23.956219", "validation_points": [ { "passed": true, @@ -177,9 +170,9 @@ "endpoint_id": "POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}", "endpoint_name": "地质单元列表查询", "overall_status": "失败", - "duration_seconds": 0.121974, - "start_time": "2025-05-29T16:45:26.045467", - "end_time": "2025-05-29T16:45:26.167441", + "duration_seconds": 0.138585, + "start_time": "2025-06-05T13:18:23.956310", + "end_time": "2025-06-05T13:18:24.094895", "executed_test_cases": [ { "test_case_id": "TC-STATUS-001", @@ -187,8 +180,8 @@ "test_case_severity": "严重", "status": "通过", "message": "响应状态码为 200,符合预期 200。", - "duration_seconds": 0.0186984168831259, - "timestamp": "2025-05-29T16:45:26.064250", + "duration_seconds": 0.022716667037457228, + "timestamp": "2025-06-05T13:18:23.979121", "validation_points": [ { "passed": true, @@ -202,8 +195,8 @@ "test_case_severity": "严重", "status": "通过", "message": "Schema验证步骤完成(未发现问题,或schema不适用/未为此响应定义)。", - "duration_seconds": 0.021727959159761667, - "timestamp": "2025-05-29T16:45:26.086038", + "duration_seconds": 0.017374124843627214, + "timestamp": "2025-06-05T13:18:23.996552", "validation_points": [ { "passed": true, @@ -217,8 +210,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.017182791838422418, - "timestamp": "2025-05-29T16:45:26.103281", + "duration_seconds": 0.019951834110543132, + "timestamp": "2025-06-05T13:18:24.016559", "validation_points": [ { "status_code": 200 @@ -230,21 +223,28 @@ "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') 为 '30'.", - "duration_seconds": 0.016620707930997014, - "timestamp": "2025-05-29T16:45:26.119956", + "message": "当查询参数 'pageNo' (路径: 'pageNo') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '53'.", + "duration_seconds": 0.018517875112593174, + "timestamp": "2025-06-05T13:18:24.035132", "validation_points": [ { "status_code": 200, "response_body": { - "code": 30, - "message": "ut incididunt aliquip laborum", + "code": 53, + "message": "velit sed", "data": { - "total": 45, + "total": 28, "list": [ { - "dsid": "86", - "dataRegion": "aliqua ipsum labore ea", + "dsid": "77", + "dataRegion": "deserunt", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "43", + "dataRegion": "quis anim ea pariatur in", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -266,28 +266,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') 为 '93'.", - "duration_seconds": 0.01504912506788969, - "timestamp": "2025-05-29T16:45:26.135053", + "message": "当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '36'.", + "duration_seconds": 0.02283320901915431, + "timestamp": "2025-06-05T13:18:24.058027", "validation_points": [ { "status_code": 200, "response_body": { - "code": 93, - "message": "irure in aute aliquip dolor", + "code": 36, + "message": "in voluptate commodo", "data": { - "total": 14, + "total": 37, "list": [ { - "dsid": "49", - "dataRegion": "pariatur nulla", + "dsid": "59", + "dataRegion": "amet occaecat deserunt ex pariatur", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null }, { - "dsid": "47", - "dataRegion": "ullamco anim incididunt culpa", + "dsid": "20", + "dataRegion": "aute officia deserunt in", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -310,8 +310,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。", - "duration_seconds": 0.01566412509419024, - "timestamp": "2025-05-29T16:45:26.150763", + "duration_seconds": 0.016807042062282562, + "timestamp": "2025-06-05T13:18:24.075022", "validation_points": [ { "passed": true, @@ -325,8 +325,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。", - "duration_seconds": 0.016583458986133337, - "timestamp": "2025-05-29T16:45:26.167396", + "duration_seconds": 0.01974637503735721, + "timestamp": "2025-06-05T13:18:24.094848", "validation_points": [ { "passed": true, @@ -340,9 +340,9 @@ "endpoint_id": "PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit", "endpoint_name": "地质单元数据修改", "overall_status": "失败", - "duration_seconds": 0.110383, - "start_time": "2025-05-29T16:45:26.167471", - "end_time": "2025-05-29T16:45:26.277854", + "duration_seconds": 0.144021, + "start_time": "2025-06-05T13:18:24.094928", + "end_time": "2025-06-05T13:18:24.238949", "executed_test_cases": [ { "test_case_id": "TC-STATUS-001", @@ -350,8 +350,8 @@ "test_case_severity": "严重", "status": "通过", "message": "响应状态码为 200,符合预期 200。", - "duration_seconds": 0.01697887503542006, - "timestamp": "2025-05-29T16:45:26.184543", + "duration_seconds": 0.026633291970938444, + "timestamp": "2025-06-05T13:18:24.121653", "validation_points": [ { "passed": true, @@ -365,8 +365,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.01832004194147885, - "timestamp": "2025-05-29T16:45:26.202912", + "duration_seconds": 0.024359666975215077, + "timestamp": "2025-06-05T13:18:24.146076", "validation_points": [ { "passed": true, @@ -380,8 +380,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.016209041001275182, - "timestamp": "2025-05-29T16:45:26.219217", + "duration_seconds": 0.017260834109038115, + "timestamp": "2025-06-05T13:18:24.163411", "validation_points": [ { "status_code": 200 @@ -393,15 +393,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') 为 '55'.", - "duration_seconds": 0.014930624980479479, - "timestamp": "2025-05-29T16:45:26.234199", + "message": "当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '75'.", + "duration_seconds": 0.019769666949287057, + "timestamp": "2025-06-05T13:18:24.183238", "validation_points": [ { "status_code": 200, "response_body": { - "code": 55, - "message": "tempor elit", + "code": 75, + "message": "dolore sit minim sint", "data": true }, "expected_http_status_codes": [ @@ -418,16 +418,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') 为 '54'.", - "duration_seconds": 0.014813833869993687, - "timestamp": "2025-05-29T16:45:26.249066", + "message": "当请求体字段 'id' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '33'.", + "duration_seconds": 0.016951082972809672, + "timestamp": "2025-06-05T13:18:24.200244", "validation_points": [ { "status_code": 200, "response_body": { - "code": 54, - "message": "deserunt id incididunt", - "data": false + "code": 33, + "message": "sit non esse ad enim", + "data": true }, "expected_http_status_codes": [ 400, @@ -444,8 +444,8 @@ "test_case_severity": "高", "status": "通过", "message": "当移除必填请求体字段 'id' 时,API响应了状态码 200 (非主要预期HTTP状态 [400, 422],但为4xx客户端错误), 且响应体中包含预期的业务错误码 '4003' (字段: 'code').", - "duration_seconds": 0.013806292088702321, - "timestamp": "2025-05-29T16:45:26.262916", + "duration_seconds": 0.01893512485548854, + "timestamp": "2025-06-05T13:18:24.219234", "validation_points": [ { "passed": true, @@ -458,16 +458,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') 为 '25'.", - "duration_seconds": 0.014846875099465251, - "timestamp": "2025-05-29T16:45:26.277818", + "message": "当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '69'.", + "duration_seconds": 0.019623583182692528, + "timestamp": "2025-06-05T13:18:24.238911", "validation_points": [ { "status_code": 200, "response_body": { - "code": 25, - "message": "sint laboris ex ea", - "data": true + "code": 69, + "message": "exercitation laborum cupidatat commodo", + "data": false }, "expected_http_status_codes": [ 400, @@ -484,9 +484,9 @@ "endpoint_id": "DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit", "endpoint_name": "地质单元数据删除", "overall_status": "失败", - "duration_seconds": 0.111407, - "start_time": "2025-05-29T16:45:26.277880", - "end_time": "2025-05-29T16:45:26.389287", + "duration_seconds": 0.108327, + "start_time": "2025-06-05T13:18:24.238977", + "end_time": "2025-06-05T13:18:24.347304", "executed_test_cases": [ { "test_case_id": "TC-STATUS-001", @@ -494,8 +494,8 @@ "test_case_severity": "严重", "status": "通过", "message": "响应状态码为 200,符合预期 200。", - "duration_seconds": 0.013204999966546893, - "timestamp": "2025-05-29T16:45:26.291166", + "duration_seconds": 0.013654708862304688, + "timestamp": "2025-06-05T13:18:24.252718", "validation_points": [ { "passed": true, @@ -509,8 +509,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.01893095811828971, - "timestamp": "2025-05-29T16:45:26.310139", + "duration_seconds": 0.015607249923050404, + "timestamp": "2025-06-05T13:18:24.268376", "validation_points": [ { "passed": true, @@ -524,8 +524,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.013458125060424209, - "timestamp": "2025-05-29T16:45:26.323654", + "duration_seconds": 0.013847207883372903, + "timestamp": "2025-06-05T13:18:24.282274", "validation_points": [ { "status_code": 200 @@ -537,15 +537,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') 为 '36'.", - "duration_seconds": 0.015051041962578893, - "timestamp": "2025-05-29T16:45:26.338921", + "message": "当查询参数 'id' (路径: 'id') 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '91'.", + "duration_seconds": 0.014518292155116796, + "timestamp": "2025-06-05T13:18:24.296839", "validation_points": [ { "status_code": 200, "response_body": { - "code": 36, - "message": "nostrud aliqua consequat commodo", + "code": 91, + "message": "irure ex", "data": true }, "expected_http_status_codes": [ @@ -562,15 +562,15 @@ "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", "test_case_severity": "中", "status": "失败", - "message": "当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '91'.", - "duration_seconds": 0.015764417126774788, - "timestamp": "2025-05-29T16:45:26.354804", + "message": "当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '2'.", + "duration_seconds": 0.017365749925374985, + "timestamp": "2025-06-05T13:18:24.314251", "validation_points": [ { "status_code": 200, "response_body": { - "code": 91, - "message": "nisi eu deserunt laboris", + "code": 2, + "message": "aliqua pariatur", "data": false }, "expected_http_status_codes": [ @@ -588,8 +588,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。", - "duration_seconds": 0.017602207837626338, - "timestamp": "2025-05-29T16:45:26.372570", + "duration_seconds": 0.018009459134191275, + "timestamp": "2025-06-05T13:18:24.332313", "validation_points": [ { "passed": true, @@ -602,16 +602,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') 为 '68'.", - "duration_seconds": 0.016222875099629164, - "timestamp": "2025-05-29T16:45:26.389095", + "message": "当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '19'.", + "duration_seconds": 0.014903625007718801, + "timestamp": "2025-06-05T13:18:24.347267", "validation_points": [ { "status_code": 200, "response_body": { - "code": 68, - "message": "esse ad consectetur", - "data": true + "code": 19, + "message": "sed cillum sit nulla", + "data": false }, "expected_http_status_codes": [ 400, @@ -628,9 +628,9 @@ "endpoint_id": "POST /api/dms/{dms_instance_code}/v1/cd_geo_unit", "endpoint_name": "地质单元数据添加", "overall_status": "失败", - "duration_seconds": 0.12343, - "start_time": "2025-05-29T16:45:26.389467", - "end_time": "2025-05-29T16:45:26.512897", + "duration_seconds": 0.11047, + "start_time": "2025-06-05T13:18:24.347330", + "end_time": "2025-06-05T13:18:24.457800", "executed_test_cases": [ { "test_case_id": "TC-STATUS-001", @@ -638,8 +638,8 @@ "test_case_severity": "严重", "status": "通过", "message": "响应状态码为 200,符合预期 200。", - "duration_seconds": 0.017961708130314946, - "timestamp": "2025-05-29T16:45:26.407964", + "duration_seconds": 0.014181334059685469, + "timestamp": "2025-06-05T13:18:24.361591", "validation_points": [ { "passed": true, @@ -653,8 +653,8 @@ "test_case_severity": "严重", "status": "通过", "message": "Schema验证步骤完成(未发现问题,或schema不适用/未为此响应定义)。", - "duration_seconds": 0.01862025004811585, - "timestamp": "2025-05-29T16:45:26.427163", + "duration_seconds": 0.01454712520353496, + "timestamp": "2025-06-05T13:18:24.376190", "validation_points": [ { "passed": true, @@ -668,8 +668,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.017223792150616646, - "timestamp": "2025-05-29T16:45:26.444548", + "duration_seconds": 0.013859666883945465, + "timestamp": "2025-06-05T13:18:24.390099", "validation_points": [ { "status_code": 200 @@ -682,8 +682,8 @@ "test_case_severity": "中", "status": "通过", "message": "跳过测试:在查询参数中未找到合适的字段来测试类型不匹配。", - "duration_seconds": 0.016695416998118162, - "timestamp": "2025-05-29T16:45:26.461439", + "duration_seconds": 0.015962708042934537, + "timestamp": "2025-06-05T13:18:24.406113", "validation_points": [ { "passed": true, @@ -696,16 +696,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') 为 '44'.", - "duration_seconds": 0.01606720802374184, - "timestamp": "2025-05-29T16:45:26.477669", + "message": "当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '73'.", + "duration_seconds": 0.015125166857615113, + "timestamp": "2025-06-05T13:18:24.421291", "validation_points": [ { "status_code": 200, "response_body": { - "code": 44, - "message": "enim cupidatat magna nulla", - "data": true + "code": 73, + "message": "ullamco ex", + "data": false }, "expected_http_status_codes": [ 400, @@ -721,16 +721,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') 为 '34'.", - "duration_seconds": 0.018121875124052167, - "timestamp": "2025-05-29T16:45:26.495933", + "message": "当移除必填请求体字段 'data.0.bsflag' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '72'.", + "duration_seconds": 0.01929962495341897, + "timestamp": "2025-06-05T13:18:24.440806", "validation_points": [ { "status_code": 200, "response_body": { - "code": 34, - "message": "do consequat elit", - "data": true + "code": 72, + "message": "dolore Excepteur", + "data": false }, "expected_http_status_codes": [ 400, @@ -747,8 +747,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。", - "duration_seconds": 0.016664458205923438, - "timestamp": "2025-05-29T16:45:26.512857", + "duration_seconds": 0.016721792053431273, + "timestamp": "2025-06-05T13:18:24.457695", "validation_points": [ { "passed": true, @@ -762,9 +762,9 @@ "endpoint_id": "GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}", "endpoint_name": "地质单元查询详情", "overall_status": "失败", - "duration_seconds": 0.108735, - "start_time": "2025-05-29T16:45:26.512925", - "end_time": "2025-05-29T16:45:26.621660", + "duration_seconds": 0.129312, + "start_time": "2025-06-05T13:18:24.457925", + "end_time": "2025-06-05T13:18:24.587237", "executed_test_cases": [ { "test_case_id": "TC-STATUS-001", @@ -772,8 +772,8 @@ "test_case_severity": "严重", "status": "通过", "message": "响应状态码为 200,符合预期 200。", - "duration_seconds": 0.020550667075440288, - "timestamp": "2025-05-29T16:45:26.533561", + "duration_seconds": 0.016316582914441824, + "timestamp": "2025-06-05T13:18:24.474562", "validation_points": [ { "passed": true, @@ -787,8 +787,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.014473499963060021, - "timestamp": "2025-05-29T16:45:26.548098", + "duration_seconds": 0.017227750038728118, + "timestamp": "2025-06-05T13:18:24.491939", "validation_points": [ { "passed": true, @@ -802,8 +802,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.013600457925349474, - "timestamp": "2025-05-29T16:45:26.561752", + "duration_seconds": 0.021245625102892518, + "timestamp": "2025-06-05T13:18:24.513427", "validation_points": [ { "status_code": 200 @@ -816,8 +816,8 @@ "test_case_severity": "中", "status": "通过", "message": "跳过测试:在查询参数中未找到合适的字段来测试类型不匹配。", - "duration_seconds": 0.013701542047783732, - "timestamp": "2025-05-29T16:45:26.575502", + "duration_seconds": 0.016599917085841298, + "timestamp": "2025-06-05T13:18:24.530175", "validation_points": [ { "passed": true, @@ -830,21 +830,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') 为 '70'.", - "duration_seconds": 0.016377917025238276, - "timestamp": "2025-05-29T16:45:26.591934", + "message": "当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '49'.", + "duration_seconds": 0.02165700006298721, + "timestamp": "2025-06-05T13:18:24.551889", "validation_points": [ { "status_code": 200, "response_body": { - "code": 70, - "message": "amet labore ex", + "code": 49, + "message": "officia ex non do dolore", "data": { - "total": 63, + "total": 38, "list": [ { - "dsid": "44", - "dataRegion": "eiusmod consequat irure Lorem do", + "dsid": "22", + "dataRegion": "do", "gasReleaseMon": null, "gasReleaseYear": null, "releaseGasCum": null @@ -867,8 +867,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。", - "duration_seconds": 0.013865916058421135, - "timestamp": "2025-05-29T16:45:26.605858", + "duration_seconds": 0.015388375148177147, + "timestamp": "2025-06-05T13:18:24.567343", "validation_points": [ { "passed": true, @@ -882,8 +882,8 @@ "test_case_severity": "高", "status": "通过", "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。", - "duration_seconds": 0.015692499931901693, - "timestamp": "2025-05-29T16:45:26.621611", + "duration_seconds": 0.019689790904521942, + "timestamp": "2025-06-05T13:18:24.587189", "validation_points": [ { "passed": true, @@ -893,5 +893,14 @@ } ] } - ] + ], + "stage_stats": { + "total_defined": 0, + "total_executed": 0, + "passed": 0, + "failed": 0, + "skipped": 0, + "success_rate_percentage": "0.00" + }, + "detailed_stage_results": [] } \ No newline at end of file diff --git a/test_reports/api_call_details.md b/test_reports/api_call_details.md new file mode 100644 index 0000000..cd1eb82 --- /dev/null +++ b/test_reports/api_call_details.md @@ -0,0 +1,3351 @@ +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +**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/message/push/example_schema/example_version +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +- **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.0502s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "310", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 20, + "message": "proident adipisicing non", + "data": { + "total": 23, + "list": [ + { + "dsid": "44", + "dataRegion": "adipisicing Lorem veniam", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "23", + "dataRegion": "nostrud reprehenderit", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +**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/message/push/example_schema/example_version +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +- **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.0233s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "255", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 60, + "message": "occaecat", + "data": { + "total": 41, + "list": [ + { + "dsid": "33", + "dataRegion": "ut", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "89", + "dataRegion": "aute", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +**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/message/push/example_schema/example_version +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +- **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.0172s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "299", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 87, + "message": "aliqua tempor", + "data": { + "total": 23, + "list": [ + { + "dsid": "65", + "dataRegion": "cupidatat quis velit", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "72", + "dataRegion": "eiusmod fugiat quis magna", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +**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/message/push/example_schema/example_version +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +- **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.0292s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "210", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 62, + "message": "reprehenderit occaecat laborum magna", + "data": { + "total": 45, + "list": [ + { + "dsid": "91", + "dataRegion": "cupidatat dolore sunt dolor", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +**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: 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 +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Body:** +```json +{ + "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": {} + } +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0193s` +- **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 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 49, + "message": "nulla sint", + "data": { + "total": 86, + "list": [ + { + "dsid": "54", + "dataRegion": "laboris minim tempor", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "1", + "dataRegion": "pariatur sed", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "100", + "dataRegion": "dolor", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `POST http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +**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/message/push/example_schema/example_version +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +- **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.0326s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "275", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 56, + "message": "in dolore", + "data": { + "total": 4, + "list": [ + { + "dsid": "75", + "dataRegion": "dolore aliqua dolore", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "58", + "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/message/push/example_schema/example_version` +**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/message/push/example_schema/example_version +``` +### Request Details +- **Method:** `POST` +- **Full URL:** `http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/message/push/example_schema/example_version` +- **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.0248s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "192", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 77, + "message": "aute pariatur consequat sint quis", + "data": { + "total": 82, + "list": [ + { + "dsid": "19", + "dataRegion": "do Excepteur", + "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.0168s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "175", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 15, + "message": "velit occaecat Ut", + "data": { + "total": 3, + "list": [ + { + "dsid": "39", + "dataRegion": "sit proident", + "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.0174s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "392", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 58, + "message": "nulla", + "data": { + "total": 70, + "list": [ + { + "dsid": "96", + "dataRegion": "esse ex ipsum", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "54", + "dataRegion": "esse eiusmod ea", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "29", + "dataRegion": "proident sunt tempor sit", + "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.0167s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "436", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 83, + "message": "nostrud consectetur adipisicing eu", + "data": { + "total": 45, + "list": [ + { + "dsid": "84", + "dataRegion": "dolore culpa exercitation consequat pariatur", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "95", + "dataRegion": "ad cillum non in velit", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "2", + "dataRegion": "ut", + "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=12345&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=12345&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=12345&pageSize=query_val_pageSize` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Query Parameters:** +```json +{ + "pageNo": 12345, + "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.0189s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "176", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 77, + "message": "Ut", + "data": { + "total": 22, + "list": [ + { + "dsid": "46", + "dataRegion": "elit commodo enim tempor in", + "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: 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' +``` +### 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": "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": {} + } +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0157s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "312", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 43, + "message": "qui mollit nisi consectetur in", + "data": { + "total": 39, + "list": [ + { + "dsid": "98", + "dataRegion": "commodo ad sed labore", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "28", + "dataRegion": "laborum exercitation", + "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.0203s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "279", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 95, + "message": "magna dolor enim ut", + "data": { + "total": 45, + "list": [ + { + "dsid": "31", + "dataRegion": "cillum ea est", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "14", + "dataRegion": "aliqua", + "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": "194", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 85, + "message": "fugiat commodo eiusmod", + "data": { + "total": 5, + "list": [ + { + "dsid": "92", + "dataRegion": "id veniam reprehenderit ut", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- +## `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.0143s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "47", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 32, + "message": "commodo sit", + "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.0158s` +- **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 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 35, + "message": "irure Excepteur fugiat", + "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.0137s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "47", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 77, + "message": "incididunt", + "data": false +} + ``` + +--- +## `PUT http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=12345` +**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=12345' +``` +### 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=12345` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Query Parameters:** +```json +{ + "id": 12345 +} + ``` +- **Body:** +```json +{ + "id": "example_string", + "version": "example_string" +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0131s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "65", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 6, + "message": "consequat fugiat Duis nostrud", + "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: 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' +``` +### 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": 12345, + "version": "example_string" +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0130s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "39", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 2, + "message": "non", + "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: 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' +``` +### 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 +{ + "version": "example_string" +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0158s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "13", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 4003 +} + ``` + +--- +## `PUT http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit` +**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 +``` +### 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` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Body:** +```json +{ + "id": "example_string", + "version": "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": "39", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 26, + "message": "in", + "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.0182s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "45", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 43, + "message": "consequat", + "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.0131s` +- **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 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 57, + "message": "laborum minim", + "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.0130s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "55", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 17, + "message": "dolore consectetur", + "data": false +} + ``` + +--- +## `DELETE http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit?id=12345` +**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=12345' +``` +### 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=12345` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Query Parameters:** +```json +{ + "id": 12345 +} + ``` +- **Body:** +```json +{ + "version": "example_string", + "data": [ + "example_string" + ] +} + ``` +### 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": "52", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 11, + "message": "et cillum irure", + "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: 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' +``` +### 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": 12345, + "data": [ + "example_string" + ] +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0150s` +- **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:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 80, + "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.0137s` +- **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:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 39, + "message": "commodo", + "data": true +} + ``` + +--- +## `DELETE http://127.0.0.1:4523/m1/6389742-6086420-default/api/dms/example_dms_instance_code/v1/cd_geo_unit` +**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 +``` +### 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` +- **Headers:** +```json +{ + "tenant-id": "header_val_tenant-id", + "Content-Type": "application/json", + "Accept": "application/json" +} + ``` +- **Body:** +```json +{ + "version": "example_string", + "data": [ + "example_string" + ] +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0174s` +- **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 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 63, + "message": "esse", + "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.0126s` +- **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 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 73, + "message": "ipsum Ut nisi", + "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.0143s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "74", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 82, + "message": "ullamco non Excepteur mollit consequat", + "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.0123s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "45", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 79, + "message": "occaecat", + "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.0151s` +- **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:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 61, + "message": "pariatur", + "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: 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 +``` +### 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": 12345, + "data": [ + { + "bsflag": 0.0, + "wellCommonName": "example_string", + "wellId": "example_string", + "dataRegion": "example_string" + } + ] +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0126s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "69", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 10, + "message": "anim laborum enim incididunt sed", + "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: 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 +``` +### 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": [ + { + "wellCommonName": "example_string", + "wellId": "example_string", + "dataRegion": "example_string" + } + ] +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0164s` +- **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:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 16, + "message": "aliqua", + "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.0146s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "56", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 46, + "message": "veniam dolor est sit", + "data": true +} + ``` + +--- +## `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.0137s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "418", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 47, + "message": "laborum", + "data": { + "total": 31, + "list": [ + { + "dsid": "45", + "dataRegion": "culpa commodo Ut aliqua", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "7", + "dataRegion": "labore voluptate", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "17", + "dataRegion": "veniam non commodo nostrud adipisicing", + "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.0145s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "172", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 40, + "message": "culpa aute consequat", + "data": { + "total": 66, + "list": [ + { + "dsid": "56", + "dataRegion": "velit", + "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.0130s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "311", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 52, + "message": "non exercitation", + "data": { + "total": 7, + "list": [ + { + "dsid": "12", + "dataRegion": "dolor Lorem sed magna pariatur", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "70", + "dataRegion": "tempor quis esse pariatur", + "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.0149s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "450", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 8, + "message": "magna qui velit anim consequat", + "data": { + "total": 55, + "list": [ + { + "dsid": "46", + "dataRegion": "adipisicing id mollit velit eiusmod", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "14", + "dataRegion": "voluptate ut velit consectetur officia", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "37", + "dataRegion": "qui voluptate", + "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: 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 +``` +### 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": "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": {} + } +} + ``` +### Response Details +- **Status Code:** `200` +- **Elapsed Time:** `0.0177s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "292", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 11, + "message": "ea dolor", + "data": { + "total": 54, + "list": [ + { + "dsid": "99", + "dataRegion": "Excepteur sunt veniam", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "32", + "dataRegion": "Lorem amet laboris non", + "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.0132s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "283", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 31, + "message": "adipisicing dolore", + "data": { + "total": 77, + "list": [ + { + "dsid": "80", + "dataRegion": "ipsum ea eu", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "36", + "dataRegion": "officia 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.0129s` +- **Headers:** +```json +{ + "Vary": "Origin", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "427", + "success": "false", + "Date": "Thu, 05 Jun 2025 07:17:29 GMT", + "Connection": "keep-alive", + "Keep-Alive": "timeout=5" +} + ``` +- **Body:** +```json +{ + "code": 63, + "message": "aliquip quis eu", + "data": { + "total": 24, + "list": [ + { + "dsid": "92", + "dataRegion": "reprehenderit nostrud est anim pariatur", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "93", + "dataRegion": "pariatur anim consectetur ad id", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "29", + "dataRegion": "laboris", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } +} + ``` + +--- \ No newline at end of file diff --git a/test_reports/summary.json b/test_reports/summary.json new file mode 100644 index 0000000..7db1f88 --- /dev/null +++ b/test_reports/summary.json @@ -0,0 +1,940 @@ +{ + "summary_metadata": { + "start_time": "2025-06-05T15:17:29.042083", + "end_time": "2025-06-05T15:17:29.908800", + "duration_seconds": "0.87" + }, + "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": [ + { + "endpoint_id": "POST /api/dms/{dms_instance_code}/v1/message/push/{schema}/{version}", + "endpoint_name": "数据推送接口", + "overall_status": "失败", + "duration_seconds": 0.213524, + "start_time": "2025-06-05T15:17:29.042420", + "end_time": "2025-06-05T15:17:29.255944", + "executed_test_cases": [ + { + "test_case_id": "TC-STATUS-001", + "test_case_name": "基本状态码 200 检查", + "test_case_severity": "严重", + "status": "通过", + "message": "响应状态码为 200,符合预期 200。", + "duration_seconds": 0.056339124916121364, + "timestamp": "2025-06-05T15:17:29.098841", + "validation_points": [ + { + "passed": true, + "message": "响应状态码为 200,符合预期 200。" + } + ] + }, + { + "test_case_id": "TC-CORE-FUNC-001", + "test_case_name": "Response Body JSON Schema Validation", + "test_case_severity": "严重", + "status": "通过", + "message": "Schema验证步骤完成(未发现问题,或schema不适用/未为此响应定义)。", + "duration_seconds": 0.024997208965942264, + "timestamp": "2025-06-05T15:17:29.123921", + "validation_points": [ + { + "passed": true, + "message": "Schema验证步骤完成(未发现问题,或schema不适用/未为此响应定义)。" + } + ] + }, + { + "test_case_id": "TC-SECURITY-001", + "test_case_name": "HTTPS Protocol Mandatory Verification", + "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.01876020897179842, + "timestamp": "2025-06-05T15:17:29.142762", + "validation_points": [ + { + "status_code": 200 + } + ] + }, + { + "test_case_id": "TC-ERROR-4001-QUERY", + "test_case_name": "Error Code 4001 - Query Parameter Type Mismatch Validation", + "test_case_severity": "中", + "status": "通过", + "message": "跳过测试:在查询参数中未找到合适的字段来测试类型不匹配。", + "duration_seconds": 0.030960749834775925, + "timestamp": "2025-06-05T15:17:29.173798", + "validation_points": [ + { + "passed": true, + "message": "跳过测试:在查询参数中未找到合适的字段来测试类型不匹配。" + } + ] + }, + { + "test_case_id": "TC-ERROR-4001-BODY", + "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", + "test_case_severity": "中", + "status": "失败", + "message": "当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '49'.", + "duration_seconds": 0.021089832996949553, + "timestamp": "2025-06-05T15:17:29.194950", + "validation_points": [ + { + "status_code": 200, + "response_body": { + "code": 49, + "message": "nulla sint", + "data": { + "total": 86, + "list": [ + { + "dsid": "54", + "dataRegion": "laboris minim tempor", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "1", + "dataRegion": "pariatur sed", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "100", + "dataRegion": "dolor", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } + }, + "expected_http_status_codes": [ + 400, + 422 + ], + "expected_business_code": "4001", + "mismatched_field": "body.isSearchCount" + } + ] + }, + { + "test_case_id": "TC-ERROR-4003-BODY", + "test_case_name": "Error Code 4003 - Missing Required Request Body Field Validation", + "test_case_severity": "高", + "status": "通过", + "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。", + "duration_seconds": 0.03394070896320045, + "timestamp": "2025-06-05T15:17:29.228943", + "validation_points": [ + { + "passed": true, + "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。" + } + ] + }, + { + "test_case_id": "TC-ERROR-4003-QUERY", + "test_case_name": "Error Code 4003 - Missing Required Query Parameter Validation", + "test_case_severity": "高", + "status": "通过", + "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。", + "duration_seconds": 0.02689095796085894, + "timestamp": "2025-06-05T15:17:29.255896", + "validation_points": [ + { + "passed": true, + "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。" + } + ] + } + ] + }, + { + "endpoint_id": "POST /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}", + "endpoint_name": "地质单元列表查询", + "overall_status": "失败", + "duration_seconds": 0.131725, + "start_time": "2025-06-05T15:17:29.255979", + "end_time": "2025-06-05T15:17:29.387704", + "executed_test_cases": [ + { + "test_case_id": "TC-STATUS-001", + "test_case_name": "基本状态码 200 检查", + "test_case_severity": "严重", + "status": "通过", + "message": "响应状态码为 200,符合预期 200。", + "duration_seconds": 0.018296750029549003, + "timestamp": "2025-06-05T15:17:29.274382", + "validation_points": [ + { + "passed": true, + "message": "响应状态码为 200,符合预期 200。" + } + ] + }, + { + "test_case_id": "TC-CORE-FUNC-001", + "test_case_name": "Response Body JSON Schema Validation", + "test_case_severity": "严重", + "status": "通过", + "message": "Schema验证步骤完成(未发现问题,或schema不适用/未为此响应定义)。", + "duration_seconds": 0.018849125131964684, + "timestamp": "2025-06-05T15:17:29.293302", + "validation_points": [ + { + "passed": true, + "message": "Schema验证步骤完成(未发现问题,或schema不适用/未为此响应定义)。" + } + ] + }, + { + "test_case_id": "TC-SECURITY-001", + "test_case_name": "HTTPS Protocol Mandatory Verification", + "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.018643459072336555, + "timestamp": "2025-06-05T15:17:29.312025", + "validation_points": [ + { + "status_code": 200 + } + ] + }, + { + "test_case_id": "TC-ERROR-4001-QUERY", + "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') 为 '77'.", + "duration_seconds": 0.020573334069922566, + "timestamp": "2025-06-05T15:17:29.332661", + "validation_points": [ + { + "status_code": 200, + "response_body": { + "code": 77, + "message": "Ut", + "data": { + "total": 22, + "list": [ + { + "dsid": "46", + "dataRegion": "elit commodo enim tempor in", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } + }, + "expected_http_status_codes": [ + 400, + 422 + ], + "expected_business_code": "4001", + "mismatched_param": "pageNo" + } + ] + }, + { + "test_case_id": "TC-ERROR-4001-BODY", + "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", + "test_case_severity": "中", + "status": "失败", + "message": "当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '43'.", + "duration_seconds": 0.01727504190057516, + "timestamp": "2025-06-05T15:17:29.349985", + "validation_points": [ + { + "status_code": 200, + "response_body": { + "code": 43, + "message": "qui mollit nisi consectetur in", + "data": { + "total": 39, + "list": [ + { + "dsid": "98", + "dataRegion": "commodo ad sed labore", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "28", + "dataRegion": "laborum exercitation", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } + }, + "expected_http_status_codes": [ + 400, + 422 + ], + "expected_business_code": "4001", + "mismatched_field": "body.isSearchCount" + } + ] + }, + { + "test_case_id": "TC-ERROR-4003-BODY", + "test_case_name": "Error Code 4003 - Missing Required Request Body Field Validation", + "test_case_severity": "高", + "status": "通过", + "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。", + "duration_seconds": 0.022129875142127275, + "timestamp": "2025-06-05T15:17:29.372171", + "validation_points": [ + { + "passed": true, + "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。" + } + ] + }, + { + "test_case_id": "TC-ERROR-4003-QUERY", + "test_case_name": "Error Code 4003 - Missing Required Query Parameter Validation", + "test_case_severity": "高", + "status": "通过", + "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。", + "duration_seconds": 0.015422499971464276, + "timestamp": "2025-06-05T15:17:29.387659", + "validation_points": [ + { + "passed": true, + "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。" + } + ] + } + ] + }, + { + "endpoint_id": "PUT /api/dms/{dms_instance_code}/v1/cd_geo_unit", + "endpoint_name": "地质单元数据修改", + "overall_status": "失败", + "duration_seconds": 0.107461, + "start_time": "2025-06-05T15:17:29.387737", + "end_time": "2025-06-05T15:17:29.495198", + "executed_test_cases": [ + { + "test_case_id": "TC-STATUS-001", + "test_case_name": "基本状态码 200 检查", + "test_case_severity": "严重", + "status": "通过", + "message": "响应状态码为 200,符合预期 200。", + "duration_seconds": 0.01535195903852582, + "timestamp": "2025-06-05T15:17:29.403179", + "validation_points": [ + { + "passed": true, + "message": "响应状态码为 200,符合预期 200。" + } + ] + }, + { + "test_case_id": "TC-CORE-FUNC-001", + "test_case_name": "Response Body JSON Schema Validation", + "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.018150458810850978, + "timestamp": "2025-06-05T15:17:29.421384", + "validation_points": [ + { + "passed": true, + "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." + } + ] + }, + { + "test_case_id": "TC-SECURITY-001", + "test_case_name": "HTTPS Protocol Mandatory Verification", + "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.014581916853785515, + "timestamp": "2025-06-05T15:17:29.436038", + "validation_points": [ + { + "status_code": 200 + } + ] + }, + { + "test_case_id": "TC-ERROR-4001-QUERY", + "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') 为 '6'.", + "duration_seconds": 0.014280792092904449, + "timestamp": "2025-06-05T15:17:29.450371", + "validation_points": [ + { + "status_code": 200, + "response_body": { + "code": 6, + "message": "consequat fugiat Duis nostrud", + "data": false + }, + "expected_http_status_codes": [ + 400, + 422 + ], + "expected_business_code": "4001", + "mismatched_param": "id" + } + ] + }, + { + "test_case_id": "TC-ERROR-4001-BODY", + "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", + "test_case_severity": "中", + "status": "失败", + "message": "当请求体字段 'id' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '2'.", + "duration_seconds": 0.014196124859154224, + "timestamp": "2025-06-05T15:17:29.464613", + "validation_points": [ + { + "status_code": 200, + "response_body": { + "code": 2, + "message": "non", + "data": false + }, + "expected_http_status_codes": [ + 400, + 422 + ], + "expected_business_code": "4001", + "mismatched_field": "body.id" + } + ] + }, + { + "test_case_id": "TC-ERROR-4003-BODY", + "test_case_name": "Error Code 4003 - Missing Required Request Body Field Validation", + "test_case_severity": "高", + "status": "通过", + "message": "当移除必填请求体字段 'id' 时,API响应了状态码 200 (非主要预期HTTP状态 [400, 422],但为4xx客户端错误), 且响应体中包含预期的业务错误码 '4003' (字段: 'code').", + "duration_seconds": 0.01675216620787978, + "timestamp": "2025-06-05T15:17:29.481407", + "validation_points": [ + { + "passed": true, + "message": "当移除必填请求体字段 'id' 时,API响应了状态码 200 (非主要预期HTTP状态 [400, 422],但为4xx客户端错误), 且响应体中包含预期的业务错误码 '4003' (字段: 'code')." + } + ] + }, + { + "test_case_id": "TC-ERROR-4003-QUERY", + "test_case_name": "Error Code 4003 - Missing Required Query Parameter Validation", + "test_case_severity": "高", + "status": "失败", + "message": "当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '26'.", + "duration_seconds": 0.01370533392764628, + "timestamp": "2025-06-05T15:17:29.495158", + "validation_points": [ + { + "status_code": 200, + "response_body": { + "code": 26, + "message": "in", + "data": false + }, + "expected_http_status_codes": [ + 400, + 422 + ], + "expected_business_code": "4003", + "removed_param": "query.id" + } + ] + } + ] + }, + { + "endpoint_id": "DELETE /api/dms/{dms_instance_code}/v1/cd_geo_unit", + "endpoint_name": "地质单元数据删除", + "overall_status": "失败", + "duration_seconds": 0.1148, + "start_time": "2025-06-05T15:17:29.495226", + "end_time": "2025-06-05T15:17:29.610026", + "executed_test_cases": [ + { + "test_case_id": "TC-STATUS-001", + "test_case_name": "基本状态码 200 检查", + "test_case_severity": "严重", + "status": "通过", + "message": "响应状态码为 200,符合预期 200。", + "duration_seconds": 0.0190741668920964, + "timestamp": "2025-06-05T15:17:29.514381", + "validation_points": [ + { + "passed": true, + "message": "响应状态码为 200,符合预期 200。" + } + ] + }, + { + "test_case_id": "TC-CORE-FUNC-001", + "test_case_name": "Response Body JSON Schema Validation", + "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.014373708050698042, + "timestamp": "2025-06-05T15:17:29.528807", + "validation_points": [ + { + "passed": true, + "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." + } + ] + }, + { + "test_case_id": "TC-SECURITY-001", + "test_case_name": "HTTPS Protocol Mandatory Verification", + "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.01420162501744926, + "timestamp": "2025-06-05T15:17:29.543058", + "validation_points": [ + { + "status_code": 200 + } + ] + }, + { + "test_case_id": "TC-ERROR-4001-QUERY", + "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') 为 '11'.", + "duration_seconds": 0.01511041703633964, + "timestamp": "2025-06-05T15:17:29.558213", + "validation_points": [ + { + "status_code": 200, + "response_body": { + "code": 11, + "message": "et cillum irure", + "data": false + }, + "expected_http_status_codes": [ + 400, + 422 + ], + "expected_business_code": "4001", + "mismatched_param": "id" + } + ] + }, + { + "test_case_id": "TC-ERROR-4001-BODY", + "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", + "test_case_severity": "中", + "status": "失败", + "message": "当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '80'.", + "duration_seconds": 0.016268166014924645, + "timestamp": "2025-06-05T15:17:29.574524", + "validation_points": [ + { + "status_code": 200, + "response_body": { + "code": 80, + "message": "laborum", + "data": true + }, + "expected_http_status_codes": [ + 400, + 422 + ], + "expected_business_code": "4001", + "mismatched_field": "body.version" + } + ] + }, + { + "test_case_id": "TC-ERROR-4003-BODY", + "test_case_name": "Error Code 4003 - Missing Required Request Body Field Validation", + "test_case_severity": "高", + "status": "通过", + "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。", + "duration_seconds": 0.015059833182021976, + "timestamp": "2025-06-05T15:17:29.589636", + "validation_points": [ + { + "passed": true, + "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。" + } + ] + }, + { + "test_case_id": "TC-ERROR-4003-QUERY", + "test_case_name": "Error Code 4003 - Missing Required Query Parameter Validation", + "test_case_severity": "高", + "status": "失败", + "message": "当移除必填查询参数 'id' 时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4003'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '63'.", + "duration_seconds": 0.020070707891136408, + "timestamp": "2025-06-05T15:17:29.609887", + "validation_points": [ + { + "status_code": 200, + "response_body": { + "code": 63, + "message": "esse", + "data": true + }, + "expected_http_status_codes": [ + 400, + 422 + ], + "expected_business_code": "4003", + "removed_param": "query.id" + } + ] + } + ] + }, + { + "endpoint_id": "POST /api/dms/{dms_instance_code}/v1/cd_geo_unit", + "endpoint_name": "地质单元数据添加", + "overall_status": "失败", + "duration_seconds": 0.120808, + "start_time": "2025-06-05T15:17:29.610139", + "end_time": "2025-06-05T15:17:29.730947", + "executed_test_cases": [ + { + "test_case_id": "TC-STATUS-001", + "test_case_name": "基本状态码 200 检查", + "test_case_severity": "严重", + "status": "通过", + "message": "响应状态码为 200,符合预期 200。", + "duration_seconds": 0.015151500003412366, + "timestamp": "2025-06-05T15:17:29.625592", + "validation_points": [ + { + "passed": true, + "message": "响应状态码为 200,符合预期 200。" + } + ] + }, + { + "test_case_id": "TC-CORE-FUNC-001", + "test_case_name": "Response Body JSON Schema Validation", + "test_case_severity": "严重", + "status": "通过", + "message": "Schema验证步骤完成(未发现问题,或schema不适用/未为此响应定义)。", + "duration_seconds": 0.016777874901890755, + "timestamp": "2025-06-05T15:17:29.642530", + "validation_points": [ + { + "passed": true, + "message": "Schema验证步骤完成(未发现问题,或schema不适用/未为此响应定义)。" + } + ] + }, + { + "test_case_id": "TC-SECURITY-001", + "test_case_name": "HTTPS Protocol Mandatory Verification", + "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.015054750023409724, + "timestamp": "2025-06-05T15:17:29.657759", + "validation_points": [ + { + "status_code": 200 + } + ] + }, + { + "test_case_id": "TC-ERROR-4001-QUERY", + "test_case_name": "Error Code 4001 - Query Parameter Type Mismatch Validation", + "test_case_severity": "中", + "status": "通过", + "message": "跳过测试:在查询参数中未找到合适的字段来测试类型不匹配。", + "duration_seconds": 0.018453167052939534, + "timestamp": "2025-06-05T15:17:29.676411", + "validation_points": [ + { + "passed": true, + "message": "跳过测试:在查询参数中未找到合适的字段来测试类型不匹配。" + } + ] + }, + { + "test_case_id": "TC-ERROR-4001-BODY", + "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", + "test_case_severity": "中", + "status": "失败", + "message": "当请求体字段 'version' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '10'.", + "duration_seconds": 0.01660362514667213, + "timestamp": "2025-06-05T15:17:29.693183", + "validation_points": [ + { + "status_code": 200, + "response_body": { + "code": 10, + "message": "anim laborum enim incididunt sed", + "data": false + }, + "expected_http_status_codes": [ + 400, + 422 + ], + "expected_business_code": "4001", + "mismatched_field": "body.version" + } + ] + }, + { + "test_case_id": "TC-ERROR-4003-BODY", + "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') 为 '16'.", + "duration_seconds": 0.020117375068366528, + "timestamp": "2025-06-05T15:17:29.713519", + "validation_points": [ + { + "status_code": 200, + "response_body": { + "code": 16, + "message": "aliqua", + "data": false + }, + "expected_http_status_codes": [ + 400, + 422 + ], + "expected_business_code": "4003", + "removed_field": "body.data.0.bsflag" + } + ] + }, + { + "test_case_id": "TC-ERROR-4003-QUERY", + "test_case_name": "Error Code 4003 - Missing Required Query Parameter Validation", + "test_case_severity": "高", + "status": "通过", + "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。", + "duration_seconds": 0.017241874942556024, + "timestamp": "2025-06-05T15:17:29.730904", + "validation_points": [ + { + "passed": true, + "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。" + } + ] + } + ] + }, + { + "endpoint_id": "GET /api/dms/{dms_instance_code}/v1/cd_geo_unit/{version}/{id}", + "endpoint_name": "地质单元查询详情", + "overall_status": "失败", + "duration_seconds": 0.111602, + "start_time": "2025-06-05T15:17:29.730976", + "end_time": "2025-06-05T15:17:29.842578", + "executed_test_cases": [ + { + "test_case_id": "TC-STATUS-001", + "test_case_name": "基本状态码 200 检查", + "test_case_severity": "严重", + "status": "通过", + "message": "响应状态码为 200,符合预期 200。", + "duration_seconds": 0.015448833117261529, + "timestamp": "2025-06-05T15:17:29.746516", + "validation_points": [ + { + "passed": true, + "message": "响应状态码为 200,符合预期 200。" + } + ] + }, + { + "test_case_id": "TC-CORE-FUNC-001", + "test_case_name": "Response Body JSON Schema Validation", + "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.01599195785820484, + "timestamp": "2025-06-05T15:17:29.762571", + "validation_points": [ + { + "passed": true, + "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." + } + ] + }, + { + "test_case_id": "TC-SECURITY-001", + "test_case_name": "HTTPS Protocol Mandatory Verification", + "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.014472666895017028, + "timestamp": "2025-06-05T15:17:29.777102", + "validation_points": [ + { + "status_code": 200 + } + ] + }, + { + "test_case_id": "TC-ERROR-4001-QUERY", + "test_case_name": "Error Code 4001 - Query Parameter Type Mismatch Validation", + "test_case_severity": "中", + "status": "通过", + "message": "跳过测试:在查询参数中未找到合适的字段来测试类型不匹配。", + "duration_seconds": 0.016666082898154855, + "timestamp": "2025-06-05T15:17:29.793836", + "validation_points": [ + { + "passed": true, + "message": "跳过测试:在查询参数中未找到合适的字段来测试类型不匹配。" + } + ] + }, + { + "test_case_id": "TC-ERROR-4001-BODY", + "test_case_name": "Error Code 4001 - Request Body Type Mismatch Validation", + "test_case_severity": "中", + "status": "失败", + "message": "当请求体字段 'isSearchCount' 类型不匹配时,期望API返回状态码在 [400, 422] 中,或返回4xx客户端错误且业务码为 '4001'. 实际收到状态码 200. 响应体中的业务码 ('code') 为 '11'.", + "duration_seconds": 0.019235124811530113, + "timestamp": "2025-06-05T15:17:29.813135", + "validation_points": [ + { + "status_code": 200, + "response_body": { + "code": 11, + "message": "ea dolor", + "data": { + "total": 54, + "list": [ + { + "dsid": "99", + "dataRegion": "Excepteur sunt veniam", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + }, + { + "dsid": "32", + "dataRegion": "Lorem amet laboris non", + "gasReleaseMon": null, + "gasReleaseYear": null, + "releaseGasCum": null + } + ] + } + }, + "expected_http_status_codes": [ + 400, + 422 + ], + "expected_business_code": "4001", + "mismatched_field": "body.isSearchCount" + } + ] + }, + { + "test_case_id": "TC-ERROR-4003-BODY", + "test_case_name": "Error Code 4003 - Missing Required Request Body Field Validation", + "test_case_severity": "高", + "status": "通过", + "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。", + "duration_seconds": 0.014753791969269514, + "timestamp": "2025-06-05T15:17:29.827943", + "validation_points": [ + { + "passed": true, + "message": "跳过测试:在API规范中未找到合适的必填请求体字段用于移除测试。" + } + ] + }, + { + "test_case_id": "TC-ERROR-4003-QUERY", + "test_case_name": "Error Code 4003 - Missing Required Query Parameter Validation", + "test_case_severity": "高", + "status": "通过", + "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。", + "duration_seconds": 0.014537167036905885, + "timestamp": "2025-06-05T15:17:29.842539", + "validation_points": [ + { + "passed": true, + "message": "跳过测试:在API规范中未找到合适的必填查询参数用于移除测试。" + } + ] + } + ] + } + ], + "stage_stats": { + "total_defined": 1, + "total_executed": 2, + "passed": 0, + "failed": 2, + "skipped": 0, + "success_rate_percentage": "0.00" + }, + "detailed_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": "公共分类", + "overall_status": "失败", + "duration_seconds": "0.03", + "start_time": "2025-06-05T15:17:29+0800", + "end_time": "2025-06-05T15:17:29+0800", + "message": "Stage aborted due to failure in step 'List and Find Created 地质单元'.", + "executed_steps_count": 0, + "executed_steps": [] + }, + { + "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:17:29+0800", + "end_time": "2025-06-05T15:17:29+0800", + "message": "Stage aborted due to failure in step 'List and Find Created 地质单元'.", + "executed_steps_count": 0, + "executed_steps": [] + } + ] +} \ No newline at end of file