使用Python高效生成逼真的测试数据
在软件开发和数据分析的日常工作中,我们经常面临一个头疼的问题:测试数据从哪来?
- 开发后端接口,需要500个用户数据来测分页?
- 做数据可视化,需要几万条模拟的销售记录?
- 测试支付系统,需要生成合法的信用卡号和身份证号?
- 压力测试,需要构造包含特殊字符、Emoji甚至SQL注入片段的“脏数据”?
如果靠手动编造或者Excel公式拖拽,不仅效率低下,而且数据毫无随机性,很难覆盖边缘Case。今天,我们就来盘点Python生态中生成测试数据的“三板斧”。
第一板斧:原生random模块 —— 简单场景的快手
对于只需要生成简单数字、随机字符串的场景,Python自带的 random 模块足够用了。
1. 基础数值与字符串
import random import string # 1. 随机整数/浮点数 print(random.randint(1, 100)) # 1-100随机整数 print(random.uniform(1.0, 10.0)) # 1.0-10.0随机浮点数 # 2. 随机选择 choices = ['Apple', 'Banana', 'Orange'] print(random.choice(choices)) # 随机选一个水果 # 3. 生成随机字符串(指定长度) # 生成10位由字母和数字组成的随机密码 rand_str = ''.join(random.choices(string.ascii_letters + string.digits, k=10)) print(rand_str) # 输出类似: 'aB3x9ZkL2p'
2. 加权随机(模拟真实分布)
现实世界中,数据往往不是均匀分布的。比如“省份”字段,河南省的人口概率肯定比海南高。我们可以用 random.choices 的 weights 参数:
provinces = ['广东', '山东', '河南', '四川', '西藏'] weights = [0.15, 0.10, 0.09, 0.08, 0.01] # 概率权重 # 生成10个样本 result = random.choices(provinces, weights=weights, k=10) print(result) # 广东出现的频率会明显高于西藏
缺点:原生模块只能生成“无意义”的随机数。它生成不了像“北京市朝阳区”这样的地址,也生成不了符合校验规则的身份证号。
第二板斧:Faker 库 —— 生成逼真业务数据的神器
这是Python生态中最著名的测试数据生成库。它能生成姓名、地址、公司、日期、甚至Lorem Ipsum文本,且支持中文!
1. 快速上手
pip install faker
from faker import Faker
# 初始化中文环境
fake = Faker('zh_CN')
# 生成单条数据
print(f"姓名: {fake.name()}") # 张伟
print(f"地址: {fake.address()}") # 四川省成都市锦江区
print(f"公司: {fake.company()}") # 某某科技有限公司
print(f"邮箱: {fake.email()}") # wei.zhang@example.com
print(f"日期: {fake.date_of_birth()}") # 1985-04-12
print(f"段落: {fake.text()}") # 生成一段随机中文文本
2. 批量生成(List Comprehension)
# 一次性生成100个用户
users = [
{
'id': i,
'name': fake.name(),
'email': fake.email(),
'address': fake.address(),
'created_at': fake.date_time_this_year()
}
for i in range(100)
]
# 查看第一个用户
print(users[0])
3. 进阶:种子(Seed)与唯一性
测试时我们常希望“每次运行生成的数据都一样”,以便复现Bug。
Faker.seed(0) # 设置全局种子
fake1 = Faker('zh_CN')
print(fake1.name()) # 每次运行都是同一个名字
第三板斧:Pandas + Faker —— 大数据量的终极方案
当你需要生成10万+条数据并导出为Excel或CSV时,循环拼接字典会很慢。这时候要请出数据处理之王 Pandas。
实战:生成10000条电商订单数据
import pandas as pd
from faker import Faker
import random
fake = Faker('zh_CN')
# 定义数据量
n = 10000
# 使用Pandas直接生成列数据(比循环快得多)
data = {
'order_id': range(1, n + 1),
'user_name': [fake.name() for _ in range(n)],
'product_name': [fake.word().capitalize() + random.choice(['手机', '电脑', '耳机', '键盘']) for _ in range(n)],
'price': [round(random.uniform(9.9, 9999.9), 2) for _ in range(n)],
'status': random.choices(['已支付', '待发货', '已完成', '已取消'], weights=[0.6, 0.2, 0.15, 0.05], k=n),
'created_at': [fake.date_time_between(start_date='-30d', end_date='now') for _ in range(n)]
}
# 创建DataFrame
df = pd.DataFrame(data)
# 数据清洗与加工(Pandas强项)
# 1. 计算总价(假设随机数量1-3件)
df['quantity'] = [random.randint(1, 3) for _ in range(n)]
df['total_amount'] = (df['price'] * df['quantity']).round(2)
# 2. 构造关联字段(例如:根据状态决定是否有物流单号)
import numpy as np
df['tracking_number'] = np.where(
df['status'] == '已发货',
['SF' + str(random.randint(100000, 999999)) for _ in range(n)],
None
)
# 预览数据
print(df.head())
# 导出到文件
df.to_csv('mock_orders.csv', index=False, encoding='utf-8-sig')
df.to_excel('mock_orders.xlsx', index=False)
print(f"\n成功生成 {len(df)} 条数据!")
为什么用Pandas?
- 速度快:向量化操作比Python原生循环快几个数量级。
- 易分析:生成完可以直接做统计(
df.describe())、分组、画图。 - 格式全:一键导出CSV、Excel、SQL、JSON。
进阶技巧:构造“脏数据”与边缘案例
好的测试不仅要有“正常数据”,还要有“异常数据”。
1. 构造空值和异常值
import numpy as np # 在Pandas中插入空值 df.loc[random.sample(range(n), 50), 'user_name'] = np.nan # 50个空姓名 # 插入极端值 df.loc[0, 'price'] = -1000 # 负价格(测试系统容错) df.loc[1, 'price'] = 999999 # 天价订单
2. 构造特定格式(正则+Faker)
如果需要生成手机号(11位数字):
# Faker自带phone_number,但也可以自定义
phone = fake.numerify('1##########') # #代表数字
print(phone) # 13812345678
3. 构造SQL注入片段(安全测试用)
malicious_inputs = [
"'; DROP TABLE users; --",
"admin' OR '1'='1",
"<script>alert('xss')</script>"
]
df['malicious_input'] = random.choices(malicious_inputs, k=n)
总结:选型指南
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 简单脚本/算法题 | random + string | 无需安装第三方库,轻量 |
| Web开发/接口测试 | Faker | 数据逼真,支持多国语言,覆盖常见业务字段 |
| 大数据分析/报表 | Pandas + Faker | 性能强,便于后续处理和导出Excel/CSV |
| 数据库压测 | Pandas + SQLAlchemy | 可直接将DataFrame写入数据库 |
| 特殊格式/协议 | 自定义函数 + re | 灵活度最高,可生成正则匹配的特定字符串 |
最后提醒:生成的测试数据仅用于开发和测试环境,严禁用于生产环境或涉及真实用户的隐私场景。另外,利用Faker生成的身份证号虽然符合校验规则,但在法律上是无效的,请勿用于实名认证!
到此这篇关于使用Python高效生成逼真的测试数据的文章就介绍到这了,更多相关Python生成测试数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Django使用StreamingHttpResponse实现流式响应的实现示例
本文主要介绍了使用Django的StreamingHttpResponse类实现流式响应,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2025-12-12
Python Django 添加首页尾页上一页下一页代码实例
这篇文章主要介绍了Python Django 添加首页尾页上一页下一页代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-08-08
PyCharm 2020.2.2 x64 下载并安装的详细教程
这篇文章主要介绍了PyCharm 2020.2.2 x64 下载并安装的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-10-10
解决pycharm运行程序出现卡住scanning files to index索引的问题
今天小编就为大家分享一篇解决pycharm运行程序出现卡住scanning files to index索引的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2019-06-06


最新评论