#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 测试成就初始化功能 验证新用户注册和老用户登录时的成就初始化 """ import requests import json import time import random import string # 服务器配置 BASE_URL = "http://localhost:8080/api" def generate_random_username(): """生成随机用户名""" return 'test_user_' + ''.join(random.choices(string.ascii_lowercase + string.digits, k=8)) def test_new_user_registration(): """测试新用户注册时的成就初始化""" print("\n=== 测试新用户注册时的成就初始化 ===") # 生成随机用户名 username = generate_random_username() password = "test123" grade = "小学三年级" print(f"注册新用户: {username}") # 注册用户 register_data = { "username": username, "password": password, "grade": grade } try: response = requests.post(f"{BASE_URL}/users/register", json=register_data) print(f"注册响应状态: {response.status_code}") if response.status_code == 200: user_data = response.json() print(f"注册成功: {json.dumps(user_data, ensure_ascii=False, indent=2)}") user_id = user_data['data']['userId'] # 等待一下确保成就初始化完成 time.sleep(1) # 检查用户成就 achievements_response = requests.get(f"{BASE_URL}/achievements/user/{user_id}") print(f"\n获取成就响应状态: {achievements_response.status_code}") if achievements_response.status_code == 200: achievements = achievements_response.json() print(f"\n用户成就数量: {len(achievements)}") if achievements: print("\n成就列表:") for achievement in achievements: status = "已获得" if achievement.get('isAchieved') else "未获得" progress = achievement.get('currentValue', 0) target = achievement.get('targetValue', 0) print(f"- {achievement.get('title')}: {status} ({progress}/{target})") # 验证所有成就都是未获得状态 unachieved_count = sum(1 for a in achievements if not a.get('isAchieved')) print(f"\n未获得成就数量: {unachieved_count}/{len(achievements)}") if unachieved_count == len(achievements): print("✅ 新用户注册成就初始化测试通过 - 所有成就都是未获得状态") return True, user_data else: print("❌ 新用户注册成就初始化测试失败 - 存在已获得的成就") return False, user_data else: print("❌ 新用户注册成就初始化测试失败 - 没有找到任何成就") return False, user_data else: print(f"❌ 获取成就失败: {achievements_response.text}") return False, user_data else: print(f"❌ 注册失败: {response.text}") return False, None except Exception as e: print(f"❌ 测试过程中发生错误: {str(e)}") return False, None def test_existing_user_login(user_data): """测试已存在用户登录时的成就检查""" print("\n=== 测试已存在用户登录时的成就检查 ===") if not user_data: print("❌ 没有可用的用户数据进行测试") return False username = user_data['data']['username'] password = "test123" print(f"用户登录: {username}") # 用户登录 login_data = { "username": username, "password": password } try: response = requests.post(f"{BASE_URL}/users/login", json=login_data) print(f"登录响应状态: {response.status_code}") if response.status_code == 200: login_result = response.json() print(f"登录成功: {json.dumps(login_result, ensure_ascii=False, indent=2)}") user_id = login_result['data']['userId'] # 再次检查用户成就 achievements_response = requests.get(f"{BASE_URL}/achievements/user/{user_id}") print(f"\n获取成就响应状态: {achievements_response.status_code}") if achievements_response.status_code == 200: achievements = achievements_response.json() print(f"\n用户成就数量: {len(achievements)}") if achievements: unachieved_count = sum(1 for a in achievements if not a.get('isAchieved')) print(f"未获得成就数量: {unachieved_count}/{len(achievements)}") if len(achievements) > 0: print("✅ 用户登录成就检查测试通过 - 成就数据保持一致") return True else: print("❌ 用户登录成就检查测试失败 - 成就数据丢失") return False else: print("❌ 用户登录成就检查测试失败 - 没有找到任何成就") return False else: print(f"❌ 获取成就失败: {achievements_response.text}") return False else: print(f"❌ 登录失败: {response.text}") return False except Exception as e: print(f"❌ 测试过程中发生错误: {str(e)}") return False def test_achievement_types(): """测试成就类型和数量""" print("\n=== 测试成就类型和数量 ===") # 使用第一个测试用户 username = generate_random_username() password = "test123" grade = "小学五年级" # 注册用户 register_data = { "username": username, "password": password, "grade": grade } try: response = requests.post(f"{BASE_URL}/users/register", json=register_data) if response.status_code == 200: user_data = response.json() user_id = user_data['data']['userId'] time.sleep(1) # 等待成就初始化 # 获取成就 achievements_response = requests.get(f"{BASE_URL}/achievements/user/{user_id}") if achievements_response.status_code == 200: achievements = achievements_response.json() # 按类型分组统计 type_counts = {} for achievement in achievements: achievement_type = achievement.get('type', 'UNKNOWN') type_counts[achievement_type] = type_counts.get(achievement_type, 0) + 1 print(f"\n成就类型统计:") for achievement_type, count in type_counts.items(): print(f"- {achievement_type}: {count}个") expected_types = [ 'STUDY_TIME_1H', 'STUDY_TIME_10H', 'STUDY_TIME_50H', 'STUDY_TIME_100H', 'CONSECUTIVE_3D', 'CONSECUTIVE_7D', 'CONSECUTIVE_30D', 'GOAL_10', 'GOAL_50', 'ACCURACY_90', 'ACCURACY_100', 'EARLY_BIRD', 'NIGHT_OWL' ] missing_types = [t for t in expected_types if t not in type_counts] if missing_types: print(f"\n❌ 缺少的成就类型: {missing_types}") return False else: print(f"\n✅ 所有预期的成就类型都已创建") return True else: print(f"❌ 获取成就失败: {achievements_response.text}") return False else: print(f"❌ 注册失败: {response.text}") return False except Exception as e: print(f"❌ 测试过程中发生错误: {str(e)}") return False def main(): """主测试函数""" print("开始测试成就初始化功能...") # 测试1: 新用户注册 success1, user_data = test_new_user_registration() # 测试2: 用户登录 success2 = test_existing_user_login(user_data) # 测试3: 成就类型和数量 success3 = test_achievement_types() # 总结 print("\n" + "="*50) print("测试结果总结:") print(f"新用户注册成就初始化: {'✅ 通过' if success1 else '❌ 失败'}") print(f"用户登录成就检查: {'✅ 通过' if success2 else '❌ 失败'}") print(f"成就类型和数量验证: {'✅ 通过' if success3 else '❌ 失败'}") if success1 and success2 and success3: print("\n🎉 所有测试通过!成就初始化功能正常工作") else: print("\n⚠️ 部分测试失败,请检查相关功能") if __name__ == "__main__": main()