本文目录导读:

在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开始,它几乎能模拟所有常见数据类型,你的测试场景具体是什么?我可以给你更针对性的示例。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播