写一个测试数据生成器(告别手搓数据)

手工造数据的痛点,你一定懂

做接口测试、数据库测试或者性能测试的时候,最烦人的事之一就是——造数据。

比如你要测试一个注册接口,需要100条用户数据,每条包含用户名、手机号、邮箱、身份证号、地址……

手工造?先想名字、再编手机号、再编邮箱……造到第10条你就开始重复了,到第30条已经开始复制粘贴改个数字了。

还有更头疼的:

  • 手机号格式要对,不能瞎编
  • 身份证号要符合校验规则
  • 邮箱格式要正确
  • 地址要像真的
  • 数量要够,还不能重复

每次造数据都是30分钟起步,造完发现格式不对还得重来。

今天这篇文章,教你用Python写一个测试数据生成器。从最简单的版本开始,一步步升级,最后做出一个支持JSON、CSV、Excel、SQL多格式输出的完整工具。


一、认识Faker库:造假数据的瑞士军刀

Python有一个专门用来生成假数据的库——Faker

它能生成几十种类型的假数据:姓名、手机号、邮箱、地址、身份证、公司名、银行卡号、URL、日期时间、MAC地址、UA字符串……基本上你能想到的,它都能生成。

而且支持中文!生成的数据看起来像真的,但不是真的个人信息,不存在隐私风险。

安装:

pip install faker

快速上手

先来个最简单的例子,感受一下Faker的威力:

from faker import Faker

fake = Faker()

# 生成一个假名字
print(fake.name())

# 生成一个假邮箱
print(fake.email())

# 生成一个假电话
print(fake.phone_number())

运行一下,你会看到类似这样的输出:

张三
john.smith@example.com
13812345678

每次运行都会生成不同的数据。

常用数据类型速查表

数据类型方法示例
姓名fake.name()张三
邮箱fake.email()john@example.com
电话fake.phone_number()13812345678
地址fake.address()北京市朝阳区xxx
公司名fake.company()阿里巴巴
用户名fake.user_name()john_smith
密码fake.password()aB3$xYz9
日期fake.date()2023-05-15
IP地址fake.ipv4()192.168.1.1
URLfake.url()https://example.com

小贴士: Faker支持多国语言。如果你想生成中文数据,初始化时加上语言参数:

fake = Faker('zh_CN')  # 中文

🛠️ 第二部分:写一个基础版数据生成器

现在我们来写第一个真正有用的工具——基础版数据生成器

需求分析

假设我们要为一个用户管理系统生成测试数据,每条数据包含:

  • 用户ID
  • 姓名
  • 邮箱
  • 电话
  • 注册日期
  • 账户状态

代码实现

from faker import Faker
import json

fake = Faker('zh_CN')

defgenerate_users(count=10):
"""生成指定数量的用户数据"""
    users = []
for i inrange(1, count + 1):
        user = {
'id': i,
'name': fake.name(),
'email': fake.email(),
'phone': fake.phone_number(),
'register_date': str(fake.date_between(start_date='-2y')),
'status': fake.random_element(['active', 'inactive', 'suspended'])
        }
        users.append(user)
return users

# 生成100条用户数据
users = generate_users(100)

# 打印前3条看看效果
for user in users[:3]:
print(user)

运行效果

{'id': 1, 'name': '王小明', 'email': 'wang@example.com', 'phone': '13812345678', 'register_date': '2024-01-15', 'status': 'active'}
{'id': 2, 'name': '李四', 'email': 'li@example.com', 'phone': '13912345679', 'register_date': '2023-11-20', 'status': 'inactive'}
{'id': 3, 'name': '张三', 'email': 'zhang@example.com', 'phone': '13712345680', 'register_date': '2024-02-10', 'status': 'active'}

看,3条完全不同的用户数据,一秒钟就生成了!


🚀 第三部分:升级版数据生成器(多格式输出)

基础版虽然好用,但只能输出Python字典。实际工作中,我们需要多种格式

  • JSON格式:给API测试用
  • CSV格式:给Excel导入用
  • SQL格式:直接插入数据库

现在我们升级一下,写一个支持多格式输出的完整类

from faker import Faker
import json
import csv
from datetime import datetime

fake = Faker('zh_CN')

classTestDataGenerator:
"""测试数据生成器 - 支持多格式输出"""

def__init__(self, count=100):
self.count = count
self.users = self._generate_users()

def_generate_users(self):
"""内部方法:生成用户数据"""
        users = []
for i inrange(1, self.count + 1):
            user = {
'id': i,
'name': fake.name(),
'email': fake.email(),
'phone': fake.phone_number(),
'register_date': str(fake.date_between(start_date='-2y')),
'status': fake.random_element(['active', 'inactive', 'suspended']),
'age': fake.random_int(min=18, max=65)
            }
            users.append(user)
return users

defto_json(self, filename='users.json'):
"""导出为JSON格式"""
withopen(filename, 'w', encoding='utf-8') as f:
            json.dump(self.users, f, ensure_ascii=False, indent=2)
print(f"✓ JSON文件已生成:{filename}")

defto_csv(self, filename='users.csv'):
"""导出为CSV格式"""
ifnotself.users:
return

        keys = self.users[0].keys()
withopen(filename, 'w', newline='', encoding='utf-8') as f:
            writer = csv.DictWriter(f, fieldnames=keys)
            writer.writeheader()
            writer.writerows(self.users)
print(f"✓ CSV文件已生成:{filename}")

