import subprocess import sys from pathlib import Path from Config.Config import TESTS_DIR, ALLURE_RESULTS_DIR from Utils.Log import log_for_api logger = log_for_api() class TestRunner: """测试运行器""" def __init__(self, tests_dir=None, results_dir=None): self.tests_dir = Path(tests_dir) if tests_dir else TESTS_DIR self.results_dir = Path(results_dir) if results_dir else ALLURE_RESULTS_DIR # 确保目录存在 self.results_dir.mkdir(parents=True, exist_ok=True) def run_tests(self, additional_args=None): """运行测试套件""" if additional_args is None: additional_args = [] # 构建pytest命令 pytest_cmd = [ sys.executable, "-m", "pytest", str(self.tests_dir), f"--alluredir={self.results_dir}", "--clean-alluredir", "-v" ] + additional_args logger.info(f"运行测试命令: {' '.join(pytest_cmd)}") # 执行测试 try: process = subprocess.Popen( pytest_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, encoding='utf-8', errors='replace' ) stdout, stderr = process.communicate() # 记录输出 if stdout: logger.info(f"测试输出:\n{stdout}") if stderr: logger.error(f"测试错误:\n{stderr}") return process.returncode, stdout, stderr except Exception as e: logger.error(f"运行测试时发生异常: {e}") return -1, "", str(e)