Run.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import sys
  2. from datetime import datetime
  3. from pathlib import Path
  4. from TestCore.email_sender import EmailSender
  5. from TestCore.report_generator import ReportGenerator
  6. from TestCore.result_parser import TestResultParser
  7. from TestCore.test_runner import TestRunner
  8. # 添加项目根目录到Python路径
  9. sys.path.append(str(Path(__file__).parent))
  10. from Config.Config import ALLURE_RESULTS_DIR, ALLURE_REPORT_DIR, REPORT_ARCHIVE_DIR
  11. from Utils.FileUtils import zip_directory, create_archive_filename, cleanup_old_archives
  12. from Utils.Log import log_for_api
  13. logger = log_for_api()
  14. class AllureReportSystem:
  15. """Allure测试报告系统主类"""
  16. def __init__(self):
  17. self.test_runner = TestRunner()
  18. self.report_generator = ReportGenerator()
  19. self.result_parser = TestResultParser(ALLURE_RESULTS_DIR)
  20. self.email_sender = EmailSender()
  21. # 报告信息
  22. self.report_info = {
  23. "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  24. }
  25. def run(self, send_email=True):
  26. """运行完整的测试报告流程"""
  27. logger.info("=" * 50)
  28. logger.info("开始执行自动化测试流程")
  29. logger.info("=" * 50)
  30. # 1. 运行测试
  31. logger.info("步骤 1: 运行测试")
  32. returncode, stdout, stderr = self.test_runner.run_tests()
  33. if returncode not in [0, 1]: # 0: 全部通过, 1: 有失败用例
  34. logger.error("测试执行失败,终止流程")
  35. return False
  36. # 2. 解析测试结果
  37. logger.info("步骤 2: 解析测试结果")
  38. test_results = self.result_parser.parse_pytest_output(stdout)
  39. logger.info(f"测试结果: {test_results}")
  40. # 3. 生成Allure报告
  41. logger.info("步骤 3: 生成Allure报告")
  42. if not self.report_generator.is_allure_available():
  43. logger.error("Allure命令行工具不可用,跳过报告生成")
  44. else:
  45. report_generated = self.report_generator.generate_allure_report()
  46. if not report_generated:
  47. logger.error("生成Allure报告失败")
  48. # 4. 压缩报告
  49. logger.info("步骤 4: 压缩报告")
  50. archive_filename = create_archive_filename()
  51. archive_path = REPORT_ARCHIVE_DIR / archive_filename
  52. zip_success = zip_directory(ALLURE_REPORT_DIR, archive_path)
  53. if not zip_success:
  54. logger.error("压缩报告失败")
  55. archive_path = None
  56. # 5. 发送邮件
  57. if send_email and archive_path:
  58. logger.info("步骤 5: 发送邮件")
  59. email_sent = self.email_sender.send_email(test_results, self.report_info, str(archive_path))
  60. if email_sent:
  61. logger.info("邮件发送成功")
  62. else:
  63. logger.error("邮件发送失败")
  64. # 6. 清理旧归档
  65. logger.info("步骤 6: 清理旧归档")
  66. cleanup_old_archives(REPORT_ARCHIVE_DIR)
  67. logger.info("=" * 50)
  68. logger.info("自动化测试流程执行完成")
  69. logger.info("=" * 50)
  70. return True
  71. def main():
  72. """主函数"""
  73. system = AllureReportSystem()
  74. success = system.run()
  75. sys.exit(0 if success else 1)
  76. if __name__ == "__main__":
  77. main()