本文目录导读:

在Python中模拟测试数据是一个非常常见的需求,这里我为你整理了几种常用且实用的方法:
使用标准库 random 生成基础数据
import random
import string
# 生成随机整数
age = random.randint(18, 60) # 18-60岁之间
# 生成随机浮点数
price = round(random.uniform(10.0, 1000.0), 2) # 10-1000元,保留两位小数
# 生成随机字符串
name_length = random.randint(2, 8)
name = ''.join(random.choices(string.ascii_letters, k=name_length))
# 生成随机布尔值
is_active = random.choice([True, False])
# 生成随机手机号
phone = '1' + random.choice(['3','5','7','8','9']) + ''.join(random.choices(string.digits, k=9))
print(f"姓名: {name}, 年龄: {age}, 价格: {price}, 手机: {phone}, 活跃: {is_active}")
使用 faker 库生成真实感数据(强烈推荐)
首先安装:
pip install faker
from faker import Faker
# 初始化中文数据生成器
fake = Faker('zh_CN') # 支持 'en_US', 'ja_JP' 等
# 生成各种常见数据
def generate_user():
return {
'name': fake.name(), # 姓名
'phone': fake.phone_number(), # 手机号
'email': fake.email(), # 邮箱
'address': fake.address(), # 地址
'company': fake.company(), # 公司名
'job': fake.job(), # 职位
'ssn': fake.ssn(), # 身份证号
'credit_card': fake.credit_card_number(), # 信用卡号
'bank_account': fake.iban(), # 银行账号
'text': fake.text(max_nb_chars=200), # 文章内容
'date': fake.date_between(start_date='-1y', end_date='today'), # 日期
'time': fake.time(), # 时间
'ipv4': fake.ipv4_private(), # 内网IP
'url': fake.url(), # 网址
'color': fake.hex_color(), # 颜色
'boolean': fake.boolean(chance_of_getting_true=50), # 布尔值
}
# 批量生成100个用户
users = [generate_user() for _ in range(100)]
# 也可以使用更简洁的方式
fake.random.seed(0) # 设置随机种子,保证可复现性
for _ in range(5):
print(f"{fake.name()}: {fake.phone_number()}")
模拟数据库查询结果
import pandas as pd
from faker import Faker
fake = Faker('zh_CN')
def generate_orders(n=100):
"""模拟订单数据"""
orders = []
for _ in range(n):
order = {
'order_id': fake.uuid4(), # 订单ID
'user_id': fake.random_int(1000, 9999), # 用户ID
'product_name': fake.word(), # 商品名
'price': round(random.uniform(10, 1000), 2), # 价格
'quantity': random.randint(1, 10), # 数量
'total': 0, # 先占位
'create_time': fake.date_time_between(start_date='-30d', end_date='now'),
'status': random.choice(['pending', 'paid', 'shipped', 'completed', 'cancelled'])
}
order['total'] = round(order['price'] * order['quantity'], 2)
orders.append(order)
# 转为DataFrame
df = pd.DataFrame(orders)
return df
# 生成订单数据
orders_df = generate_orders(200)
print(orders_df.head())
模拟API响应数据
from faker import Faker
import json
fake = Faker()
def generate_api_response():
"""模拟API返回的JSON数据"""
response = {
'code': 200,
'message': 'success',
'data': {
'total': random.randint(100, 1000),
'pages': random.randint(1, 50),
'items': [
{
'id': i,
'name': fake.name(),
'email': fake.email(),
'age': random.randint(18, 65),
'city': fake.city(),
'created_at': fake.iso8601()
}
for i in range(1, 15) # 每页15条
]
}
}
return json.dumps(response, ensure_ascii=False, indent=2)
# 模拟分页请求
def simulate_paginated_api(total_pages=5):
for page in range(1, total_pages + 1):
print(f"--- 第{page}页数据 ---")
# 模拟请求延迟
# time.sleep(0.1)
data = generate_api_response()
print(f"响应数据(截取): {json.loads(data)['data']['items'][:2]}...")
高级:数据质量保证(自定义规则)
class DataSimulator:
"""带业务规则的数据模拟器"""
def __init__(self, locale='zh_CN'):
self.fake = Faker(locale)
def generate_employee(self):
"""模拟员工数据,带业务规则"""
# 年龄范围限制
age = self.fake.random_int(20, 55)
# 工作经验不能超过年龄-18
experience = min(age - 18, self.fake.random_int(0, 40))
# 工资与年龄和经验相关
base_salary = 3000
salary = base_salary + age * 100 + experience * 500
return {
'employee_id': f'E{self.fake.random_int(1000, 9999)}',
'name': self.fake.name(),
'age': age,
'experience': experience,
'department': self.fake.random_element(
['技术部', '市场部', '财务部', '人事部', '销售部']
),
'salary': round(salary, -2), # 向下取整到百元
'email': f"{self.fake.user_name()}@company.com",
'phone': self.fake.phone_number(),
'join_date': self.fake.date_between(start_date='-5y', end_date='today')
}
# 使用示例
sim = DataSimulator()
for _ in range(3):
emp = sim.generate_employee()
print(f"{emp['name']}, {emp['age']}岁, 工龄{emp['experience']}年, "
f"部门: {emp['department']}, 工资: {emp['salary']}")
特殊情况处理
# 模拟异常数据(测试边界)
def generate_edge_cases():
"""生成边界情况数据"""
cases = {
'empty_string': '',
'none_value': None,
'max_integer': 2**31 - 1,
'min_integer': -2**31,
'long_text': fake.text(max_nb_chars=10000), # 超长文本
'special_chars': '@#$%^&*()_+{}:"<>?', # 特殊字符
'sql_injection': "'; DROP TABLE users; --", # SQL注入尝试
'html_content': '<script>alert("XSS")</script>' # XSS尝试
}
return cases
# 模拟时间序列数据
def generate_time_series(start_date='2024-01-01', days=30):
"""生成时间序列数据"""
dates = pd.date_range(start=start_date, periods=days, freq='D')
# 模拟趋势 + 周期性 + 噪声
trend = np.linspace(0, 10, days)
seasonal = 5 * np.sin(np.linspace(0, 4*np.pi, days))
noise = np.random.normal(0, 1, days)
data = trend + seasonal + noise
return pd.DataFrame({
'date': dates,
'value': data
})
实战建议
- 选择合适的工具:简单数据用
random,真实感数据用faker,大数据集用pandas - 设置随机种子:
fake.random.seed(42)保证数据可复现 - 考虑性能:大批量数据生成时使用列表推导式或向量化操作
- 保持数据一致性:如生成用户时,性别、年龄、职业等关联字段要合理
建议从faker开始,它几乎能模拟所有常见数据类型,你的测试场景具体是什么?我可以给你更针对性的示例。