本文目录导读:

我来为您生成一个通用的随机测试数据生成脚本,这个脚本支持多种数据类型和自定义配置。
import random
import string
import json
import csv
from datetime import datetime, timedelta
from typing import List, Dict, Any, Optional
class TestDataGenerator:
"""测试数据生成器"""
def __init__(self, seed: Optional[int] = None):
"""
初始化生成器
:param seed: 随机种子,用于可重复生成
"""
if seed is not None:
random.seed(seed)
self.seed = seed
def generate_random_string(self,
min_length: int = 5,
max_length: int = 20,
include_digits: bool = False,
include_special: bool = False) -> str:
"""生成随机字符串"""
characters = string.ascii_letters
if include_digits:
characters += string.digits
if include_special:
characters += string.punctuation
length = random.randint(min_length, max_length)
return ''.join(random.choice(characters) for _ in range(length))
def generate_random_email(self) -> str:
"""生成随机邮箱"""
username = self.generate_random_string(5, 15)
domains = ['gmail.com', 'yahoo.com', 'outlook.com', 'qq.com', '163.com']
domain = random.choice(domains)
return f"{username}@{domain}"
def generate_random_phone(self) -> str:
"""生成随机手机号(中国)"""
prefixes = ['130', '131', '132', '133', '134', '135', '136', '137', '138', '139',
'150', '151', '152', '153', '155', '156', '157', '158', '159',
'180', '181', '182', '183', '184', '185', '186', '187', '188', '189',
'199', '198', '197', '196']
prefix = random.choice(prefixes)
suffix = ''.join(random.choice(string.digits) for _ in range(8))
return prefix + suffix
def generate_random_date(self,
start_date: str = "2020-01-01",
end_date: str = "2024-12-31") -> str:
"""生成随机日期"""
start = datetime.strptime(start_date, "%Y-%m-%d")
end = datetime.strptime(end_date, "%Y-%m-%d")
delta = end - start
random_days = random.randint(0, delta.days)
random_date = start + timedelta(days=random_days)
return random_date.strftime("%Y-%m-%d")
def generate_random_address(self) -> Dict[str, str]:
"""生成随机地址"""
provinces = ['北京市', '上海市', '广东省', '浙江省', '江苏省']
cities = {
'北京市': ['东城区', '西城区', '朝阳区', '海淀区'],
'上海市': ['浦东新区', '黄浦区', '徐汇区', '静安区'],
'广东省': ['广州市', '深圳市', '佛山市', '东莞市'],
'浙江省': ['杭州市', '宁波市', '温州市', '嘉兴市'],
'江苏省': ['南京市', '苏州市', '无锡市', '常州市']
}
province = random.choice(provinces)
city = random.choice(cities[province])
streets = ['中山路', '人民路', '解放路', '建设路', '和平路']
street = random.choice(streets)
building = f"{random.randint(1, 100)}号"
apt = f"{random.randint(1, 30)}栋{random.randint(1, 6)}单元{random.randint(101, 3001)}室"
return {
"province": province,
"city": city,
"street": street + building,
"detail": apt,
"full_address": f"{province}{city}{street}{building}{apt}"
}
def generate_user(self) -> Dict[str, Any]:
"""生成随机用户"""
first_names_chinese = ['王', '李', '张', '刘', '陈', '杨', '黄', '赵', '周', '吴']
last_names_chinese = ['伟', '芳', '娜', '敏', '静', '丽', '强', '磊', '洋', '勇']
return {
"id": random.randint(10000, 99999),
"name": random.choice(first_names_chinese) + random.choice(last_names_chinese),
"age": random.randint(18, 65),
"email": self.generate_random_email(),
"phone": self.generate_random_phone(),
"gender": random.choice(['男', '女']),
"birthday": self.generate_random_date("1960-01-01", "2005-12-31"),
"address": self.generate_random_address(),
"salary": random.randint(5000, 50000),
"department": random.choice(['技术部', '市场部', '财务部', '人事部', '运营部']),
"is_active": random.choice([True, False]),
"created_at": self.generate_random_date("2023-01-01", "2024-06-30")
}
def generate_order(self) -> Dict[str, Any]:
"""生成随机订单"""
products = [
{'name': '笔记本电脑', 'price': 5999},
{'name': '智能手机', 'price': 3999},
{'name': '平板电脑', 'price': 2999},
{'name': '耳机', 'price': 199},
{'name': '键盘', 'price': 89},
{'name': '鼠标', 'price': 59},
{'name': '显示器', 'price': 1999},
{'name': '路由器', 'price': 299}
]
product = random.choice(products)
quantity = random.randint(1, 5)
status = random.choice(['pending', 'paid', 'shipped', 'delivered', 'cancelled'])
return {
"order_id": f"ORD{datetime.now().strftime('%Y%m%d')}{random.randint(1000, 9999)}",
"user_id": random.randint(10000, 99999),
"product": product['name'],
"unit_price": product['price'],
"quantity": quantity,
"total_amount": product['price'] * quantity,
"status": status,
"order_date": self.generate_random_date("2024-01-01", "2024-06-30"),
"payment_method": random.choice(['支付宝', '微信支付', '银行卡', '信用卡']),
"shipping_address": self.generate_random_address()['full_address']
}
def generate_users_batch(self, count: int = 10) -> List[Dict[str, Any]]:
"""批量生成用户数据"""
return [self.generate_user() for _ in range(count)]
def generate_orders_batch(self, count: int = 10) -> List[Dict[str, Any]]:
"""批量生成订单数据"""
return [self.generate_order() for _ in range(count)]
def save_to_json(self, data: List[Dict[str, Any]], filename: str):
"""保存为JSON文件"""
with open(filename, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print(f"数据已保存到 {filename}")
def save_to_csv(self, data: List[Dict[str, Any]], filename: str):
"""保存为CSV文件"""
if not data:
return
with open(filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=data[0].keys())
writer.writeheader()
writer.writerows(data)
print(f"数据已保存到 {filename}")
def save_to_sql(self, data: List[Dict[str, Any]], table_name: str, filename: str):
"""保存为SQL insert语句"""
with open(filename, 'w', encoding='utf-8') as f:
f.write(f"-- 插入 {len(data)} 条数据到 {table_name} 表\n")
for record in data:
columns = ', '.join(record.keys())
values = ', '.join([f"'{str(v)}'" if isinstance(v, str) else str(v) for v in record.values()])
sql = f"INSERT INTO {table_name} ({columns}) VALUES ({values});\n"
f.write(sql)
print(f"SQL语句已保存到 {filename}")
# 使用示例
def main():
# 创建生成器实例,设置种子以确保可重复性
generator = TestDataGenerator(seed=42)
# 生成用户数据
print("生成用户数据...")
users = generator.generate_users_batch(5)
for user in users:
print(f" 用户: {user['name']}, 邮箱: {user['email']}, 手机: {user['phone']}")
print("\n生成订单数据...")
orders = generator.generate_orders_batch(5)
for order in orders:
print(f" 订单: {order['order_id']}, 商品: {order['product']}, 金额: {order['total_amount']}元")
# 保存到不同格式
generator.save_to_json(users, "test_users.json")
generator.save_to_csv(users, "test_users.csv")
generator.save_to_sql(users, "users", "test_users.sql")
# 也可以生成单个自定义数据
print("\n自定义数据生成示例:")
print(f"随机字符串: {generator.generate_random_string(10, 30)}")
print(f"随机邮箱: {generator.generate_random_email()}")
print(f"随机日期: {generator.generate_random_date()}")
print(f"随机地址: {generator.generate_random_address()['full_address']}")
if __name__ == "__main__":
main()
这个脚本提供了以下功能:
主要特性
多种数据类型生成
- 随机字符串、邮箱、手机号
- 中国地址(省市区街道)
- 日期、人员信息
- 订单数据
批量生成
generate_users_batch()- 批量生成用户generate_orders_batch()- 批量生成订单
多种输出格式
- JSON
- CSV
- SQL INSERT语句
可配置性
- 可设置随机种子确保可重复
- 支持自定义数据范围
使用说明
# 基本使用
generator = TestDataGenerator(seed=42)
# 生成自定义数据
custom_data = {
"name": generator.generate_random_string(5, 10),
"email": generator.generate_random_email(),
"phone": generator.generate_random_phone(),
"date": generator.generate_random_date()
}
# 批量生成并保存
users = generator.generate_users_batch(100)
generator.save_to_json(users, "users.json")
扩展建议
- 添加更多数据类型:身份证号、银行卡号等
- 支持数据关联:如用户ID关联订单
- 配置化生成:通过YAML/JSON配置数据结构
- 性能优化:大批量生成时使用多线程
需要特定类型的数据或功能吗?我可以帮您定制。