run_tests.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. # 使得;linux环境可用
  2. #!/usr/bin/env python3
  3. """
  4. 自动化测试框架主入口
  5. 支持运行Web测试、API测试、性能测试、安全测试等
  6. """
  7. import argparse
  8. import time
  9. import sys
  10. from datetime import datetime
  11. from pathlib import Path
  12. # 添加项目根目录到Python路径
  13. project_root = Path(__file__).parent
  14. sys.path.append(str(project_root))
  15. from core.config.config_manager import ConfigManager
  16. from core.driver.driver_factory import DriverFactory
  17. from modules.database.db_client import DBClient
  18. from utils.report.report_generator import ReportGenerator
  19. from utils.report.email_notifier import EmailNotifier
  20. def run_web_tests():
  21. """运行Web测试"""
  22. print("运行Web测试...")
  23. # 这里可以使用pytest.main()或者自定义测试运行逻辑
  24. import subprocess
  25. result = subprocess.run([
  26. "pytest",
  27. "tests/web_tests/",
  28. "-v",
  29. "--alluredir=resources/reports/allure-results"
  30. ], capture_output=True, text=True)
  31. return parse_test_results(result)
  32. def run_api_tests():
  33. """运行API测试"""
  34. print("运行API测试...")
  35. import subprocess
  36. result = subprocess.run([
  37. "pytest",
  38. "tests/api_tests/",
  39. "-v",
  40. "--alluredir=resources/reports/allure-results"
  41. ], capture_output=True, text=True)
  42. return parse_test_results(result)
  43. def run_performance_tests():
  44. """运行性能测试"""
  45. print("运行性能测试...")
  46. from modules.performance.performance_tester import PerformanceTester
  47. tester = PerformanceTester()
  48. return tester.run_tests()
  49. def run_security_tests():
  50. """运行安全测试"""
  51. print("运行安全测试...")
  52. from modules.security.security_tester import SecurityTester
  53. tester = SecurityTester()
  54. return tester.run_tests()
  55. def run_database_tests():
  56. """运行数据库测试"""
  57. print("运行数据库测试...")
  58. import subprocess
  59. result = subprocess.run([
  60. "pytest",
  61. "tests/database_tests/",
  62. "-v",
  63. "--alluredir=resources/reports/allure-results"
  64. ], capture_output=True, text=True)
  65. return parse_test_results(result)
  66. def parse_test_results(pytest_result):
  67. """解析pytest测试结果"""
  68. # 这里需要根据实际测试结果格式进行解析
  69. # 简化实现,实际应用中应该使用pytest的插件或API获取详细结果
  70. return [
  71. {
  72. 'name': '示例测试',
  73. 'status': 'PASS' if pytest_result.returncode == 0 else 'FAIL',
  74. 'duration': 1.5,
  75. 'start_time': datetime.now().isoformat(),
  76. 'end_time': datetime.now().isoformat(),
  77. 'module': 'web'
  78. }
  79. ]
  80. def main():
  81. """主函数"""
  82. parser = argparse.ArgumentParser(description='自动化测试框架')
  83. parser.add_argument('--tests', nargs='+',
  84. choices=['web', 'api', 'performance', 'security', 'database', 'all'],
  85. default=['all'], help='选择要运行的测试类型')
  86. parser.add_argument('--report', choices=['html', 'json', 'excel', 'all'],
  87. default='all', help='选择报告格式')
  88. parser.add_argument('--email', action='store_true',
  89. help='是否发送邮件报告')
  90. parser.add_argument('--browser', choices=['chrome', 'firefox', 'edge'],
  91. help='指定浏览器类型')
  92. parser.add_argument('--headless', action='store_true',
  93. help='是否使用无头模式')
  94. args = parser.parse_args()
  95. # 初始化配置
  96. config = ConfigManager()
  97. # 设置浏览器参数
  98. if args.browser:
  99. os.environ['BROWSER'] = args.browser
  100. if args.headless:
  101. os.environ['HEADLESS'] = 'true'
  102. all_results = []
  103. start_time = time.time()
  104. try:
  105. # 执行选择的测试
  106. if 'all' in args.tests or 'web' in args.tests:
  107. all_results.extend(run_web_tests())
  108. if 'all' in args.tests or 'api' in args.tests:
  109. all_results.extend(run_api_tests())
  110. if 'all' in args.tests or 'performance' in args.tests:
  111. all_results.extend(run_performance_tests())
  112. if 'all' in args.tests or 'security' in args.tests:
  113. all_results.extend(run_security_tests())
  114. if 'all' in args.tests or 'database' in args.tests:
  115. all_results.extend(run_database_tests())
  116. # 生成报告
  117. report_generator = ReportGenerator()
  118. report_paths = []
  119. if args.report in ['html', 'all']:
  120. html_report = report_generator.generate_test_report(all_results, 'html')
  121. report_paths.append(html_report)
  122. if args.report in ['json', 'all']:
  123. json_report = report_generator.generate_test_report(all_results, 'json')
  124. report_paths.append(json_report)
  125. if args.report in ['excel', 'all']:
  126. excel_report = report_generator.generate_test_report(all_results, 'excel')
  127. report_paths.append(excel_report)
  128. # 发送邮件报告
  129. if args.email:
  130. report_generator.send_report_by_email(report_paths)
  131. # 生成Allure报告
  132. try:
  133. import subprocess
  134. subprocess.run([
  135. "allure", "generate",
  136. "resources/reports/allure-results",
  137. "-o", "resources/reports/allure-report",
  138. "--clean"
  139. ], check=True)
  140. print("Allure报告已生成: resources/reports/allure-report/index.html")
  141. except Exception as e:
  142. print(f"生成Allure报告失败: {e}")
  143. # 输出测试摘要
  144. execution_time = time.time() - start_time
  145. passed = sum(1 for r in all_results if r['status'] == 'PASS')
  146. failed = sum(1 for r in all_results if r['status'] == 'FAIL')
  147. success_rate = (passed / len(all_results)) * 100 if all_results else 0
  148. print("\n" + "=" * 50)
  149. print("测试执行完成!")
  150. print(f"总测试数: {len(all_results)}")
  151. print(f"通过: {passed}")
  152. print(f"失败: {failed}")
  153. print(f"通过率: {success_rate:.2f}%")
  154. print(f"总执行时间: {execution_time:.2f}秒")
  155. print("=" * 50)
  156. # 返回适当的退出代码
  157. sys.exit(failed)
  158. except Exception as e:
  159. print(f"测试执行过程中发生错误: {e}")
  160. sys.exit(1)
  161. finally:
  162. # 清理资源
  163. DriverFactory().quit_all_drivers()
  164. DBClient().close()
  165. if __name__ == "__main__":
  166. main()