手工造数据的痛点,你一定懂
做接口测试、数据库测试或者性能测试的时候,最烦人的事之一就是——造数据。
比如你要测试一个注册接口,需要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 |
| URL | fake.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多种格式
- 可以轻松扩展,满足各种定制需求
🎤 互动时间
你在测试工作中遇到过哪些数据生成的痛点?用过其他工具吗?
欢迎在留言区分享你的经验! 如果这个工具对你有帮助,也别忘了点个”在看”和转发给身边的测试小伙伴。