compliance/test_single_page.py
2025-08-19 14:44:57 +08:00

233 lines
7.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
测试单页模式功能的脚本
"""
import sys
import json
import logging
from pathlib import Path
# 添加项目路径
sys.path.insert(0, str(Path(__file__).parent))
from ddms_compliance_suite.input_parser.parser import InputParser
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
def test_single_page_mode():
"""测试单页模式功能"""
# 测试参数
domain_mapping_path = "./assets/doc/dms/domain.json" # 请根据实际路径调整
base_url = "https://www.dev.ideas.cnpc" # 请根据实际URL调整
parser = InputParser()
print("=== 测试单页模式 vs 全页模式 ===\n")
# 测试1: 单页模式 - 只获取第1页的1条记录
print("1. 测试单页模式 - 只获取第1页的1条记录")
try:
result = parser.parse_dms_spec(
domain_mapping_path=domain_mapping_path,
base_url=base_url,
ignore_ssl=True,
page_size=1,
page_no_start=1,
fetch_all_pages=False # 关键参数:只获取单页
)
if result and len(result) == 2:
parsed_spec, pagination_info = result
if parsed_spec:
print(f" ✓ 成功获取 {len(parsed_spec.endpoints)} 个API端点")
print(f" ✓ 分页信息: {pagination_info}")
print(f" ✓ 获取页数: {pagination_info.get('pages_fetched', 0)}")
print(f" ✓ 模式: {'单页' if not pagination_info.get('fetch_all_pages', True) else '全页'}")
else:
print(" ✗ 解析失败")
else:
print(" ✗ 返回格式错误")
except Exception as e:
print(f" ✗ 异常: {e}")
print("\n" + "-" * 50 + "\n")
# 测试2: 单页模式 - 获取第3页的5条记录
print("2. 测试单页模式 - 获取第3页的5条记录")
try:
result = parser.parse_dms_spec(
domain_mapping_path=domain_mapping_path,
base_url=base_url,
ignore_ssl=True,
page_size=5,
page_no_start=3,
fetch_all_pages=False # 只获取单页
)
if result and len(result) == 2:
parsed_spec, pagination_info = result
if parsed_spec:
print(f" ✓ 成功获取 {len(parsed_spec.endpoints)} 个API端点")
print(f" ✓ 起始页码: {pagination_info.get('page_no_start', 0)}")
print(f" ✓ 当前页码: {pagination_info.get('current_page', 0)}")
print(f" ✓ 获取页数: {pagination_info.get('pages_fetched', 0)}")
print(f" ✓ 模式: {'单页' if not pagination_info.get('fetch_all_pages', True) else '全页'}")
else:
print(" ✗ 解析失败")
else:
print(" ✗ 返回格式错误")
except Exception as e:
print(f" ✗ 异常: {e}")
print("\n" + "-" * 50 + "\n")
# 测试3: 全页模式对比 - 获取所有数据(小分页)
print("3. 测试全页模式对比 - 获取所有数据(分页大小=2")
try:
result = parser.parse_dms_spec(
domain_mapping_path=domain_mapping_path,
base_url=base_url,
ignore_ssl=True,
page_size=2,
page_no_start=1,
fetch_all_pages=True # 获取所有页面
)
if result and len(result) == 2:
parsed_spec, pagination_info = result
if parsed_spec:
print(f" ✓ 成功获取 {len(parsed_spec.endpoints)} 个API端点")
print(f" ✓ 总记录数: {pagination_info.get('total_records', 0)}")
print(f" ✓ 总页数: {pagination_info.get('total_pages', 0)}")
print(f" ✓ 获取页数: {pagination_info.get('pages_fetched', 0)}")
print(f" ✓ 模式: {'单页' if not pagination_info.get('fetch_all_pages', True) else '全页'}")
else:
print(" ✗ 解析失败")
else:
print(" ✗ 返回格式错误")
except Exception as e:
print(f" ✗ 异常: {e}")
def test_command_line_usage():
"""测试命令行使用方式"""
print("\n=== 命令行使用示例 ===\n")
print("1. 单页模式命令行示例:")
print(" python run_api_tests.py \\")
print(" --dms ./assets/doc/dms/domain.json \\")
print(" --base-url https://www.dev.ideas.cnpc \\")
print(" --page-size 5 \\")
print(" --page-no 3 \\")
print(" --fetch-single-page \\")
print(" --ignore-ssl")
print("\n2. 全页模式命令行示例:")
print(" python run_api_tests.py \\")
print(" --dms ./assets/doc/dms/domain.json \\")
print(" --base-url https://www.dev.ideas.cnpc \\")
print(" --page-size 1000 \\")
print(" --page-no 1 \\")
print(" --ignore-ssl")
print("\n3. FastAPI服务器示例:")
print(" # 单页模式")
print(" curl -X POST http://localhost:5051/run \\")
print(" -H 'Content-Type: application/json' \\")
print(" -d '{")
print(" \"dms\": \"./assets/doc/dms/domain.json\",")
print(" \"base_url\": \"https://www.dev.ideas.cnpc\",")
print(" \"page_size\": 5,")
print(" \"page_no\": 3,")
print(" \"fetch_all_pages\": false,")
print(" \"ignore_ssl\": true")
print(" }'")
print("\n # 全页模式")
print(" curl -X POST http://localhost:5051/run \\")
print(" -H 'Content-Type: application/json' \\")
print(" -d '{")
print(" \"dms\": \"./assets/doc/dms/domain.json\",")
print(" \"base_url\": \"https://www.dev.ideas.cnpc\",")
print(" \"page_size\": 1000,")
print(" \"page_no\": 1,")
print(" \"fetch_all_pages\": true")
print(" }'")
def test_use_cases():
"""测试不同使用场景"""
print("\n=== 使用场景说明 ===\n")
scenarios = [
{
"name": "快速测试",
"description": "只测试少量API验证系统功能",
"config": {
"page_size": 5,
"page_no": 1,
"fetch_all_pages": False
}
},
{
"name": "断点续传",
"description": "从中断的地方继续测试",
"config": {
"page_size": 100,
"page_no": 10,
"fetch_all_pages": False
}
},
{
"name": "内存受限环境",
"description": "分批处理大量API避免内存溢出",
"config": {
"page_size": 50,
"page_no": 1,
"fetch_all_pages": False
}
},
{
"name": "完整测试",
"description": "测试所有API生成完整报告",
"config": {
"page_size": 1000,
"page_no": 1,
"fetch_all_pages": True
}
}
]
for i, scenario in enumerate(scenarios, 1):
print(f"{i}. {scenario['name']}")
print(f" 描述: {scenario['description']}")
print(f" 配置: {scenario['config']}")
mode = "单页模式" if not scenario['config']['fetch_all_pages'] else "全页模式"
print(f" 模式: {mode}")
print()
if __name__ == "__main__":
logger.info("开始测试单页模式功能")
# 测试单页模式功能
test_single_page_mode()
# 显示命令行使用示例
test_command_line_usage()
# 显示使用场景
test_use_cases()
logger.info("测试完成")