compliance/verify_pdf_failures.py
2025-08-07 17:14:40 +08:00

171 lines
6.5 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
"""
验证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()