用脚本生成随机测试数据

wen 实用脚本 3

本文目录导读:

用脚本生成随机测试数据

  1. 主要特性
  2. 使用说明
  3. 扩展建议

我来为您生成一个通用的随机测试数据生成脚本,这个脚本支持多种数据类型和自定义配置。

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")

扩展建议

  1. 添加更多数据类型:身份证号、银行卡号等
  2. 支持数据关联:如用户ID关联订单
  3. 配置化生成:通过YAML/JSON配置数据结构
  4. 性能优化:大批量生成时使用多线程

需要特定类型的数据或功能吗?我可以帮您定制。

抱歉,评论功能暂时关闭!