接口测试数据太难造?Python + Faker 批量生成测试数据(含数据库写入)
📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
在接口自动化测试过程中,你是否经常遇到这些问题?
每次测试前都要手动在后台创建用户、订单、商品等数据
接口依赖前置数据,但数据缺失导致用例无法执行
多人协作时,测试数据冲突,导致用例执行结果不稳定
生产-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%免费】
更多推荐


所有评论(0)