Python案例如何模拟测试数据?

wen python案例 11

本文目录导读:

Python案例如何模拟测试数据?

  1. 使用标准库 random 生成基础数据
  2. 使用 faker 库生成真实感数据(强烈推荐)
  3. 模拟数据库查询结果
  4. 模拟API响应数据
  5. 高级:数据质量保证(自定义规则)
  6. 特殊情况处理
  7. 实战建议

在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
    })

实战建议

  1. 选择合适的工具:简单数据用random,真实感数据用faker,大数据集用pandas
  2. 设置随机种子fake.random.seed(42) 保证数据可复现
  3. 考虑性能:大批量数据生成时使用列表推导式或向量化操作
  4. 保持数据一致性:如生成用户时,性别、年龄、职业等关联字段要合理

建议从faker开始,它几乎能模拟所有常见数据类型,你的测试场景具体是什么?我可以给你更针对性的示例。

抱歉,评论功能暂时关闭!