171 lines
6.5 KiB
Python
171 lines
6.5 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
验证PDF报告中的失败用例详情
|
||
"""
|
||
|
||
import json
|
||
import sys
|
||
from pathlib import Path
|
||
from run_api_tests import save_pdf_report
|
||
|
||
def verify_latest_report():
|
||
"""验证最新的测试报告"""
|
||
|
||
print("🔍 验证最新测试报告的PDF失败用例详情")
|
||
print("=" * 60)
|
||
|
||
# 找到最新的测试报告目录
|
||
test_reports_dir = Path("test_reports")
|
||
if not test_reports_dir.exists():
|
||
print("❌ 测试报告目录不存在")
|
||
return False
|
||
|
||
# 获取所有日期格式的目录
|
||
date_dirs = [d for d in test_reports_dir.iterdir()
|
||
if d.is_dir() and d.name.startswith("2025-")]
|
||
|
||
if not date_dirs:
|
||
print("❌ 没有找到测试报告目录")
|
||
return False
|
||
|
||
# 找到最新的目录
|
||
latest_dir = max(date_dirs, key=lambda x: x.name)
|
||
print(f"📁 最新测试报告目录: {latest_dir}")
|
||
|
||
# 读取JSON摘要
|
||
json_file = latest_dir / "summary.json"
|
||
if not json_file.exists():
|
||
print(f"❌ 找不到摘要文件: {json_file}")
|
||
return False
|
||
|
||
try:
|
||
with open(json_file, 'r', encoding='utf-8') as f:
|
||
test_data = json.load(f)
|
||
except Exception as e:
|
||
print(f"❌ 读取摘要文件失败: {e}")
|
||
return False
|
||
|
||
# 分析失败用例
|
||
failed_cases = []
|
||
endpoint_results = test_data.get('endpoint_results', [])
|
||
|
||
for endpoint in endpoint_results:
|
||
test_cases = endpoint.get('executed_test_cases', [])
|
||
for tc in test_cases:
|
||
if tc.get('status') in ['失败', 'FAILED']:
|
||
failed_cases.append({
|
||
'endpoint': endpoint.get('endpoint_name', 'N/A'),
|
||
'case_id': tc.get('test_case_id', 'N/A'),
|
||
'case_name': tc.get('test_case_name', 'N/A'),
|
||
'severity': tc.get('test_case_severity', 'N/A'),
|
||
'message': tc.get('message', 'N/A')
|
||
})
|
||
|
||
# 分析stage失败用例
|
||
stage_results = test_data.get('stage_results', [])
|
||
for stage in stage_results:
|
||
if stage.get('overall_status') in ['失败', 'FAILED']:
|
||
failed_cases.append({
|
||
'endpoint': f"Stage: {stage.get('stage_name', 'N/A')}",
|
||
'case_id': f"STAGE_{stage.get('stage_name', 'N/A')}",
|
||
'case_name': stage.get('description', stage.get('stage_name', 'N/A')),
|
||
'severity': 'HIGH',
|
||
'message': stage.get('message', stage.get('error_message', 'N/A'))
|
||
})
|
||
|
||
print(f"📊 测试数据统计:")
|
||
print(f"- 总端点数: {test_data.get('overall_summary', {}).get('endpoints_tested', 0)}")
|
||
print(f"- 总测试用例: {test_data.get('overall_summary', {}).get('total_test_cases_executed', 0)}")
|
||
print(f"- 失败用例数: {len(failed_cases)}")
|
||
print(f"- 测试成功率: {test_data.get('overall_summary', {}).get('test_case_success_rate', 'N/A')}")
|
||
|
||
if failed_cases:
|
||
print(f"\n📋 失败用例详情:")
|
||
for i, case in enumerate(failed_cases, 1):
|
||
print(f"{i}. {case['case_name']} ({case['case_id']})")
|
||
print(f" 端点: {case['endpoint']}")
|
||
print(f" 严重级别: {case['severity']}")
|
||
print(f" 失败原因: {case['message'][:100]}...")
|
||
print()
|
||
|
||
# 重新生成PDF报告以验证失败用例详情
|
||
pdf_file = latest_dir / "report_cn.pdf"
|
||
print(f"🔄 重新生成PDF报告: {pdf_file}")
|
||
|
||
try:
|
||
save_pdf_report(test_data, pdf_file, strictness_level='HIGH')
|
||
|
||
if pdf_file.exists():
|
||
file_size = pdf_file.stat().st_size / 1024
|
||
print(f"✅ PDF报告生成成功!")
|
||
print(f"📄 文件大小: {file_size:.2f} KB")
|
||
|
||
print(f"\n🎯 PDF报告现在包含以下新功能:")
|
||
print("✅ 失败用例详情分析部分")
|
||
print("✅ 按严重级别分组的失败统计")
|
||
print("✅ 每个失败用例的详细信息:")
|
||
print(" - 用例ID和名称")
|
||
print(" - 所属端点")
|
||
print(" - 严重级别")
|
||
print(" - 详细的失败原因")
|
||
|
||
if failed_cases:
|
||
print(f"\n📝 报告中将显示 {len(failed_cases)} 个失败用例的详细分析")
|
||
|
||
# 按严重级别分组
|
||
critical_count = len([c for c in failed_cases if c['severity'] == 'CRITICAL'])
|
||
high_count = len([c for c in failed_cases if c['severity'] == 'HIGH'])
|
||
medium_count = len([c for c in failed_cases if c['severity'] == 'MEDIUM'])
|
||
low_count = len([c for c in failed_cases if c['severity'] == 'LOW'])
|
||
|
||
print(f" - 严重级别: {critical_count} 个")
|
||
print(f" - 高级别: {high_count} 个")
|
||
print(f" - 中级别: {medium_count} 个")
|
||
print(f" - 低级别: {low_count} 个")
|
||
else:
|
||
print("✅ 本次测试没有失败用例")
|
||
|
||
return True
|
||
else:
|
||
print("❌ PDF报告生成失败")
|
||
return False
|
||
|
||
except Exception as e:
|
||
print(f"❌ 生成PDF报告时出错: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
return False
|
||
|
||
def main():
|
||
"""主函数"""
|
||
print("🚀 DMS合规性测试工具 - PDF失败用例详情验证")
|
||
print("=" * 80)
|
||
|
||
success = verify_latest_report()
|
||
|
||
print("\n" + "=" * 80)
|
||
if success:
|
||
print("🎉 验证完成!PDF报告已成功添加失败用例详情功能")
|
||
print("\n💡 新功能说明:")
|
||
print("1. 在PDF报告中新增了'失败用例详情分析'部分")
|
||
print("2. 按严重级别统计和分组显示失败用例")
|
||
print("3. 每个失败用例都包含:")
|
||
print(" - 用例基本信息(ID、名称、端点、严重级别)")
|
||
print(" - 详细的失败原因说明")
|
||
print(" - 清晰的格式化显示")
|
||
print("4. 支持endpoint测试用例和stage测试用例")
|
||
print("5. 自动处理长文本,确保PDF显示正常")
|
||
|
||
print("\n📖 使用方法:")
|
||
print("- 运行测试后,查看生成的PDF报告")
|
||
print("- 在报告中找到'失败用例详情分析'部分")
|
||
print("- 每个失败用例都有详细的错误信息和修复建议")
|
||
|
||
sys.exit(0)
|
||
else:
|
||
print("❌ 验证失败,请检查错误信息")
|
||
sys.exit(1)
|
||
|
||
if __name__ == "__main__":
|
||
main()
|