文章目录
- 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’
- 现实世界中,数据往往不是均匀分布的。比如“省份”字段,河南省的人口概率肯定比海南高。我们可以用 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) # 广东出现的频率会明显高于西藏 缺点:原生模块只能生成“无意义”的随机数。它生成不了像“北京市朝阳区”这样的地址,也生成不了符合校验规则的身份证号。
- 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()}”) # 生成一段随机中文文本
- # 一次性生成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])
- 测试时我们常希望“每次运行生成的数据都一样”,以便复现Bug。 Faker.seed(0) # 设置全局种子 fake1 = Faker(‘zh_CN’) print(fake1.name()) # 每次运行都是同一个名字
- 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 # 天价订单
- 如果需要生成手机号(11位数字): # Faker自带phone_number,但也可以自定义 phone = fake.numerify(‘1##########’) # #代表数字 print(phone) # 13812345678
- malicious_inputs = [ “‘; DROP TABLE users; –“, “admin’ OR ‘1’=’1”, “<script>alert(‘xss’)</script>” ] df[‘malicious_input’] = random.choices(malicious_inputs, k=n)
目录
- 第一板斧:原生random模块 —— 简单场景的快手
- 1. 基础数值与字符串
- 2. 加权随机(模拟真实分布)
- 第二板斧:Faker 库 —— 生成逼真业务数据的神器
- 1. 快速上手
- 2. 批量生成(List Comprehension)
- 3. 进阶:种子(Seed)与唯一性
- 第三板斧:Pandas + Faker —— 大数据量的终极方案
- 实战:生成10000条电商订单数据
- 进阶技巧:构造“脏数据”与边缘案例
- 1. 构造空值和异常值
- 2. 构造特定格式(正则+Faker)
- 3. 构造SQL注入片段(安全测试用)
- 总结:选型指南
在软件开发和数据分析的日常工作中,我们经常面临一个头疼的问题:测试数据从哪来?
- 开发后端接口,需要500个用户数据来测分页?
- 做数据可视化,需要几万条模拟的销售记录?
- 测试支付系统,需要生成合法的信用卡号和身份证号?
- 压力测试,需要构造包含特殊字符、Emoji甚至SQL注入片段的“脏数据”?
如果靠手动编造或者Excel公式拖拽,不仅效率低下,而且数据毫无随机性,很难覆盖边缘Case。今天,我们就来盘点Python生态中生成测试数据的“三板斧”。
对于只需要生成简单数字、随机字符串的场景,Python自带的 random 模块足够用了。
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'
现实世界中,数据往往不是均匀分布的。比如“省份”字段,河南省的人口概率肯定比海南高。我们可以用 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) # 广东出现的频率会明显高于西藏
缺点:原生模块只能生成“无意义”的随机数。它生成不了像“北京市朝阳区”这样的地址,也生成不了符合校验规则的身份证号。
这是Python生态中最著名的测试数据生成库。它能生成姓名、地址、公司、日期、甚至Lorem Ipsum文本,且支持中文!
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()}") # 生成一段随机中文文本
# 一次性生成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])
测试时我们常希望“每次运行生成的数据都一样”,以便复现Bug。
Faker.seed(0) # 设置全局种子
fake1 = Faker('zh_CN')
print(fake1.name()) # 每次运行都是同一个名字
当你需要生成10万+条数据并导出为Excel或CSV时,循环拼接字典会很慢。这时候要请出数据处理之王 Pandas。
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。
好的测试不仅要有“正常数据”,还要有“异常数据”。
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 # 天价订单
如果需要生成手机号(11位数字):
# Faker自带phone_number,但也可以自定义
phone = fake.numerify('1##########') # #代表数字
print(phone) # 13812345678
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生成测试数据内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Python Faker生成测试数据的十种方式详解
- Python使用Streamlit打造高效的测试数据生成器
- Python Faker批量生成测试数据的实现
- Python使用Pandas处理测试数据的方法
- 基于Python利用Faker批量测试数据
- python读取测试数据的多种方式
- python利用faker库批量生成测试数据