Python | 如何通过faker批量生成“逼真”的测试数据
我们在项目中,常常需要使用一些假数据来做测试,比如客户名、电话号码、街道地址等等,平时我们基本是键盘一顿乱敲,或者随便造个什么字符串出来。
现在你不用这样做了,用Faker就能满足你的一切需求。
本文将结合实例,讲述Python 如何通过faker第三方库,批量伪造数据。包含两种保存方式:1,存入Excel;2,存入mysql数据库。
本文框架结构为:
1、faker简介
2、faker使用
3、常用方法一览
4、实例:批量生成测试数据
1、faker简介
faker是python的一个第三方库,是一个github上的开源项目。
主要用于测试时伪造数据。
官方文档:https://faker.readthedocs.io/en/master/index.html
2、 faker如何使用
1)安装
Faker库已经被提交到 pip,可以通过 pip 工具直接安装。
1 pip install Faker
2)导入模块
1 from faker import Faker
*主要使用的是Factory类,而导入Faker,会同时导入Factory

3)使用步骤:
·初始化:
1 fake = Faker()
Faker()调用的是Factory的create方法,常用参数选项:

参数 locale:
为生成数据的文化选项(语种),默认为 en_US,只有使用了相关文化,才能生成相对应的随机信息,zh-CN代表使用中国版。
更多国家版本,可以参考:
https://faker.readthedocs.io/en/master/index.html#localization
参数providers:
是一个包含了多种生成随机数据的生成器的“提供者”,比如包含了生成随机姓名的生成器,包含了随机地址的生成器。如果我们想要自己定义随机生成的数据的规则,那么我们需要自定义providers。
如何生成一个providers,可以参考:
https://faker.readthedocs.io/en/master/index.html#how-to-create-a-provider

·调用方法:
利用Faker对象调用方法,调用方法的返回值就是随机的数据。
接下来,我们使用最简单的例子来生成几个假数据试试:
1 from faker import Faker 2 3 fake = Faker(locale='zh_CN') 4 5 print('姓名:', fake.name()) 6 print('地址:', fake.address()) 7 print('电话号码:', fake.phone_number())
解析:
# 1、从faker模块导入Faker这个类。
# 2、实例化,保存到变量fake中。
# 3、调用name()方法随机生成一个名字。
# 4、调用address()方法随机生成地址信息。
# 5、调用phone_number()方法随机生成电话号码。
运行结果如下:
姓名: 杨佳
地址: 陕西省西安市涪城沈路l座 317980
电话号码: 15025821562
3、 常用方法一览
由于主要使用中文数据,所以本文提供常见的方法示例是中文的。
详见官方文档:https://faker.readthedocs.io/en/master/locales/zh_CN.html
地址信息类:
fake.address():完整地址,比如北京市东城区东华门街道p座 100006
fake.street_address():街道+地址,比如兴城路A座
fake.street_name():街道名,比如宜都街
fake.city_name():城市名,比如兰州
fake.city():城市,比如兰州市
fake.province():省份名,比如陕西省
fake.postcode():邮编
fake.country():国家
公司信息类:
fake.company():公司名,比如惠派国际公司信息有限公司
fake.company_suffix():公司名后缀(公司性质),比如网络有限公司
fake.company_prefix():公司名前缀,比如鑫博腾飞
日期类:
fake.date(pattern=”%Y-%m-%d”, end_datetime=None) :随机日期
fake.year():随机年份
fake.day_of_week():随机星期数
fake.time(pattern=”%H:%M:%S”, end_datetime=None):随机时间
网络类:
fake.company_email():企业邮箱
fake.email():邮箱
个人信息类:
fake.name():姓名
fake.last_name(): 姓
fake.first_name(): 名
fake.name_male(): 男性姓名
fake.last_name_male(): 男性姓
fake.first_name_male(): 男性名
fake.name_female(): 女性姓名
fake.user_name(*args, **kwargs):用户名,只是随机的英文姓名组合,一般是6位
fake.password():密码
fake.simple_profile(sex=None):简略个人信息,包括用户名,姓名,性别,地址,邮箱,出生日期。
fake.profile(fields=None, sex=None):详略个人信息,比简略个人信息多出公司名、血型、工作、位置、域名等等信息。
工作职位类:
fake.job():工作
电话号码类:
fake.phone_number ():手机号码
fake.phonenumber_prefix():运营商号段,手机号码前三位
社会安全码(身份证)类:
fake.ssn():身份证号(18位)
银行卡类
fake.credit_card_number(card_type=None) :卡号
fake.credit_card_provider(card_type=None) :卡的提供者
fake.credit_card_security_code(card_type=None) :卡的安全密码
fake.credit_card_expire():卡的有效期
fake.credit_card_full(card_type=None) :完整卡信息
4、实例:批量生成测试数据
1)数据保存到Excel:
实现步骤:
(1)通过openpyxl打开Excel
(2)获取Excel的所有sheet页
(3)通过fake生成数据,写入单元格
(4)保存Excel
代码:
1 from faker import Faker 2 from openpyxl import load_workbook 3 4 # 1、从faker模块导入Faker这个类。 5 # 2、实例化,保存到变量fake中。 6 # 3、调用name()方法随机生成一个名字。 7 # 4、调用address()方法随机生成地址信息。 8 9 10 fake = Faker(locale='zh_CN') 11 12 wb = load_workbook("1.xlsx") 13 14 for sheetName in wb.sheetnames: 15 sheet = wb[sheetName] 16 for rownum in range(2, 100): 17 sheet.cell(row=rownum, column=1).value = fake.name() 18 sheet.cell(row=rownum, column=2).value = fake.address() 19 sheet.cell(row=rownum, column=3).value = fake.phone_number() 20 sheet.cell(row=rownum, column=4).value = fake.ssn(min_age=18, max_age=18) 21 22 wb.save("1.xlsx")
运行结果如下:

