test_runner.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import subprocess
  2. import sys
  3. from pathlib import Path
  4. from Config.Config import TESTS_DIR, ALLURE_RESULTS_DIR
  5. from Utils.Log import log_for_api
  6. logger = log_for_api()
  7. class TestRunner:
  8. """测试运行器"""
  9. def __init__(self, tests_dir=None, results_dir=None):
  10. self.tests_dir = Path(tests_dir) if tests_dir else TESTS_DIR
  11. self.results_dir = Path(results_dir) if results_dir else ALLURE_RESULTS_DIR
  12. # 确保目录存在
  13. self.results_dir.mkdir(parents=True, exist_ok=True)
  14. def run_tests(self, additional_args=None):
  15. """运行测试套件"""
  16. if additional_args is None:
  17. additional_args = []
  18. # 构建pytest命令
  19. pytest_cmd = [
  20. sys.executable, "-m", "pytest",
  21. str(self.tests_dir),
  22. f"--alluredir={self.results_dir}",
  23. "--clean-alluredir",
  24. "-v"
  25. ] + additional_args
  26. logger.info(f"运行测试命令: {' '.join(pytest_cmd)}")
  27. # 执行测试
  28. try:
  29. process = subprocess.Popen(
  30. pytest_cmd,
  31. stdout=subprocess.PIPE,
  32. stderr=subprocess.PIPE,
  33. universal_newlines=True,
  34. encoding='utf-8',
  35. errors='replace'
  36. )
  37. stdout, stderr = process.communicate()
  38. # 记录输出
  39. if stdout:
  40. logger.info(f"测试输出:\n{stdout}")
  41. if stderr:
  42. logger.error(f"测试错误:\n{stderr}")
  43. return process.returncode, stdout, stderr
  44. except Exception as e:
  45. logger.error(f"运行测试时发生异常: {e}")
  46. return -1, "", str(e)