defto_sql(self, filename='users.sql', table_name='users'):
"""导出为SQL格式"""
withopen(filename, 'w', encoding='utf-8') as f:
for user inself.users:
                values = ', '.join([
str(user['id']),
f"'{user['name']}'",
f"'{user['email']}'",
f"'{user['phone']}'",
f"'{user['register_date']}'",
f"'{user['status']}'",
str(user['age'])
                ])
                sql = f"INSERT INTO {table_name} (id, name, email, phone, register_date, status, age) VALUES ({values});\n"
                f.write(sql)
print(f"✓ SQL文件已生成:{filename}")

defpreview(self, count=5):
"""预览前N条数据"""
print(f"\n📋 预览前{count}条数据:\n")
for user inself.users[:count]:
print(user)

# 使用示例
if __name__ == '__main__':
# 生成500条数据
    generator = TestDataGenerator(count=500)

# 预览前3条
    generator.preview(3)

# 导出为三种格式
    generator.to_json('test_users.json')
    generator.to_csv('test_users.csv')
    generator.to_sql('test_users.sql')

运行效果

📋 预览前3条数据:

{'id': 1, 'name': '王小明', 'email': 'wang@example.com', 'phone': '13812345678', 'register_date': '2024-01-15', 'status': 'active', 'age': 28}
{'id': 2, 'name': '李四', 'email': 'li@example.com', 'phone': '13912345679', 'register_date': '2023-11-20', 'status': 'inactive', 'age': 35}
{'id': 3, 'name': '张三', 'email': 'zhang@example.com', 'phone': '13712345680', 'register_date': '2024-02-10', 'status': 'active', 'age': 42}

✓ JSON文件已生成:test_users.json
✓ CSV文件已生成:test_users.csv
✓ SQL文件已生成:test_users.sql

一行代码,三种格式全搞定!


🎯 第四部分:进阶用法

1️⃣ 生成Excel数据

有时候产品经理要的就是Excel文件。我们可以用openpyxl库来生成:

pip install openpyxl
from openpyxl import Workbook

defto_excel(self, filename='users.xlsx'):
"""导出为Excel格式"""
    wb = Workbook()
    ws = wb.active
    ws.title = "Users"

# 写入表头
    headers = list(self.users[0].keys())
    ws.append(headers)

# 写入数据
for user inself.users:
        ws.append(list(user.values()))

    wb.save(filename)
print(f"✓ Excel文件已生成:{filename}")

2️⃣ 生成关联数据

实际项目中,数据往往有关联关系。比如订单表需要关联用户ID。我们可以这样做:

defgenerate_orders(self, orders_per_user=5):
"""为每个用户生成订单数据"""
    orders = []
    order_id = 1

for user inself.users:
for _ inrange(orders_per_user):
            order = {
'order_id': order_id,
'user_id': user['id'],
'amount': fake.random_int(min=100, max=10000),
'order_date': str(fake.date_between(start_date='-1y')),
'status': fake.random_element(['pending', 'completed', 'cancelled'])
            }
            orders.append(order)
            order_id += 1

return orders

3️⃣ 自定义字段生成

有时候Faker没有你需要的字段类型,可以自己定义:

defgenerate_custom_data(self):
"""生成自定义字段"""
# 自定义VIP等级
    vip_levels = ['普通', '银牌', '金牌', '钻石']

# 自定义标签
    tags = ['活跃用户', '沉睡用户', '新用户', '高价值用户']

for user inself.users:
        user['vip_level'] = fake.random_element(vip_levels)
        user['tags'] = fake.random_elements(tags, length=2, unique=True)

returnself.users

💼 第五部分:实际项目应用场景

场景1:API接口测试

# 生成1000条用户数据用于压力测试
generator = TestDataGenerator(count=1000)
generator.to_json('api_test_data.json')

# 然后用Python requests库批量发送
import requests
import json

withopen('api_test_data.json', 'r') as f:
    users = json.load(f)

for user in users:
    response = requests.post('http://api.example.com/users', json=user)
print(f"User {user['id']}: {response.status_code}")

场景2:数据库初始化

# 生成SQL脚本,直接导入数据库
generator = TestDataGenerator(count=5000)
generator.to_sql('init_data.sql', table_name='t_user')

# 然后在数据库执行
# mysql> source init_data.sql;

场景3:UI自动化测试

# 生成测试账号数据
generator = TestDataGenerator(count=100)

for user in generator.users:
# 使用Selenium进行自动化测试
    driver.find_element_by_id('username').send_keys(user['name'])
    driver.find_element_by_id('email').send_keys(user['email'])
    driver.find_element_by_id('phone').send_keys(user['phone'])
    driver.find_element_by_id('submit').click()

场景4:性能测试

# 生成大量数据用于性能基准测试
generator = TestDataGenerator(count=100000)
generator.to_csv('performance_test_data.csv')

# 导入到测试环境,观察系统性能表现

📝 总结

从手工造数据到自动生成,我们只需要:

✅ 安装Faker库 — pip install faker

✅ 学会基本用法 — fake.name()fake.email() 等

✅ 写一个生成器类 — 支持多格式输出

✅ 应用到实际项目 — API测试、数据库初始化、自动化测试

核心收获:

  • 再也不用手工造数据了
  • 5分钟生成数千条完全真实的测试数据
  • 支持JSON、CSV、SQL、Excel多种格式
  • 可以轻松扩展,满足各种定制需求

🎤 互动时间

你在测试工作中遇到过哪些数据生成的痛点?用过其他工具吗?

欢迎在留言区分享你的经验! 如果这个工具对你有帮助,也别忘了点个”在看”和转发给身边的测试小伙伴。

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注