- 新增认证API测试,覆盖登录、权限验证、用户管理等关键流程 - 新增对话API测试,包含智能体调用、线程管理、工具获取及配置查询 - 新增系统API测试,涵盖系统健康检查、信息查询及配置管理权限控制 - 配置pytest支持异步测试、标记分类及详细输出 - 添加测试环境配置示例文件 .env.test.example - 新增测试用例README文档,说明测试架构及运行方法 - 优化Makefile,添加格式化差异检查任务 format_diff - 更新.gitignore,支持忽略测试环境配置文件 .env.test
85 lines
2.6 KiB
Python
85 lines
2.6 KiB
Python
"""
|
||
pytest配置文件和公共fixtures
|
||
提供测试环境配置和公共的测试工具
|
||
"""
|
||
|
||
import os
|
||
import pytest
|
||
import pytest_asyncio
|
||
import httpx
|
||
from collections.abc import AsyncGenerator
|
||
from dotenv import load_dotenv
|
||
|
||
# 加载测试环境变量
|
||
load_dotenv("test/.env.test")
|
||
|
||
# 测试配置
|
||
TEST_BASE_URL = os.getenv("TEST_BASE_URL", "http://localhost:5050")
|
||
TEST_USERNAME = os.getenv("TEST_USERNAME", "zwj")
|
||
TEST_PASSWORD = os.getenv("TEST_PASSWORD", "zwj12138")
|
||
|
||
|
||
@pytest_asyncio.fixture(scope="function")
|
||
async def test_client() -> AsyncGenerator[httpx.AsyncClient, None]:
|
||
"""创建异步HTTP客户端"""
|
||
timeout = httpx.Timeout(30.0, connect=5.0)
|
||
async with httpx.AsyncClient(base_url=TEST_BASE_URL, timeout=timeout, follow_redirects=True) as client:
|
||
yield client
|
||
|
||
|
||
@pytest_asyncio.fixture(scope="function")
|
||
async def auth_token(test_client: httpx.AsyncClient) -> str:
|
||
"""获取认证令牌用于需要认证的测试"""
|
||
try:
|
||
# 尝试登录获取token
|
||
login_data = {"username": TEST_USERNAME, "password": TEST_PASSWORD}
|
||
response = await test_client.post("/api/auth/token", data=login_data)
|
||
|
||
if response.status_code == 200:
|
||
data = response.json()
|
||
return data.get("access_token", "")
|
||
else:
|
||
# 如果登录失败,返回空token,某些测试可能不需要认证
|
||
print(f"Login failed with status {response.status_code}, continuing without auth token")
|
||
return ""
|
||
except Exception as e:
|
||
print(f"Auth setup failed: {e}, continuing without auth token")
|
||
return ""
|
||
|
||
|
||
@pytest_asyncio.fixture
|
||
async def auth_headers(auth_token: str) -> dict:
|
||
"""返回包含认证信息的headers"""
|
||
if auth_token:
|
||
return {"Authorization": f"Bearer {auth_token}"}
|
||
return {}
|
||
|
||
|
||
@pytest.fixture
|
||
def test_query():
|
||
"""测试用的简单查询"""
|
||
return "你好,这是一个测试查询"
|
||
|
||
|
||
@pytest.fixture
|
||
def test_chat_payload(test_query: str):
|
||
"""测试对话的请求负载"""
|
||
return {"query": test_query, "meta": {"test": True}}
|
||
|
||
|
||
# pytest配置选项
|
||
def pytest_configure(config):
|
||
"""pytest配置"""
|
||
config.addinivalue_line("markers", "auth: marks tests that require authentication")
|
||
config.addinivalue_line("markers", "slow: marks tests as slow")
|
||
config.addinivalue_line("markers", "integration: marks tests as integration tests")
|
||
|
||
|
||
# 设置异步模式
|
||
pytest_plugins = ["pytest_asyncio"]
|
||
|
||
# 测试标记
|
||
pytest.mark.auth = pytest.mark.auth
|
||
pytest.mark.slow = pytest.mark.slow
|
||
pytest.mark.integration = pytest.mark.integration
|