当前位置:首页>python>别再手动造数据了!Python 两个库搞定假数据,Faker + Mimesis 实测对比

别再手动造数据了!Python 两个库搞定假数据,Faker + Mimesis 实测对比

  • 2026-10-11 06:24:19
别再手动造数据了!Python 两个库搞定假数据,Faker + Mimesis 实测对比

今天聊聊比较轻松的话题,使用 Python 中 Faker 及 Mimesis 库生成测试数据。之前有一篇文章 ds+python生成测试数据 有简单介绍过,现在回过头看了一下感觉写的有一点粗糙。而本篇文章想写的稍微细致一点,毕竟在做软件测试时生成测试数据的频率还是蛮高的。

虽然现在生成测试数据就是一句话的事情。比如说在 Trae Solo、ima、AIPY 等等中描述一下需要生成什么样的数据,最终都能生成对应的文件直接下载可用。

如果仔细看一下让 AI 生成测试数据的源码,可以看到基本上都是用的 Faker 这个库(其他语言也有类似 Faker 库)。

所以如果学会了 Faker 这个库好处还是多多的,比如说想写一个测试工具要构造测试数据,那么我们就能用所学的这个库直接插入进去,或者是写一个测试平台同样可以融合进去。如果是了解了大部分用法,那么在使用 AI 的时候提示词也就会写得更加详细,而 AI 反馈的也更加准确。总的来说简单好学,学会受益多多。


先说一下个人观点:

  1. 固定表头,数据变化
    可以用之前那篇文章讲的方案,生成一个测试小工具。
  2. 临时紧急,大量低频
    直接用 AI 生成测试数据文件。
  3. 高频使用,表头不固定
    建议直接用 Python 脚本生成,包括写测试平台、自动化测试。

一、Faker 库 — 最受欢迎的假数据之王

1. 生成中文数据

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())           # → 软件工程师

2. 批量生成测试数据

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', ...}

3. 保证数据唯一

# 用 .unique 确保不重复(比如注册不能有重复邮箱)fake.unique.email()  # 每次调用保证不同fake.unique.name()   # 每次调用保证不同# 批量生成 100 个不重复邮箱emails = [fake.unique.email() for _ in range(100)]

4. 固定种子,数据可复现

# 设定种子 → 每次运行结果一样(方便回归测试)from faker import FakerFaker.seed(12345)fake = Faker('zh_CN')print(fake.name())   # 永远输出同一个名字print(fake.email())  # 永远输出同一个邮箱

5. Faker 常用数据类型一览

方法

生成内容
中文示例

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+ 种 数据类型

6. Faker + Pytest:测试人黄金搭档

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_name    print(f"唯一的名字1: {first_name}")    print(f"唯一的名字2: {second_name}")

7. 自定义 Provider — 想造啥就造啥

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())  # → 支付模块

写自动化测试时,这个比较实用。


二、Mimesis 库 — 比 Faker 快 10 倍的性能怪兽

⚠️ Python 3.9 用户请注意:Mimesis 最新版要求 Python 3.10+,3.9 请安装 pip install mimesis==11.0.0

1. 简单用法

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()}")

2. 生成 10 万条数据速度对比

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")

三、Faker vs Mimesis:选谁?

对比项
Faker
Mimesis
⭐ GitHub Stars
1700+
4200+
🌍 支持语言
30+ 种
47 种
🚄 生成速度
较慢
快 10 倍+
🧩 数据类型
300+ 种
丰富,分类更细
📝 API 设计
单一对象,统一调用
分类对象,更结构化
✅ 唯一数据
内置 .unique
需自行处理
🧪 Pytest 集成
内置插件 ✅
无 ✖️
🎯 适用场景
日常测试、小批量数据
大批量、性能敏感

总结

  • 🥇 Faker — 最全面、最成熟,日常测试首选
  • 🥈 Mimesis — 性能之王,大批量数据场景必备
  • 🥉 自定义 Provider — 适配你的业务,想造啥造啥

最新文章

随机文章