2)数据保存到mysql数据库:
实现步骤:
(1)通过pymysql连接数据库
(2)创建数据表
(3)通过fake生成数据,并形成sql语句
(4)通过pymysql执行插入语句
代码:
1 from faker import Faker 2 3 import pymysql 4 5 6 7 conn = pymysql.connect(host="xx.xxx.xxx.xx", port=3306, user="xxx", password="xxx", db="xx", charset="utf8") 8 9 10 11 cursor = conn.cursor() 12 13 # 这里给出表结构,如果使用已存在的表,可以不创建表。 14 15 sql = """ 16 17 create table user( 18 19 id int PRIMARY KEY auto_increment, 20 21 username VARCHAR(20), 22 23 password VARCHAR(20), 24 25 address VARCHAR(35), 26 27 tel VARCHAR(20), 28 29 ssn VARCHAR(20) 30 31 ) 32 33 """ 34 35 cursor.execute(sql) 36 37 38 39 fake = Faker("zh-CN") 40 41 for i in range(20): 42 43 sql = """insert into user(username,password,address,tel,ssn) 44 45 values('%s','%s','%s','%s','%s')""" \ 46 47 % (fake.user_name(), fake.password(special_chars=False), fake.address(), fake.phone_number(), fake.ssn(min_age=18, max_age=88, gender="M")) 48 49 cursor.execute(sql) 50 51 52 53 conn.commit() 54 55 cursor.close() 56 57 conn.close()
运行结果如下:

PS:不知道细心的你,有没有发现地址看起来怪怪的啊。
是的,虽然数据看起来还挺逼真的,但是这并不是真实的地址,而是将省、市、街道之类的随机组合在一起的。
原因在于,address的源代码中,并没有维护它们的对应关系,而且有些市或区县是随便写的。有兴趣的,可以看下源代码,路径参照:
D:\Python\Python37\Lib\site-packages\faker\providers\address\zh_CN

浙公网安备 33010602011771号