batch_create_users.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. """
  2. 批量用户注册脚本
  3. 用于JMeter性能测试的用户数据准备,支持配置用户数量和并发批次
  4. 使用说明:
  5. python batch_create_users.py --count 1000 --batch-size 100 --output users.csv
  6. 参数说明:
  7. --count: 要创建的用户总数,默认1000
  8. --batch-size: 每批次插入的用户数,默认100
  9. --prefix: 用户名前缀,默认"testuser"
  10. --output: 输出文件路径,默认"test_users.csv"
  11. --password: 用户统一密码,默认"Test@123"
  12. """
  13. import sys
  14. import uuid
  15. import csv
  16. import argparse
  17. from datetime import date
  18. from pathlib import Path
  19. sys.path.insert(0, str(Path(__file__).parent.parent))
  20. from app.database import SessionLocal
  21. from app.models.user import User
  22. from app.services.auth_service import AuthService
  23. def generate_users(count: int, prefix: str = "testuser", password: str = "Test@123") -> list:
  24. """
  25. 生成用户数据列表
  26. Args:
  27. count: 用户数量
  28. prefix: 用户名前缀
  29. password: 用户密码
  30. Returns:
  31. list: 用户数据字典列表
  32. """
  33. users = []
  34. for i in range(count):
  35. user_id = str(uuid.uuid4())
  36. username = f"{prefix}{i:06d}"
  37. users.append({
  38. "id": user_id,
  39. "username": username,
  40. "password_hash": AuthService.hash_password(password),
  41. "nickname": f"测试用户{i + 1}",
  42. "email": f"{username}@test.com",
  43. "apikey": f"sk-test-{user_id[:8]}",
  44. "registration_date": date.today(),
  45. "status": "active"
  46. })
  47. return users
  48. def batch_insert_users(db, users: list, batch_size: int = 100) -> int:
  49. """
  50. 批量插入用户数据
  51. Args:
  52. db: 数据库会话
  53. users: 用户数据列表
  54. batch_size: 每批次插入数量
  55. Returns:
  56. int: 成功插入的用户数
  57. """
  58. total_inserted = 0
  59. total_batches = (len(users) + batch_size - 1) // batch_size
  60. for i in range(0, len(users), batch_size):
  61. batch = users[i:i + batch_size]
  62. db.bulk_insert_mappings(User, batch)
  63. db.commit()
  64. total_inserted += len(batch)
  65. if (i // batch_size + 1) % 10 == 0 or (i // batch_size + 1) == total_batches:
  66. print(f"已插入 {total_inserted}/{len(users)} 用户...")
  67. return total_inserted
  68. def write_output_file(users: list, output_path: str, password: str) -> None:
  69. """
  70. 将用户信息写入CSV文件
  71. Args:
  72. users: 用户数据列表
  73. output_path: 输出文件路径
  74. password: 用户密码
  75. """
  76. with open(output_path, 'w', newline='', encoding='utf-8') as f:
  77. writer = csv.writer(f)
  78. writer.writerow(['username', 'password', 'email', 'apikey', 'user_id'])
  79. for user in users:
  80. writer.writerow([
  81. user['username'],
  82. password,
  83. user['email'],
  84. user['apikey'],
  85. user['id']
  86. ])
  87. print(f"用户信息已写入: {output_path}")
  88. def main():
  89. parser = argparse.ArgumentParser(description="批量创建测试用户")
  90. parser.add_argument("--count", type=int, default=1000, help="要创建的用户总数")
  91. parser.add_argument("--batch-size", type=int, default=100, help="每批次插入的用户数")
  92. parser.add_argument("--prefix", type=str, default="testuser", help="用户名前缀")
  93. parser.add_argument("--output", type=str, default="test_users.csv", help="输出文件路径")
  94. parser.add_argument("--password", type=str, default="Test@123", help="用户统一密码")
  95. args = parser.parse_args()
  96. print(f"开始批量创建用户...")
  97. print(f" 用户总数: {args.count}")
  98. print(f" 批次大小: {args.batch_size}")
  99. print(f" 用户名前缀: {args.prefix}")
  100. print(f" 输出文件: {args.output}")
  101. db = SessionLocal()
  102. try:
  103. print("\n1. 生成用户数据...")
  104. users = generate_users(args.count, args.prefix, args.password)
  105. print(f" 已生成 {len(users)} 个用户数据")
  106. print("\n2. 批量插入数据库...")
  107. inserted = batch_insert_users(db, users, args.batch_size)
  108. print(f" 成功插入 {inserted} 个用户")
  109. print("\n3. 写入输出文件...")
  110. write_output_file(users, args.output, args.password)
  111. print("\n✅ 批量用户创建完成!")
  112. print(f" 建议JMeter并发数: {min(args.count, 200)} (可根据服务器配置调整)")
  113. print(f" 如需更高并发,建议分批创建,每批不超过5000用户")
  114. except Exception as e:
  115. print(f"\n❌ 执行失败: {e}")
  116. db.rollback()
  117. raise
  118. finally:
  119. db.close()
  120. if __name__ == "__main__":
  121. main()