Files
DP/tests/backend/test_stats.py
zuowei1216 1b19ff1b92 20251222
2025-12-22 21:06:29 +08:00

182 lines
5.4 KiB
Python

# -*- coding: utf-8 -*-
"""
统计API测试
测试数据统计功能
"""
import pytest
import requests
from conftest import API_BASE_URL, ADMIN_TOKEN
class TestTodayStats:
"""今日统计测试"""
def test_get_today_stats(self, admin_headers):
"""测试获取今日统计"""
response = requests.get(
f"{API_BASE_URL}/admin/stats/today",
headers=admin_headers
)
assert response.status_code == 200
result = response.json()
assert result['code'] == 200
data = result['data']
assert 'total_users' in data
assert 'checkin_count' in data
assert 'feature_usage_count' in data
assert 'vip_count' in data
# 验证数据类型
assert isinstance(data['total_users'], int)
assert isinstance(data['checkin_count'], int)
assert isinstance(data['feature_usage_count'], int)
assert isinstance(data['vip_count'], int)
# 验证数据合理性
assert data['total_users'] >= 0
assert data['checkin_count'] >= 0
assert data['checkin_count'] <= data['total_users']
def test_stats_unauthorized(self):
"""测试未授权访问统计"""
response = requests.get(f"{API_BASE_URL}/admin/stats/today")
assert response.status_code in [401, 422]
class TestFeatureUsageStats:
"""功能使用排行测试"""
def test_get_feature_usage_stats(self, admin_headers):
"""测试获取功能使用排行"""
response = requests.get(
f"{API_BASE_URL}/admin/stats/feature-usage",
params={'days': 7},
headers=admin_headers
)
assert response.status_code == 200
result = response.json()
assert result['code'] == 200
data = result['data']
assert isinstance(data, list)
# 如果有数据,验证结构
if len(data) > 0:
item = data[0]
assert 'feature_key' in item
assert 'feature_name' in item
assert 'usage_count' in item
assert isinstance(item['usage_count'], int)
def test_feature_usage_stats_different_days(self, admin_headers):
"""测试不同天数的统计"""
days_list = [7, 30, 90]
for days in days_list:
response = requests.get(
f"{API_BASE_URL}/admin/stats/feature-usage",
params={'days': days},
headers=admin_headers
)
assert response.status_code == 200
assert response.json()['code'] == 200
class TestPointsTrend:
"""积分趋势测试"""
def test_get_points_trend(self, admin_headers):
"""测试获取积分趋势"""
response = requests.get(
f"{API_BASE_URL}/admin/stats/points-trend",
params={'days': 7},
headers=admin_headers
)
assert response.status_code == 200
result = response.json()
assert result['code'] == 200
data = result['data']
assert isinstance(data, list)
# 如果有数据,验证结构
if len(data) > 0:
item = data[0]
assert 'date' in item
assert 'earned' in item
assert 'consumed' in item
# 验证数据类型
assert isinstance(item['earned'], (int, float, type(None)))
assert isinstance(item['consumed'], (int, float, type(None)))
def test_points_trend_date_format(self, admin_headers):
"""测试日期格式"""
response = requests.get(
f"{API_BASE_URL}/admin/stats/points-trend",
params={'days': 7},
headers=admin_headers
)
data = response.json()['data']
if len(data) > 0:
# 验证日期格式 (YYYY-MM-DD)
import re
date_pattern = r'^\d{4}-\d{2}-\d{2}$'
assert re.match(date_pattern, data[0]['date'])
class TestStatsIntegration:
"""统计集成测试"""
def test_stats_after_operations(self, test_user, test_feature, admin_headers, db_cursor):
"""测试操作后统计数据变化"""
# 获取操作前统计
response_before = requests.get(
f"{API_BASE_URL}/admin/stats/today",
headers=admin_headers
)
stats_before = response_before.json()['data']
# 执行签到
requests.post(
f"{API_BASE_URL}/checkin/daily",
json={'username': test_user['username']}
)
# 使用功能
requests.post(
f"{API_BASE_URL}/feature/use",
json={
'username': test_user['username'],
'feature_key': test_feature['feature_key'],
'device_id': 'test'
}
)
# 获取操作后统计
response_after = requests.get(
f"{API_BASE_URL}/admin/stats/today",
headers=admin_headers
)
stats_after = response_after.json()['data']
# 验证签到数增加
assert stats_after['checkin_count'] >= stats_before['checkin_count']
# 验证功能使用数增加
assert stats_after['feature_usage_count'] >= stats_before['feature_usage_count']
if __name__ == '__main__':
pytest.main([__file__, '-v'])