62 lines
1.8 KiB
Python
62 lines
1.8 KiB
Python
import importlib
|
||
import importlib.util
|
||
import sys
|
||
import os
|
||
import types
|
||
from pathlib import Path
|
||
|
||
import pytest
|
||
from fastapi import FastAPI
|
||
|
||
# 自动添加项目根目录到路径(处理项目结构)
|
||
PROJECT_ROOT = Path(__file__).resolve().parents[1]
|
||
sys.path.insert(0, str(PROJECT_ROOT))
|
||
|
||
|
||
def run_this_test(test_file):
|
||
"""自定义函数:运行单个测试文件(类似pytest)"""
|
||
# 提取测试文件名(无扩展名)
|
||
test_name = os.path.splitext(os.path.basename(test_file))[0]
|
||
# 使用pytest运行(自动处理导入)
|
||
pytest.main([test_file, "-v"])
|
||
|
||
|
||
def build_test_app(router, prefix: str = "") -> FastAPI:
|
||
app = FastAPI()
|
||
app.include_router(router, prefix=prefix)
|
||
return app
|
||
|
||
|
||
def load_module_from_path(module_name: str, relative_path: str):
|
||
module_path = PROJECT_ROOT / relative_path
|
||
spec = importlib.util.spec_from_file_location(module_name, module_path)
|
||
module = importlib.util.module_from_spec(spec)
|
||
assert spec and spec.loader
|
||
spec.loader.exec_module(module)
|
||
return module
|
||
|
||
|
||
def install_stub(monkeypatch, name: str, attrs: dict | None = None, package: bool = False):
|
||
module = types.ModuleType(name)
|
||
if package:
|
||
module.__path__ = []
|
||
if attrs:
|
||
for key, value in attrs.items():
|
||
setattr(module, key, value)
|
||
|
||
monkeypatch.setitem(sys.modules, name, module)
|
||
|
||
parent_name, _, child_name = name.rpartition(".")
|
||
if parent_name:
|
||
parent = sys.modules.get(parent_name)
|
||
if parent is None:
|
||
try:
|
||
parent = importlib.import_module(parent_name)
|
||
except Exception:
|
||
parent = types.ModuleType(parent_name)
|
||
parent.__path__ = []
|
||
monkeypatch.setitem(sys.modules, parent_name, parent)
|
||
setattr(parent, child_name, module)
|
||
|
||
return module
|