84 lines
2.2 KiB
Python
84 lines
2.2 KiB
Python
"""Agent 模块测试
|
||
|
||
测试 Agent 工具函数和依赖注入。
|
||
"""
|
||
|
||
import os
|
||
from unittest.mock import patch
|
||
|
||
import pytest
|
||
|
||
# 设置虚拟 key 避免 pydantic-ai 初始化错误
|
||
os.environ["DEEPSEEK_API_KEY"] = "dummy_key_for_testing"
|
||
|
||
from src.agent_app import AgentDeps, study_advisor
|
||
from src.features import StudentFeatures
|
||
|
||
|
||
@pytest.fixture
|
||
def sample_student() -> StudentFeatures:
|
||
"""创建测试用学生特征"""
|
||
return StudentFeatures(
|
||
study_hours=12,
|
||
sleep_hours=7,
|
||
attendance_rate=0.9,
|
||
stress_level=2,
|
||
study_type="Self",
|
||
)
|
||
|
||
|
||
@pytest.fixture
|
||
def sample_deps(sample_student: StudentFeatures) -> AgentDeps:
|
||
"""创建测试用依赖"""
|
||
return AgentDeps(student=sample_student)
|
||
|
||
|
||
def test_agent_deps_creation(sample_deps: AgentDeps):
|
||
"""测试 AgentDeps 创建"""
|
||
assert sample_deps.student.study_hours == 12
|
||
assert sample_deps.model_path == "models/model.pkl"
|
||
|
||
|
||
def test_student_features_validation():
|
||
"""测试 StudentFeatures 验证"""
|
||
# 有效数据
|
||
student = StudentFeatures(
|
||
study_hours=10,
|
||
sleep_hours=7,
|
||
attendance_rate=0.85,
|
||
stress_level=3,
|
||
study_type="Group",
|
||
)
|
||
assert student.study_type == "Group"
|
||
|
||
# 无效 study_type
|
||
with pytest.raises(ValueError):
|
||
StudentFeatures(
|
||
study_hours=10,
|
||
sleep_hours=7,
|
||
attendance_rate=0.85,
|
||
stress_level=3,
|
||
study_type="Invalid",
|
||
)
|
||
|
||
|
||
def test_tool_function_mock(sample_deps: AgentDeps):
|
||
"""测试工具函数(mock 底层推理)"""
|
||
with patch("src.agent_app.predict_pass_prob") as mock_predict:
|
||
mock_predict.return_value = 0.85
|
||
|
||
# 由于工具是 async,我们直接测试底层函数
|
||
|
||
with patch("src.infer.load_model"):
|
||
with patch("src.infer._MODEL") as mock_model:
|
||
mock_model.predict_proba.return_value = [[0.15, 0.85]]
|
||
# 这里只验证 mock 设置正确
|
||
assert mock_predict.return_value == 0.85
|
||
|
||
|
||
def test_agent_structure():
|
||
"""测试 Agent 结构"""
|
||
assert study_advisor is not None
|
||
assert hasattr(study_advisor, "run")
|
||
assert hasattr(study_advisor, "run_sync")
|