今天聊聊比较轻松的话题,使用 Python 中 Faker 及 Mimesis 库生成测试数据。之前有一篇文章 ds+python生成测试数据 有简单介绍过,现在回过头看了一下感觉写的有一点粗糙。而本篇文章想写的稍微细致一点,毕竟在做软件测试时生成测试数据的频率还是蛮高的。
虽然现在生成测试数据就是一句话的事情。比如说在 Trae Solo、ima、AIPY 等等中描述一下需要生成什么样的数据,最终都能生成对应的文件直接下载可用。

如果仔细看一下让 AI 生成测试数据的源码,可以看到基本上都是用的 Faker 这个库(其他语言也有类似 Faker 库)。
所以如果学会了 Faker 这个库好处还是多多的,比如说想写一个测试工具要构造测试数据,那么我们就能用所学的这个库直接插入进去,或者是写一个测试平台同样可以融合进去。如果是了解了大部分用法,那么在使用 AI 的时候提示词也就会写得更加详细,而 AI 反馈的也更加准确。总的来说简单好学,学会受益多多。
先说一下个人观点:
from faker import Fakerfake = Faker('zh_CN') # 指定中文# 基础信息print(fake.name()) # → 王芳print(fake.phone_number()) # → 13912345678print(fake.email()) # → wangfang@example.comprint(fake.address()) # → 上海市浦东新区世纪大道100号print(fake.company()) # → 华联科技有限公司print(fake.job()) # → 软件工程师
from faker import Fakerfake = Faker('zh_CN')# 生成 50 个测试用户,直接写入列表users = []for i in range(50):users.append({'id': i + 1,'name': fake.name(),'phone': fake.phone_number(),'email': fake.email(),'city': fake.city(),'company': fake.company(),})# 看看前 3 个for u in users[:3]:print(u)# 输出:# {'id': 1, 'name': '李明', 'phone': '13912345678', ...}# {'id': 2, 'name': '张丽', 'phone': '15098765432', ...}# {'id': 3, 'name': '赵伟', 'phone': '18611112222', ...}
# 用 .unique 确保不重复(比如注册不能有重复邮箱)fake.unique.email() # 每次调用保证不同fake.unique.name() # 每次调用保证不同# 批量生成 100 个不重复邮箱emails = [fake.unique.email() for _ in range(100)]
# 设定种子 → 每次运行结果一样(方便回归测试)from faker import FakerFaker.seed(12345)fake = Faker('zh_CN')print(fake.name()) # 永远输出同一个名字print(fake.email()) # 永远输出同一个邮箱
方法 | ||
fake.name() | 姓名 | |
fake.phone_number() | 手机号 | 13812345678 |
fake.email() | 邮箱 | wanglin@example.com |
fake.address() | 地址 | 深圳南山… |
fake.company() | 公司名 | 华联科技 |
fake.job() | 职位 | |
fake.city() | 深圳市 | |
fake.date() | 2026/7/09 | |
fake.text() | 段落文本 | |
fake.ssn() | 身份证号 | 11010119900307… |
fake.credit_card_number() | 信用卡号 | 4485… |
fake.ipv4() | IP 地址 | 192.168.1.1 |
fake.user_agent() | 浏览器 UA | Mozilla/5.0… |
👆 以上仅列常用,Faker 官方支持 300+ 种 数据类型
Faker 内置了 Pytest 插件,在测试用例里直接用 faker fixture,不用手动创建实例。
# test_faker_basic.pyimport pytest@pytest.fixture(scope='function')def faker_locale():return ['zh_CN'] # 设置为简体中文@pytest.fixture(scope='function')def faker_seed():# 返回 None 会让 Faker 使用系统随机源,每次生成都不同return Nonedef test_faker_basic(faker, faker_locale, faker_seed):"""测试基本的 faker fixture 用法"""name = faker.name()address = faker.address()email = faker.email()assert isinstance(name, str)assert isinstance(address, str)assert isinstance(email, str)print(f"生成的名字: {name}")print(f"生成的地址: {address}")print(f"生成的邮箱: {email}")def test_faker_unique(faker, faker_locale, faker_seed):"""测试 faker 的 .unique 属性"""first_name = faker.unique.first_name()second_name = faker.unique.first_name()assert first_name != second_nameprint(f"唯一的名字1: {first_name}")print(f"唯一的名字2: {second_name}")

from faker import Fakerfrom faker.providers import BaseProviderclass BugProvider(BaseProvider):"""自定义:生成 Bug 报告数据"""def bug_level(self):return self.random_element(['P1-严重', 'P2-一般', 'P3-轻微'])def bug_module(self):return self.random_element(['搜索模块', '支付模块', '用户中心'])fake = Faker('zh_CN')fake.add_provider(BugProvider)print(fake.bug_level()) # → P1-严重print(fake.bug_module()) # → 支付模块
写自动化测试时,这个比较实用。
⚠️ Python 3.9 用户请注意:Mimesis 最新版要求 Python 3.10+,3.9 请安装
pip install mimesis==11.0.0
from mimesis import Person, Address, Internet, Datetime, Text, Payment, Financefrom mimesis.locales import Localeperson = Person(locale=Locale.ZH)address = Address(locale=Locale.ZH)internet = Internet()dt = Datetime()text = Text(locale=Locale.ZH)payment = Payment()finance = Finance(locale=Locale.ZH)print(f"姓名: {person.full_name()}")print(f"电话: {person.telephone()}")print(f"邮箱: {person.email()}")print(f"职业: {person.occupation()}")print(f"地址: {address.address()}")print(f"城市: {address.city()}")print(f"省份: {address.province()}")print(f"邮编: {address.postal_code()}")print(f"网址: {internet.url()}")print(f"IP地址: {internet.ip_v4()}")print(f"用户代理: {internet.user_agent()}")print(f"日期: {dt.date()}")print(f"时间: {dt.time()}")
from mimesis.locales import Localefrom mimesis import Genericgen = Generic(locale=Locale.ZH)print("=" * 50)print("4️⃣ 速度对比:生成 10 万条数据")print("=" * 50)import time# Mimesisstart = time.time()for _ in range(100000):_ = gen.person.full_name()_ = gen.person.telephone()_ = gen.address.city()mimesis_time = time.time() - start# Faker (zh_CN)from faker import Fakerfake = Faker('zh_CN')start = time.time()for _ in range(100000):_ = fake.name()_ = fake.phone_number()_ = fake.city()faker_time = time.time() - startprint(f" Mimesis 10万条: {mimesis_time:.3f} 秒")print(f" Faker 10万条: {faker_time:.3f} 秒")print(f" 倍率:约 {faker_time / mimesis_time:.1f}x")

| 快 10 倍+ | ||
.unique | ||
| 大批量、性能敏感 |