conftest.py•8.32 kB
"""
pytest配置文件 - 设置测试环境和Mock依赖
基于专家指导,在测试环境中模拟重型依赖,避免级联导入问题
"""
import sys
import types
import os
def setup_mock_dependencies():
"""设置Mock依赖,避免重型依赖导入"""
# Mock transformers模块
if "transformers" not in sys.modules:
transformers_mock = types.ModuleType("transformers")
class MockAutoTokenizer:
@staticmethod
def from_pretrained(*args, **kwargs):
return MockTokenizer()
class MockTokenizer:
def encode(self, text):
return [1, 2, 3]
def decode(self, tokens):
return "mock decoded text"
class MockAutoModelForCausalLM:
@staticmethod
def from_pretrained(*args, **kwargs):
return MockModel()
class MockModel:
def generate(self, *args, **kwargs):
return [[1, 2, 3]]
class MockLogitsProcessorList:
def __init__(self, *args, **kwargs):
pass
class MockStoppingCriteriaList:
def __init__(self, *args, **kwargs):
pass
class MockGenerationConfig:
def __init__(self, *args, **kwargs):
pass
class MockBitsAndBytesConfig:
def __init__(self, *args, **kwargs):
pass
class MockDynamicCache:
def __init__(self, *args, **kwargs):
pass
class MockTemperatureLogitsWarper:
def __init__(self, *args, **kwargs):
pass
class MockTopKLogitsWarper:
def __init__(self, *args, **kwargs):
pass
class MockTopPLogitsWarper:
def __init__(self, *args, **kwargs):
pass
class MockRepetitionPenaltyLogitsProcessor:
def __init__(self, *args, **kwargs):
pass
class MockEosTokenCriteria:
def __init__(self, *args, **kwargs):
pass
class MockMaxLengthCriteria:
def __init__(self, *args, **kwargs):
pass
# 设置所有需要的transformers组件
transformers_mock.AutoTokenizer = MockAutoTokenizer
transformers_mock.AutoModelForCausalLM = MockAutoModelForCausalLM
transformers_mock.LogitsProcessorList = MockLogitsProcessorList
transformers_mock.StoppingCriteriaList = MockStoppingCriteriaList
transformers_mock.GenerationConfig = MockGenerationConfig
transformers_mock.BitsAndBytesConfig = MockBitsAndBytesConfig
transformers_mock.DynamicCache = MockDynamicCache
transformers_mock.TemperatureLogitsWarper = MockTemperatureLogitsWarper
transformers_mock.TopKLogitsWarper = MockTopKLogitsWarper
transformers_mock.TopPLogitsWarper = MockTopPLogitsWarper
transformers_mock.RepetitionPenaltyLogitsProcessor = MockRepetitionPenaltyLogitsProcessor
transformers_mock.EosTokenCriteria = MockEosTokenCriteria
transformers_mock.MaxLengthCriteria = MockMaxLengthCriteria
sys.modules["transformers"] = transformers_mock
# Mock ollama模块
if "ollama" not in sys.modules:
ollama_mock = types.ModuleType("ollama")
class MockClient:
def __init__(self, *args, **kwargs):
pass
def list(self):
return {"models": []}
def embeddings(self, *args, **kwargs):
return {"embedding": [0.0] * 1024}
def chat(self, *args, **kwargs):
return {"message": {"content": "Mock response"}}
ollama_mock.Client = MockClient
sys.modules["ollama"] = ollama_mock
# Mock neo4j模块
if "neo4j" not in sys.modules:
neo4j_mock = types.ModuleType("neo4j")
class MockGraphDatabase:
@staticmethod
def driver(*args, **kwargs):
return MockDriver()
class MockDriver:
def session(self):
return MockSession()
def close(self):
pass
class MockSession:
def run(self, *args, **kwargs):
return MockResult()
def close(self):
pass
class MockResult:
def data(self):
return []
neo4j_mock.GraphDatabase = MockGraphDatabase
sys.modules["neo4j"] = neo4j_mock
# Mock qdrant_client模块
if "qdrant_client" not in sys.modules:
qdrant_mock = types.ModuleType("qdrant_client")
class MockQdrantClient:
def __init__(self, *args, **kwargs):
pass
def search(self, *args, **kwargs):
return []
def upsert(self, *args, **kwargs):
return True
qdrant_mock.QdrantClient = MockQdrantClient
sys.modules["qdrant_client"] = qdrant_mock
# Mock redis模块
if "redis" not in sys.modules:
redis_mock = types.ModuleType("redis")
class MockRedis:
def __init__(self, *args, **kwargs):
pass
def get(self, key):
return None
def set(self, key, value):
return True
def delete(self, key):
return True
def exists(self, key):
return False
redis_mock.Redis = MockRedis
sys.modules["redis"] = redis_mock
# Mock openai模块
if "openai" not in sys.modules:
openai_mock = types.ModuleType("openai")
class MockOpenAI:
def __init__(self, *args, **kwargs):
pass
openai_mock.OpenAI = MockOpenAI
sys.modules["openai"] = openai_mock
# Mock chonkie模块
if "chonkie" not in sys.modules:
chonkie_mock = types.ModuleType("chonkie")
class MockSentenceChunker:
def __init__(self, *args, **kwargs):
pass
def chunk(self, text):
return text.split('.')
chonkie_mock.SentenceChunker = MockSentenceChunker
sys.modules["chonkie"] = chonkie_mock
# Mock sklearn模块
if "sklearn" not in sys.modules:
sklearn_mock = types.ModuleType("sklearn")
# Mock sklearn.cluster
cluster_mock = types.ModuleType("sklearn.cluster")
class MockMiniBatchKMeans:
def __init__(self, *args, **kwargs):
pass
def fit(self, data):
return self
def predict(self, data):
return [0] * len(data)
cluster_mock.MiniBatchKMeans = MockMiniBatchKMeans
sklearn_mock.cluster = cluster_mock
sys.modules["sklearn"] = sklearn_mock
sys.modules["sklearn.cluster"] = cluster_mock
# 在模块导入时自动设置Mock依赖
setup_mock_dependencies()
# 设置环境变量 - 专家指导的MINIMAL模式
os.environ["MEMOS_MINIMAL_MODE"] = "1"
os.environ["MEMOS_LITE_MODE"] = "true"
os.environ["MEMOS_SKIP_HEALTH_CHECK"] = "true"
print("🧪 Mock依赖环境已自动设置 - MINIMAL模式启用")
# 以下是pytest相关配置,仅在使用pytest时生效
try:
import pytest
@pytest.fixture(scope="session", autouse=True)
def setup_test_environment():
"""设置测试环境"""
print("🧪 pytest测试环境已设置")
yield
print("🧪 pytest测试环境清理完成")
@pytest.fixture
def temp_data_dir(tmp_path):
"""创建临时数据目录"""
return str(tmp_path)
# 测试标记定义
def pytest_configure(config):
"""配置pytest标记"""
config.addinivalue_line(
"markers", "unit: 单元测试,不需要外部依赖"
)
config.addinivalue_line(
"markers", "integration: 集成测试,需要外部依赖"
)
config.addinivalue_line(
"markers", "e2e: 端到端测试,需要完整环境"
)
except ImportError:
# pytest未安装时跳过相关配置
pass