python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python生成测试数据

使用Python高效生成逼真的测试数据

作者:detayun

这篇文章主要为大家详细介绍了如何使用Python高效生成逼真的测试数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

在软件开发和数据分析的日常工作中,我们经常面临一个头疼的问题:测试数据从哪来?

如果靠手动编造或者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.choicesweights 参数:

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?

进阶技巧:构造“脏数据”与边缘案例

好的测试不仅要有“正常数据”,还要有“异常数据”。

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生成测试数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文