import sys from datetime import datetime from pathlib import Path from TestCore.email_sender import EmailSender from TestCore.report_generator import ReportGenerator from TestCore.result_parser import TestResultParser from TestCore.test_runner import TestRunner # 添加项目根目录到Python路径 sys.path.append(str(Path(__file__).parent)) from Config.Config import ALLURE_RESULTS_DIR, ALLURE_REPORT_DIR, REPORT_ARCHIVE_DIR from Utils.FileUtils import zip_directory, create_archive_filename, cleanup_old_archives from Utils.Log import log_for_api logger = log_for_api() class AllureReportSystem: """Allure测试报告系统主类""" def __init__(self): self.test_runner = TestRunner() self.report_generator = ReportGenerator() self.result_parser = TestResultParser(ALLURE_RESULTS_DIR) self.email_sender = EmailSender() # 报告信息 self.report_info = { "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S") } def run(self, send_email=True): """运行完整的测试报告流程""" logger.info("=" * 50) logger.info("开始执行自动化测试流程") logger.info("=" * 50) # 1. 运行测试 logger.info("步骤 1: 运行测试") returncode, stdout, stderr = self.test_runner.run_tests() if returncode not in [0, 1]: # 0: 全部通过, 1: 有失败用例 logger.error("测试执行失败,终止流程") return False # 2. 解析测试结果 logger.info("步骤 2: 解析测试结果") test_results = self.result_parser.parse_pytest_output(stdout) logger.info(f"测试结果: {test_results}") # 3. 生成Allure报告 logger.info("步骤 3: 生成Allure报告") if not self.report_generator.is_allure_available(): logger.error("Allure命令行工具不可用,跳过报告生成") else: report_generated = self.report_generator.generate_allure_report() if not report_generated: logger.error("生成Allure报告失败") # 4. 压缩报告 logger.info("步骤 4: 压缩报告") archive_filename = create_archive_filename() archive_path = REPORT_ARCHIVE_DIR / archive_filename zip_success = zip_directory(ALLURE_REPORT_DIR, archive_path) if not zip_success: logger.error("压缩报告失败") archive_path = None # 5. 发送邮件 if send_email and archive_path: logger.info("步骤 5: 发送邮件") email_sent = self.email_sender.send_email(test_results, self.report_info, str(archive_path)) if email_sent: logger.info("邮件发送成功") else: logger.error("邮件发送失败") # 6. 清理旧归档 logger.info("步骤 6: 清理旧归档") cleanup_old_archives(REPORT_ARCHIVE_DIR) logger.info("=" * 50) logger.info("自动化测试流程执行完成") logger.info("=" * 50) return True def main(): """主函数""" system = AllureReportSystem() success = system.run() sys.exit(0 if success else 1) if __name__ == "__main__": main()