import subprocess from pathlib import Path from Config.Config import ALLURE_RESULTS_DIR, ALLURE_REPORT_DIR from Utils.Log import log_for_api logger = log_for_api() class ReportGenerator: """报告生成器""" def __init__(self, results_dir=None, report_dir=None): self.results_dir = Path(results_dir) if results_dir else ALLURE_RESULTS_DIR self.report_dir = Path(report_dir) if report_dir else ALLURE_REPORT_DIR # 确保目录存在 self.report_dir.mkdir(parents=True, exist_ok=True) def generate_allure_report(self): """生成Allure报告""" # 构建Allure命令 allure_cmd = [ "allure", "generate", str(self.results_dir), "-o", str(self.report_dir), "--clean" ] logger.info(f"生成Allure报告命令: {' '.join(allure_cmd)}") # 执行命令 try: process = subprocess.Popen( allure_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, encoding='utf-8', errors='replace' ) stdout, stderr = process.communicate() # 记录输出 if stdout: logger.info(f"Allure输出:\n{stdout}") if stderr: logger.error(f"Allure错误:\n{stderr}") return process.returncode == 0 except Exception as e: logger.error(f"生成Allure报告时发生异常: {e}") return False def is_allure_available(self): """检查Allure命令行工具是否可用""" try: process = subprocess.Popen( ["allure", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE ) process.communicate() return process.returncode == 0 except: return False