📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


在接口自动化测试过程中,你是否经常遇到这些问题?

每次测试前都要手动在后台创建用户、订单、商品等数据

接口依赖前置数据,但数据缺失导致用例无法执行

多人协作时,测试数据冲突,导致用例执行结果不稳定

生产-like 环境缺乏足够数据,无法进行性能或边界测试

归根结底,测试数据准备效率低,已成为自动化落地的瓶颈之一。‍​

今天,我们通过 Python + Faker + 数据库操作,实现:

支持批量生成真实姓名、手机号、地址、邮箱等数据

自动生成符合业务规则的结构化数据

自动写入数据库,绕过接口直接造数

支持自定义规则和字段扩展

让你的接口测试,不再“等数据”、“抢数据”、“造数据”。‍

为什么不能依赖接口创建测试数据?

虽然通过调用注册、创建类接口可以生成数据,但存在明显问题:

而直接操作数据库造数,优势明显:

速度快,可批量生成上千条数据

状态可控,字段精确设置

不依赖接口,即使接口未开发完成也能测试

可与清理脚本配合,实现“用前造数,用后清空”**

核心工具:Faker 库详解

Faker 是一个用于生成伪造数据的 Python 库,支持多种语言和数据类型。‍

核心工具:Faker 库详解

Faker 是一个用于生成伪造数据的 Python 库,支持多种语言和数据类型。

安装 Faker

pip install faker‍

​常用数据类型示例

from faker import Faker
fake = Faker('zh_CN')  # 中文环境
print(fake.name())           # 张伟
print(fake.phone_number())   # 13812345678
print(fake.email())          # zhangwei@example.com
print(fake.address())        # 北京市朝阳区建国路88号
print(fake.date_of_birth())  # 1990-05-20
print(fake.job())            # 软件工程师

你也可以生成结构化数据:​​​​​​​

user = {
    "username": fake.user_name(),
    "password": "Test@123",
    "real_name": fake.name(),
    "phone": fake.phone_number(),
    "email": fake.email(),
    "address": fake.address(),
    "created_at": fake.date_this_year()
}‍

实战:批量生成用户数据并写入数据库

场景说明

为接口测试准备 100 个已激活用户,数据写入 MySQL 数据库的 users 表。

第一步:定义数据库模型

假设用户表结构如下:​​​​​​​

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(100) NOT NULL,
    real_name VARCHAR(50),
    phone VARCHAR(20),
    email VARCHAR(100),
    address TEXT,
    status TINYINT DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

第二步:数据库连接配置

创建 config.py:

# config.py
DB_CONFIG = {
    'host': 'localhost',
    'port': 3306,
    'user': 'test_user',
    'password': 'test_pass',
    'database': 'test_db',
    'charset': 'utf8mb4'
}

第三步:数据生成与写入脚本

创建 data_generator.py:

# data_generator.py​​​​​​​

import pymysql
from faker import Faker
from config import DB_CONFIG
import random
class TestDataGenerator:
    def __init__(self):
        self.fake = Faker('zh_CN')
        self.connection = None
    def connect_db(self):
        """建立数据库连接"""
        try:
            self.connection = pymysql.connect(**DB_CONFIG)
            print("✅ 数据库连接成功")
        except Exception as e:
            print(f"❌ 数据库连接失败: {e}")
            raise
    def generate_user(self):
        """生成单个用户数据"""
        return {
            "username": self.fake.user_name() + str(random.randint(100, 999)),
            "password": "Test@123",
            "real_name": self.fake.name(),
            "phone": self.fake.phone_number(),
            "email": self.fake.email(),
            "address": self.fake.address(),
            "status": random.choice([1, 2]),  # 1: 正常, 2: 禁用
        }
    def insert_users(self, count=100):
        """批量插入用户数据"""
        if not self.connection:
            self.connect_db()
        with self.connection.cursor() as cursor:
            sql = """
            INSERT INTO users 
            (username, password, real_name, phone, email, address, status) 
            VALUES (%(username)s, %(password)s, %(real_name)s, %(phone)s, %(email)s, %(address)s, %(status)s)
            """
            users = [self.generate_user() for _ in range(count)]
            try:
                cursor.executemany(sql, users)
                self.connection.commit()
                print(f"✅ 成功插入 {cursor.rowcount} 条用户数据")
            except Exception as e:
                self.connection.rollback()
                print(f"❌ 数据插入失败: {e}")
                raise
    def close(self):
        """关闭数据库连接"""
        if self.connection:
            self.connection.close()
# 使用示例
if __name__ == "__main__":
    generator = TestDataGenerator()
    try:
        generator.insert_users(count=100)
    finally:
        generator.close()‍

高级用法:支持自定义规则

1. 生成特定格式数据​​​​​​​

def generate_order_no(self):
    """生成订单号:前缀 + 日期 + 随机数"""
    return f"ORD{self.fake.date_object().strftime('%Y%m%d')}{random.randint(1000, 9999)}"

2. 关联数据生成(如用户-订单)

def generate_order(self, user_id):
    return {
        "user_id": user_id,
        "order_no": self.generate_order_no(),
        "amount": round(random.uniform(10, 1000), 2),
        "status": random.choice([1, 2, 3]),
        "created_at": self.fake.date_time_this_month()
    }

3. 从文件读取规则

支持通过 YAML/JSON 配置生成规则,实现配置化造数。‍​

与自动化框架集成

方案一:作为 fixture 使用

# conftest.py

import pytest
from data_generator import TestDataGenerator
@pytest.fixture(scope="session")
def setup_test_users():
    generator = TestDataGenerator()
    generator.insert_users(50)
    yield
    # 可在此添加清理逻辑
    generator.close()

方案二:命令行工具

python data_generator.py --table users --count 200 --env test‍

安全与最佳实践

禁止在生产环境运行造数脚本

通过配置隔离,确保脚本无法连接生产数据库。

敏感信息加密

数据库密码使用环境变量或加密配置。

数据清理机制

提供配套的清理脚本,测试完成后删除测试数据。

日志记录

记录生成的数据量、耗时、关键字段,便于追溯。

支持回滚

使用事务或记录主键,便于后续删除。‍

适用场景

​​

结语

测试数据不应成为自动化测试的瓶颈。通过 Python + Faker + 数据库操作,我们可以:

实现测试数据的快速、批量、可控生成

提升自动化用例的独立性和可重复性

减少对人工和上游系统的依赖

从今天开始,告别“手动造数”的低效模式,用代码驱动数据,让自动化测试真正“跑起来”。‍

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​​

​​

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