test_achievement_initialization.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 测试成就初始化功能
  5. 验证新用户注册和老用户登录时的成就初始化
  6. """
  7. import requests
  8. import json
  9. import time
  10. import random
  11. import string
  12. # 服务器配置
  13. BASE_URL = "http://localhost:8080/api"
  14. def generate_random_username():
  15. """生成随机用户名"""
  16. return 'test_user_' + ''.join(random.choices(string.ascii_lowercase + string.digits, k=8))
  17. def test_new_user_registration():
  18. """测试新用户注册时的成就初始化"""
  19. print("\n=== 测试新用户注册时的成就初始化 ===")
  20. # 生成随机用户名
  21. username = generate_random_username()
  22. password = "test123"
  23. grade = "小学三年级"
  24. print(f"注册新用户: {username}")
  25. # 注册用户
  26. register_data = {
  27. "username": username,
  28. "password": password,
  29. "grade": grade
  30. }
  31. try:
  32. response = requests.post(f"{BASE_URL}/users/register", json=register_data)
  33. print(f"注册响应状态: {response.status_code}")
  34. if response.status_code == 200:
  35. user_data = response.json()
  36. print(f"注册成功: {json.dumps(user_data, ensure_ascii=False, indent=2)}")
  37. user_id = user_data['data']['userId']
  38. # 等待一下确保成就初始化完成
  39. time.sleep(1)
  40. # 检查用户成就
  41. achievements_response = requests.get(f"{BASE_URL}/achievements/user/{user_id}")
  42. print(f"\n获取成就响应状态: {achievements_response.status_code}")
  43. if achievements_response.status_code == 200:
  44. achievements = achievements_response.json()
  45. print(f"\n用户成就数量: {len(achievements)}")
  46. if achievements:
  47. print("\n成就列表:")
  48. for achievement in achievements:
  49. status = "已获得" if achievement.get('isAchieved') else "未获得"
  50. progress = achievement.get('currentValue', 0)
  51. target = achievement.get('targetValue', 0)
  52. print(f"- {achievement.get('title')}: {status} ({progress}/{target})")
  53. # 验证所有成就都是未获得状态
  54. unachieved_count = sum(1 for a in achievements if not a.get('isAchieved'))
  55. print(f"\n未获得成就数量: {unachieved_count}/{len(achievements)}")
  56. if unachieved_count == len(achievements):
  57. print("✅ 新用户注册成就初始化测试通过 - 所有成就都是未获得状态")
  58. return True, user_data
  59. else:
  60. print("❌ 新用户注册成就初始化测试失败 - 存在已获得的成就")
  61. return False, user_data
  62. else:
  63. print("❌ 新用户注册成就初始化测试失败 - 没有找到任何成就")
  64. return False, user_data
  65. else:
  66. print(f"❌ 获取成就失败: {achievements_response.text}")
  67. return False, user_data
  68. else:
  69. print(f"❌ 注册失败: {response.text}")
  70. return False, None
  71. except Exception as e:
  72. print(f"❌ 测试过程中发生错误: {str(e)}")
  73. return False, None
  74. def test_existing_user_login(user_data):
  75. """测试已存在用户登录时的成就检查"""
  76. print("\n=== 测试已存在用户登录时的成就检查 ===")
  77. if not user_data:
  78. print("❌ 没有可用的用户数据进行测试")
  79. return False
  80. username = user_data['data']['username']
  81. password = "test123"
  82. print(f"用户登录: {username}")
  83. # 用户登录
  84. login_data = {
  85. "username": username,
  86. "password": password
  87. }
  88. try:
  89. response = requests.post(f"{BASE_URL}/users/login", json=login_data)
  90. print(f"登录响应状态: {response.status_code}")
  91. if response.status_code == 200:
  92. login_result = response.json()
  93. print(f"登录成功: {json.dumps(login_result, ensure_ascii=False, indent=2)}")
  94. user_id = login_result['data']['userId']
  95. # 再次检查用户成就
  96. achievements_response = requests.get(f"{BASE_URL}/achievements/user/{user_id}")
  97. print(f"\n获取成就响应状态: {achievements_response.status_code}")
  98. if achievements_response.status_code == 200:
  99. achievements = achievements_response.json()
  100. print(f"\n用户成就数量: {len(achievements)}")
  101. if achievements:
  102. unachieved_count = sum(1 for a in achievements if not a.get('isAchieved'))
  103. print(f"未获得成就数量: {unachieved_count}/{len(achievements)}")
  104. if len(achievements) > 0:
  105. print("✅ 用户登录成就检查测试通过 - 成就数据保持一致")
  106. return True
  107. else:
  108. print("❌ 用户登录成就检查测试失败 - 成就数据丢失")
  109. return False
  110. else:
  111. print("❌ 用户登录成就检查测试失败 - 没有找到任何成就")
  112. return False
  113. else:
  114. print(f"❌ 获取成就失败: {achievements_response.text}")
  115. return False
  116. else:
  117. print(f"❌ 登录失败: {response.text}")
  118. return False
  119. except Exception as e:
  120. print(f"❌ 测试过程中发生错误: {str(e)}")
  121. return False
  122. def test_achievement_types():
  123. """测试成就类型和数量"""
  124. print("\n=== 测试成就类型和数量 ===")
  125. # 使用第一个测试用户
  126. username = generate_random_username()
  127. password = "test123"
  128. grade = "小学五年级"
  129. # 注册用户
  130. register_data = {
  131. "username": username,
  132. "password": password,
  133. "grade": grade
  134. }
  135. try:
  136. response = requests.post(f"{BASE_URL}/users/register", json=register_data)
  137. if response.status_code == 200:
  138. user_data = response.json()
  139. user_id = user_data['data']['userId']
  140. time.sleep(1) # 等待成就初始化
  141. # 获取成就
  142. achievements_response = requests.get(f"{BASE_URL}/achievements/user/{user_id}")
  143. if achievements_response.status_code == 200:
  144. achievements = achievements_response.json()
  145. # 按类型分组统计
  146. type_counts = {}
  147. for achievement in achievements:
  148. achievement_type = achievement.get('type', 'UNKNOWN')
  149. type_counts[achievement_type] = type_counts.get(achievement_type, 0) + 1
  150. print(f"\n成就类型统计:")
  151. for achievement_type, count in type_counts.items():
  152. print(f"- {achievement_type}: {count}个")
  153. expected_types = [
  154. 'STUDY_TIME_1H', 'STUDY_TIME_10H', 'STUDY_TIME_50H', 'STUDY_TIME_100H',
  155. 'CONSECUTIVE_3D', 'CONSECUTIVE_7D', 'CONSECUTIVE_30D',
  156. 'GOAL_10', 'GOAL_50',
  157. 'ACCURACY_90', 'ACCURACY_100',
  158. 'EARLY_BIRD', 'NIGHT_OWL'
  159. ]
  160. missing_types = [t for t in expected_types if t not in type_counts]
  161. if missing_types:
  162. print(f"\n❌ 缺少的成就类型: {missing_types}")
  163. return False
  164. else:
  165. print(f"\n✅ 所有预期的成就类型都已创建")
  166. return True
  167. else:
  168. print(f"❌ 获取成就失败: {achievements_response.text}")
  169. return False
  170. else:
  171. print(f"❌ 注册失败: {response.text}")
  172. return False
  173. except Exception as e:
  174. print(f"❌ 测试过程中发生错误: {str(e)}")
  175. return False
  176. def main():
  177. """主测试函数"""
  178. print("开始测试成就初始化功能...")
  179. # 测试1: 新用户注册
  180. success1, user_data = test_new_user_registration()
  181. # 测试2: 用户登录
  182. success2 = test_existing_user_login(user_data)
  183. # 测试3: 成就类型和数量
  184. success3 = test_achievement_types()
  185. # 总结
  186. print("\n" + "="*50)
  187. print("测试结果总结:")
  188. print(f"新用户注册成就初始化: {'✅ 通过' if success1 else '❌ 失败'}")
  189. print(f"用户登录成就检查: {'✅ 通过' if success2 else '❌ 失败'}")
  190. print(f"成就类型和数量验证: {'✅ 通过' if success3 else '❌ 失败'}")
  191. if success1 and success2 and success3:
  192. print("\n🎉 所有测试通过!成就初始化功能正常工作")
  193. else:
  194. print("\n⚠️ 部分测试失败,请检查相关功能")
  195. if __name__ == "__main__":
  196. main()